certificate - read - Firmar un certificado con mi CA
read certificate openssl (6)
Acabo de encontrarme con este problema. La causa raíz es una discrepancia entre los valores de string_mask en el cliente y la openssl.cnf de la CA. La solución fácil es modificar el valor del cliente para que coincida con lo que espera la CA, y luego volver a generar el CSR. La solución más difícil es editar el valor de la CA e iniciar una CA nueva.
En funcionamiento:
openssl ca -in ${ALIAS}.csr -out user-cert.pem -keyfile cacert-private.pem -cert cacert.pem -passin pass:$PASSWD -config ${CONFIG}
Yo obtengo:
El campo stateOrProvinceName debía ser el mismo en el certificado de CA (Gloucestershire) y en la solicitud (Gloucestershire)
He leído el error varias veces y estoy bastante seguro de que el campo tiene el mismo valor en cada caso. He encontrado referencias a problemas similares causados por diferentes codificaciones, pero no sé cómo debería especificar eso y dónde.
Este es el $ {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-----
Y 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-----
¿Algunas ideas? Gracias por adelantado.
Como se muestra :
openssl asn1parse -in req.csr
las cadenas de DN de solicitud se codifican como PRINTABLESTRING.
openssl asn1parse -in cacert.pem
muestra que las cadenas de CA DN están codificadas como UTF8STRING.
Para un truco rápido, te sugiero que cambies la codificación de las cadenas en tu solicitud reemplazando el tipo de codificación de PRINTABLESTRING (0x13) por el tipo de UTF8STRING (0x0c), usando tu editor hexadecimal favorito.
Tendrá que convertir su solicitud en DER antes de pincharla.
El desplazamiento de los bytes a cambiar se puede encontrar con:
openssl asn1parse -in csr |grep PRINTABLESTRING |awk -F":" ''{print $1}''
Entonces trata de firmar de nuevo.
Los carteles anteriores ya respondieron a la pregunta, pero para hacerlo más fácil, aquí hay un ejemplo de cómo especificar la codificación. Usa la 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
También me he encontrado con este problema. Gracias a las respuestas anteriores (principalmente a François), descubrí la fuente del problema.
openssl está codificando con UTF8STRING y keytool (Java 6) está codificando con PRINTABLESTRING.
Se resolvió cambiando la configuración de openssl para que coincida con keytool. En /usr/ssl/openssl.cnf, cambie la configuración "string_mask" a "pkix".
También puede establecer los atributos como opcionales:
# For the CA policy
[policy_match]
countryName= optional
stateOrProvinceName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
Promover el comentario de mbrownnyc a una respuesta, ya que me fue útil y merece más atención.
Creo que /usr/ssl/openssl.cnf
contiene una política llamada policy_anything
que contiene la configuración anterior. Puede usarlo utilizando el argumento de la policy
siguiente manera:
openssl ca -policy policy_anything -days 365 -out /root/ca/certs/out.pem -in certreq.csr