Hay varias respuestas excelentes que dan ejemplos de cómo hacer que esto funcione, pero ninguna que explique dónde fallaron las cosas en su intento. OpenSSL puede ser bastante no intuitivo algunas veces, por lo que vale la pena recorrerlo.
Primero, aparte, OpenSSL por defecto ignora cualquier valor de nombre distinguido que proporcione en la configuración. Si desea usarlos, debe agregarlos prompt = no
a su configuración. Además, el comando tal como está escrito solo genera una solicitud de certificado,
no un certificado en sí mismo, por lo que el -days
comando no hace nada.
Si genera su solicitud de certificado con este comando que dio e inspeccionó el resultado, el Nombre alternativo del sujeto está presente:
$ openssl req -new -key server.key -out server.csr -config config.cnf -sha256
$ openssl req -text -noout -in server.csr
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
DNS:dev.mycompany.com
Signature Algorithm: sha256WithRSAEncryption
...
Pero luego, si genera el certificado utilizando el comando en el enlace heroku e inspecciona el resultado, falta el nombre alternativo del sujeto:
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl x509 -text -noout -in server.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
89:fd:75:26:43:08:04:61
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Validity
Not Before: Jan 21 04:27:21 2018 GMT
Not After : Jan 21 04:27:21 2019 GMT
Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
...
La razón es que, por defecto, OpenSSL no copia extensiones de la solicitud al certificado. Normalmente, el certificado sería creado / firmado por una CA en base a una solicitud de un cliente, y algunas extensiones podrían otorgarle al certificado más poder del que la CA tenía la intención de confiar ciegamente en las extensiones definidas en la solicitud.
Hay formas de decirle a OpenSSL que copie las extensiones, pero en mi humilde opinión, es más trabajo que simplemente proporcionar las extensiones en un archivo de configuración cuando genera el certificado.
Si intentara usar su archivo de configuración existente, no funcionará porque la sección de nivel superior está marcada, [req]
por lo que esa configuración solo se aplica al comando req, no al comando x509. No es necesario tener un marcador de sección de nivel superior, por lo que puede eliminar esa primera línea y luego funcionará bien tanto para generar solicitudes como para certificados.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Alternativamente, puede usar el -x509
argumento del req
comando para generar un certificado autofirmado en un solo comando, en lugar de crear primero una solicitud y luego un certificado. En este caso, no es necesario eliminar la
[req]
línea de sección, ya que esa sección es leída y utilizada por el comando req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Para recapitular, aquí está el archivo de configuración modificado utilizado en los comandos anteriores:
default_bits = 2048
distinguished_name = dn
x509_extensions = san
req_extensions = san
extensions = san
prompt = no
[ dn ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')