Existem várias ótimas respostas que dão exemplos de como fazer isso funcionar, mas nenhuma que explica onde as coisas deram errado em sua tentativa. O OpenSSL pode ser bastante intuitivo algumas vezes, por isso vale a pena percorrer.
Primeiro, como um aparte, o OpenSSL usa como padrão ignorar qualquer valor de nome distinto fornecido na configuração. Se você quiser usá-los, você deve adicionar prompt = no
à sua configuração. Além disso, o comando conforme escrito gera apenas uma solicitação de certificado,
não um certificado em si, portanto, o -days
comando não faz nada.
Se você gerar sua solicitação de certificado usando este comando, você forneceu e inspecionou o resultado, o Nome Alt do Assunto 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
...
Mas se você gerar o certificado usando o comando no link heroku e inspecionar o resultado, o Nome Alt do Assunto estará ausente:
$ 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
...
O motivo é que, por padrão, o OpenSSL não copia extensões da solicitação para o certificado. Normalmente, o certificado seria criado / assinado por uma CA com base em uma solicitação de um cliente, e algumas extensões poderiam conceder ao certificado mais poder do que a CA pretendia, caso confiassem cegamente nas extensões definidas na solicitação.
Existem maneiras de dizer ao OpenSSL para copiar as extensões, mas IMHO é mais trabalhoso do que apenas fornecer as extensões em um arquivo de configuração quando você gera o certificado.
Se você tentar usar seu arquivo de configuração existente, ele não funcionará porque a seção de nível superior está marcada [req]
para que essas configurações se apliquem apenas ao comando req e não ao comando x509. Não é necessário ter um marcador de seção de nível superior; portanto, você pode simplesmente remover a primeira linha e, em seguida, funcionará bem para gerar solicitações ou certificado.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Como alternativa, você pode usar o -x509
argumento do req
comando para gerar um certificado autoassinado em um único comando, em vez de primeiro criar uma solicitação e depois um certificado. Nesse caso, não é necessário remover a
[req]
linha de seção, pois essa seção é lida e usada pelo comando req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Para recapitular, aqui está o arquivo de configuração modificado usado nos comandos acima:
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')