Подписание сертификата с моим центром сертификации
При запуске:
openssl ca -in ${ALIAS}.csr -out user-cert.pem -keyfile cacert-private.pem -cert cacert.pem -passin pass:$PASSWD -config ${CONFIG}
Я получаю:
Поле StateOrProvinceName должно быть одинаковым в Сертификат CA (Глостершир) и запрос (Глостершир)
Я читал ошибку несколько раз, и я уверен, что поле имеет одинаковое значение в каждом случае. Я нашел ссылки на похожие проблемы, вызванные разными кодировками, но я не знаю, как я должен указывать, что и где.
Это ${ALIAS}.csr:
-----BEGIN NEW CERTIFICATE REQUEST-----
MIICxzCCAa8CAQAwgYExCzAJBgNVBAYTAkdCMRgwFgYDVQQIEw9HbG91Y2VzdGVyc2hpcmUxEzAR
BgNVBAcTCkNoZWx0ZW5oYW0xHzAdBgNVBAoTFldhbnNkeWtlIEhvdXNlIExpbWl0ZWQxDjAMBgNV
BAsTBUZpemlvMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDWvivt1JHiuaNeadOQJtxynQ4sSAR/peWgKd8g9UQgNM+H9QW4NlRE81+g63BdRqZT5YMm
J4K3upovQNlDRklevslgEYoTdQM4yBKV676Q4XDbM7Vk+rt04sqL5IgdsAUXODfMJvu81t3tOjFc
OGO7S+B+LEJ1+8qshLbuK2gBigfgcZtlbNgW6fCGik8ZsrKWl8W+NFbw1seS01INAipwCBasxaaj
/lINwWQVbQIG09+vEdwuHmmq5VIKlJqFcYNUTFBVojoJLfzyStZR2PfFUxp7R+t2YmVj6a48B7NA
lODnIlQDkAprECNMpCZoSP1QjrZgW1BgaVbT5OaWlVsPAgMBAAGgADANBgkqhkiG9w0BAQUFAAOC
AQEAvalFyJOgzmd1jcFlS5YoqiNgX1bm9nZ0/cFgj6cGL7R0Gqc9wu5QPakWRxa9c2UcI0m7p1lp
cygDvQTY23LEBhVcruymIGQG5DhDpXHeaBCbV3OWO6xowAjh+riQjvTNeVSXtP3jUNs5DaId0z+A
GXeb7dR96jhyj+soNYENoQseQLqLdAW4p0jdK1BraMJTc0ber0FBx1nOUXOEoTIJL9kL9cUWaCp3
7uYkonIPtVCCfS8KcgXxUsNMC41q/SkKDVB23PeCjnWgcyXxnSpx8n+AK7fwMgh+4TcZ5usmVujR
MNqk84hZpw8h1FIcmqRaWtaPWyv3EX8JH5LTnDe3eQ==
-----END NEW CERTIFICATE REQUEST-----
И cacert.pem:
-----BEGIN CERTIFICATE-----
MIIDQDCCAqmgAwIBAgIJAPj9mvMDl1K/MA0GCSqGSIb3DQEBBQUAMIG4MQswCQYD
VQQGEwJHQjEYMBYGA1UECAwPR2xvdWNlc3RlcnNoaXJlMRMwEQYDVQQHDApDaGVs
dGVuaGFtMR8wHQYDVQQKDBZXYW5zZHlrZSBIb3VzZSBMaW1pdGVkMQ4wDAYDVQQL
DAVGaXppbzESMBAGA1UEAwwJbG9jYWxob3N0MTUwMwYJKoZIhvcNAQkBFiZyaWNo
YXJkLm1pZHdpbnRlckB3YW5zZHlrZS1ob3VzZS5jby51azAeFw0xMTA4MDcyMTU4
NDBaFw0yMTA4MDQyMTU4NDBaMIG4MQswCQYDVQQGEwJHQjEYMBYGA1UECAwPR2xv
dWNlc3RlcnNoaXJlMRMwEQYDVQQHDApDaGVsdGVuaGFtMR8wHQYDVQQKDBZXYW5z
ZHlrZSBIb3VzZSBMaW1pdGVkMQ4wDAYDVQQLDAVGaXppbzESMBAGA1UEAwwJbG9j
YWxob3N0MTUwMwYJKoZIhvcNAQkBFiZyaWNoYXJkLm1pZHdpbnRlckB3YW5zZHlr
ZS1ob3VzZS5jby51azCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA03Y4hYdd
at3e3AB98s+E5wlxrvRL8RhJtRac0Jt0gXQy12ZYziFm3gryx0IG02srXluM+V3/
BPRRCLsnEnltfoi/fE0wM9MT0V1Ao9EXQ5t1E2rOzdoXUUdvovd6qvwG2L/DHCdL
kKjhokVR9TkFW/AWctBdWkb9qfFFTpDY4i0CAwEAAaNQME4wHQYDVR0OBBYEFHbG
d3+Lzax90slk65y1BYDgZ897MB8GA1UdIwQYMBaAFHbGd3+Lzax90slk65y1BYDg
Z897MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEArZ2yfTGJK3R+jRwP
FjaonDy1NVOt9tgjHfyh9YNQfyFSC7R987wFPcyydEqh8xg/Lb3WGwseDuzCBusw
jmVIqiUYBClHzkF3jG1766ltdlVVTOavVQgQMRBGMvpHVxcMH2RUNUyWH0XW+DH2
/uuRRpu4vX5sfEW75uEfORB9Mrg=
-----END CERTIFICATE-----
Любые идеи? Спасибо заранее.
Ответы
Ответ 1
Я также столкнулся с этой проблемой. Благодаря ответам выше (главным образом Франсуа) я обнаружил источник проблемы.
openssl - это кодирование с использованием UTF8STRING, а keytool (Java 6) кодируется с помощью PRINTABLESTRING.
Работала вокруг него, изменяя конфигурацию openssl, чтобы она соответствовала keytool. В /usr/ssl/openssl.cnf измените параметр "string_mask" на "pkix".
Ответ 2
Вы также можете установить атрибуты как необязательные:
# For the CA policy
[policy_match]
countryName= optional
stateOrProvinceName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
Ответ 3
Предыдущие плакаты уже ответили на вопрос, но чтобы это стало проще, вот пример, как указать кодировку. Используйте string_mask:
[ req ]
default_bits = 2048
default_md = rsa
prompt = no
string_mask = utf8only # <--------------
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
countryName = GB
stateOrProvinceName = Gloucestershire
localityName = Cheltenham
organizationName = Wansdyke House Limited
organizationalUnitName = Fizio
commonName = localhost
Ответ 4
Как показано на рисунке:
openssl asn1parse -in req.csr
строки DN запроса кодируются как PRINTABLESTRING.
openssl asn1parse -in cacert.pem
показывает, что строки CA DN кодируются как UTF8STRING.
Для быстрого грязного взлома я предлагаю вам изменить кодировку строк в вашем запросе, заменив тип кодировки для PRINTABLESTRING (0x13) типом UTF8STRING (0x0c), используя ваш любимый шестнадцатеричный редактор.
Вам нужно будет преобразовать ваш запрос в DER, прежде чем высунуть его.
Смещение байтов для изменения можно найти с помощью:
openssl asn1parse -in csr |grep PRINTABLESTRING |awk -F":" '{print $1}'
Затем попытайтесь снова подписать.
Ответ 5
Содействие комментарий mbrownnyc в ответ, поскольку он был полезен для меня и заслуживает большего внимания.
Я считаю, что /usr/ssl/openssl.cnf
содержит политику под названием policy_anything
, которая содержит указанную выше настройку. Вы можете использовать его, используя аргумент policy
следующим образом:
openssl ca -policy policy_anything -days 365 -out /root/ca/certs/out.pem -in certreq.csr
Ответ 6
Я столкнулся с этой проблемой. Коренной причиной является несоответствие между значениями string_mask в клиенте и CA openssl.cnf. Легкое исправление заключается в том, чтобы изменить значение клиента в соответствии с ожидаемым ЦС, а затем восстановить CSR. Жесткое исправление - отредактировать значение ЦС и запустить новый CA.