Il y a plusieurs bonnes réponses qui donnent des exemples de comment faire fonctionner cela, mais aucune qui n'explique où les choses ont mal tourné dans votre tentative. OpenSSL peut être assez déroutant parfois, il vaut donc la peine de marcher à travers.
Tout d'abord, en passant, OpenSSL ignore par défaut toutes les valeurs de noms distingués que vous fournissez dans la configuration. Si vous souhaitez les utiliser, vous devez ajouter prompt = no
à votre configuration. De plus, la commande telle que écrite génère uniquement une demande de certificat et non un certificat lui-même, donc la commande -days
ne sert à rien.
Si vous générez votre demande de certificat en utilisant la commande que vous avez donnée et inspectez le résultat, le Subject Alt Name est présent :
$ 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
...
Mais si vous générez le certificat en utilisant la commande dans le lien heroku et inspectez le résultat, le Subject Alt Name est manquant :
$ 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 raison en est qu'OpenSSL, par défaut, ne copie pas les extensions de la demande dans le certificat. Normalement, le certificat serait créé/signé par une CA en fonction d'une demande d'un client, et certaines extensions pourraient accorder au certificat plus de pouvoir que la CA n'avait l'intention, si elle devait faire aveuglément confiance aux extensions définies dans la demande.
Il existe des moyens de dire à OpenSSL de copier les extensions, mais à mon avis il est plus laborieux que de simplement fournir les extensions dans un fichier de configuration lors de la génération du certificat.
Si vous essayez d'utiliser votre fichier de configuration existant, cela ne fonctionnera pas car la section de niveau supérieur est marquée [req]
donc ces paramètres s'appliquent uniquement à la commande req et non à la commande x509. Il n'est pas nécessaire d'avoir un marqueur de section de niveau supérieur, vous pouvez juste supprimer cette première ligne, et alors cela fonctionnera très bien pour générer des demandes ou des certificats.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Alternativement, vous pouvez utiliser l'argument -x509
pour la commande req
pour générer un certificat auto-signé en une seule commande, au lieu de d'abord créer une demande puis un certificat. Dans ce cas, il n'est pas nécessaire de supprimer la ligne de section [req]
, car cette section est lue et utilisée par la commande req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Pour récapituler, voici le fichier de configuration modifié utilisé dans les commandes ci-dessus :
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
0 votes
Pertinent : (
Information Security Stack Exchange
) Pourquoi une extension v3 est-elle nécessaire pour qu'un certificat X.509 puisse être utilisé pour tester le HTTPS en local ?