certificate - rfc 5280 español
OpenSSL versión V3 con nombre alternativo de sujeto (7)
¿Qué comando usó para hacer la solicitud de certificado CSR? ¿Qué comando usaste para hacer el archivo de certificado? Diferentes respuestas para diferentes circunstancias que conoces.
Tal vez no estas poniendo
subjectAltName = correo electrónico: copiar
en la sección
[v3_req]
Tal vez esté utilizando openssl x509 para generar el certificado, si es así debe usar
-archivo de extensión /etc/pki/tls/openssl.cnf
porque sin eso no usa tu archivo de configuración
También podría necesitar
-extensiones v3_req
interruptor de línea de comando
Estoy usando la herramienta de línea de comandos OpenSSL para generar un certificado autofirmado. Parece estar funcionando correctamente, excepto por dos problemas. No puedo crear un .cer con un Nombre alternativo del sujeto (crítico) y no he podido averiguar cómo crear un certificado que sea la Versión 3 (no estoy seguro de si esto es crítico todavía, pero preferiría aprender) cómo configurar la versión).
¿Alguien ha hecho esto exitosamente? El archivo de configuración predeterminado (.cfg) tiene una documentación aparentemente clara (ver a continuación):
"Esto es para subjectAltName y issuerAltname. Importe la dirección de correo electrónico. SubjectAltName = email: copy"
Sin embargo esto no funciona. Mi corazonada es que el nombre alternativo del sujeto no aparece b / c, no está presente en las especificaciones de V1, por lo que también estoy intentando establecer la versión.
Aquí está el archivo de configuración que estoy usando:
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
emailAddress = [email protected]
req_extensions = v3_req
x509_extensions = v3_ca
[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US
C_min = 2
C_max = 2
O = [Press Enter to Continue]
O_default = default
0.OU=[Press Enter to Continue]
0.OU_default = default
1.OU=[Press Enter to Continue]
1.OU_default = PKI
2.OU=[Press Enter to Continue]
2.OU_default = ABCD
commonName = Public FQDN of server
commonName_max = 64
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName = email:[email protected]
issuerAltName = issuer:copy
Acabo de desarrollar una herramienta basada en la web que generará este comando automáticamente en función de la entrada del formulario y mostrará la salida. http://kernelmanic.com/certificate-request-generator-with-multiple-common-names-and-subject-alternative-names/
Aquí están los sencillos pasos para usted.
Al generar la CSR, debe usar -config y -extensiones y al generar el certificado, debe usar -extfile y -extensions
Aquí está el ejemplo
openssl req -new -nodes -keyout test.key -out test.csr -days 3650 -subj "/C=US/ST=SCA/L=SCA/O=Oracle/OU=Java/CN=test cert" -config /etc/pki/tls/openssl.cnf -extensions v3_req
openssl x509 -req -days 3650 -in test.csr -CA cacert.pem -CAkey rootCA.key -CAcreateserial -out test.pem -extfile /etc/pki/tls/openssl.cnf -extensions v3_req
espero que esto ayude
Conseguí que funcionara con la siguiente versión (emailAddress se colocó incorrectamente):
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
req_extensions = v3_req
x509_extensions = v3_ca
[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US
C_min = 2
C_max = 2
O = [Press Enter to Continue]
O_default = default
0.OU=[Press Enter to Continue]
0.OU_default = default
1.OU=[Press Enter to Continue]
1.OU_default = PKI
2.OU=[Press Enter to Continue]
2.OU_default = ABCD
commonName = Public FQDN of server
commonName_max = 64
emailAddress = [Press Enter to Continue]
emailAddress_default = [email protected]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName = email:[email protected]
issuerAltName = issuer:copy
Notas:
Para generar el certificado que utilicé:
openssl req -config req.cnf -new -nodes -out req.pem -x509
- No he visto mucho uso para
issuerAltname
(si es así, me gustaría saber dónde). - Usar el
issuer:always
se recomienda paraauthorityKeyIdentifier
. - Usando el
email:copy
ahora funciona consubjectAltName
. -
v3_req
secciónv3_req
es superflua (así como la líneareq_extensions
.
Muy bien, ninguna de las otras respuestas en esta página funcionó para mí, e intenté cada una de ellas. Lo que funcionó para mí fue un pequeño truco:
Al solicitar el certificado:
-config ''<(cat /etc/ssl/openssl.cnf <(printf "[SAN]/nsubjectAltName=DNS:$SERVER"))''
-reqexts SAN
y al firmar el certificado:
-extfile ''<(cat /etc/ssl/openssl.cnf <(printf "[SAN]/nsubjectAltName=DNS:$SERVER"))''
-extensions SAN
Así que no hay confusión, aquí hay un script de trabajo que cubre todo desde el principio, incluida la creación de una autoridad de certificación:
# if the server name is undefined, lets default to ''Some-Server''
SERVER="${SERVER:-Some-Server}"
CORPORATION=My-Corp
GROUP=My-Corporate-Group
CITY=City
STATE=State
COUNTRY=US
CERT_AUTH_PASS=`openssl rand -base64 32`
echo $CERT_AUTH_PASS > cert_auth_password
CERT_AUTH_PASS=`cat cert_auth_password`
# create the certificate authority
openssl /
req /
-subj "/CN=$SERVER.ca/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" /
-new /
-x509 /
-passout pass:$CERT_AUTH_PASS /
-keyout ca-cert.key /
-out ca-cert.crt /
-days 36500
# create client private key (used to decrypt the cert we get from the CA)
openssl genrsa -out $SERVER.key
# create the CSR(Certitificate Signing Request)
openssl /
req /
-new /
-nodes /
-subj "/CN=$SERVER/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" /
-sha256 /
-extensions v3_req /
-reqexts SAN /
-key $SERVER.key /
-out $SERVER.csr /
-config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]/nsubjectAltName=DNS:$SERVER")) /
-days 36500
# sign the certificate with the certificate authority
openssl /
x509 /
-req /
-days 36500 /
-in $SERVER.csr /
-CA ca-cert.crt /
-CAkey ca-cert.key /
-CAcreateserial /
-out $SERVER.crt /
-extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]/nsubjectAltName=DNS:$SERVER")) /
-extensions SAN /
-passin pass:$CERT_AUTH_PASS
Luego podemos verificar que el nombre Alternativo del Asunto esté en el certificado final:
openssl x509 -in Some-Server.crt -text -noout
La sección pertinente es:
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:Some-Server
Así funcionó! Este es un certificado que será aceptado por todos los navegadores principales (incluido Chrome), siempre y cuando instale la autoridad de certificación en el navegador. Eso es ca-cert.crt que necesitará instalar.
Aquí hay una configuración de ejemplo para ngnx que le permitiría usar el certificado:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost:443;
ssl_certificate /etc/ssl/certs/Some-Server.crt;
ssl_certificate_key /etc/ssl/private/Some-Server.key;
ssl_dhparam /etc/ssl/certs/https-dhparam.pem;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
Sé que este hilo es un poco viejo, pero en caso de que funcione para cualquiera en Windows, verifique que el archivo esté codificado en UTF-8; en mi caso, recibí un error que indicaba que había un error con el archivo .cnf, así lo abrió en Notepad ++ configuró la codificación del archivo en UTF-8, guardó y ejecutó el comando openssl de nuevo e hizo el truco.
Se requiere v3_req
con la entrada subjectAltName
en el archivo de configuración. El comando
openssl x509 ... -extfile openssl.cnf -extensions v3_req
insertará la SAN en el certificado.