Il y a plusieurs bonnes réponses qui donnent des exemples sur la façon de faire fonctionner cela, mais aucune qui n'explique où les choses se sont mal passées lors de votre tentative. OpenSSL peut être assez non intuitif à certains moments, il vaut donc la peine de s'y intéresser.
Tout d’abord, OpenSSL ignore, par défaut, les valeurs de nom distinctif fournies dans la configuration. Si vous voulez les utiliser, vous devez ajouter prompt = no
à votre configuration. De plus, la commande telle qu’elle est écrite ne génère qu’une demande de certificat,
pas un certificat lui-même; elle -days
ne fait donc rien.
Si vous générez votre demande de certificat à l'aide de la commande que vous avez donnée et inspectez le résultat, le nom d'objet alternatif 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 ensuite, si vous générez le certificat à l'aide de la commande heroku link et examinez le résultat, le nom alt du sujet 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 que par défaut, OpenSSL ne copie pas les extensions de la demande vers le certificat. Normalement, le certificat serait créé / signé par une autorité de certification à la demande d'un client, et certaines extensions pourraient accorder au certificat plus de puissance que l'intention de l'autorité de certification si elles devaient faire confiance aux extensions définies dans la demande.
Il existe des moyens de demander à OpenSSL de copier les extensions, mais à mon humble avis, cela représente plus de travail que de simplement fournir les extensions dans un fichier de configuration lorsque vous générez le 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 de [req]
sorte que 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 donc simplement supprimer cette première ligne, et cela fonctionnera correctement pour la génération de requêtes ou le certificat.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Vous pouvez également utiliser l' -x509
argument de la req
commande pour générer un certificat auto-signé en une seule commande, plutôt que de créer d'abord une demande, puis un certificat. Dans ce cas, il n'est pas nécessaire de supprimer la
[req]
ligne de section 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
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')