Ci sono molte grandi risposte che forniscono esempi di come farlo funzionare, ma nessuna che spiega dove le cose sono andate male nel tuo tentativo. OpenSSL può essere piuttosto non intuitivo alcune volte, quindi vale la pena passarci attraverso.
Innanzitutto, per impostazione predefinita, OpenSSL ignora qualsiasi valore di nome distinto fornito nella configurazione. Se vuoi usarli devi aggiungere prompt = no
alla tua configurazione. Inoltre, il comando come scritto genera solo una richiesta di certificato e
non un certificato stesso, quindi il -days
comando non fa nulla.
Se si genera la richiesta di certificato utilizzando questo comando fornito e si controlla il risultato, è presente il Nome alternativo oggetto:
$ 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
...
Ma se si genera il certificato utilizzando il comando nel collegamento heroku e si controlla il risultato, manca il nome alternativo dell'oggetto:
$ 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
...
Il motivo è che per impostazione predefinita OpenSSL non copia le estensioni dalla richiesta al certificato. Normalmente, il certificato viene creato / firmato da un'autorità di certificazione sulla base di una richiesta di un cliente e alcune estensioni potrebbero concedere al certificato più potenza di quella che la CA intendeva se si fidassero ciecamente delle estensioni definite nella richiesta.
Ci sono modi per dire a OpenSSL di copiare le estensioni, ma IMHO è più lavoro che fornire le estensioni in un file di configurazione quando si genera il certificato.
Se si dovesse tentare di utilizzare il file di configurazione esistente, non funzionerà perché la sezione di livello superiore è contrassegnata, [req]
pertanto tali impostazioni si applicano solo al comando req e non al comando x509. Non è necessario avere un marcatore di sezione di livello superiore, quindi puoi semplicemente rimuovere quella prima riga e quindi funzionerà bene sia per generare richieste che per certificati.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
In alternativa, è possibile utilizzare l' -x509
argomento per il req
comando per generare un certificato autofirmato in un singolo comando, anziché creare prima una richiesta e quindi un certificato. In questo caso non è necessario rimuovere la
[req]
linea di sezione, poiché quella sezione viene letta e utilizzata dal comando req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Per ricapitolare, ecco il file di configurazione modificato utilizzato nei comandi sopra:
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')