Existem várias respostas excelentes que dão exemplos de como fazer isso funcionar
mas nenhum que explique onde as coisas deram errado em sua tentativa. O OpenSSL pode ser
bastante não-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
você fornece na configuração. Se você quiser usá-los, você deve adicionar prompt = no
para sua configuração. Além disso, o comando conforme escrito gera apenas um certificado
pedido não é um certificado, por isso o comando -days
não faz nada.
Se você gerar sua solicitação de certificado usando este comando, você deu e inspecionou
o resultado, o assunto Alt Name 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
inspecione o resultado, o Assunto Alt Name está faltando:
$ 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 um CA
com base em uma solicitação de um cliente, e algumas extensões podem conceder
certificado mais poder do que a CA estava pretendendo se eles confiassem cegamente
as extensões definidas na solicitação.
Existem maneiras de dizer ao OpenSSL para copiar as extensões, mas o IMHO é mais
trabalho do que apenas fornecer as extensões em um arquivo de configuração quando você gerar o
certificado.
Se você tentasse usar seu arquivo de configuração existente, ele não funcionaria porque
a seção de nível superior está marcada com [req]
, então essas configurações se aplicam 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, basta remover essa primeira linha e, em seguida, funcionará bem para as solicitações de geração ou para o 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 argumento -x509
para o comando req
para gerar
um certificado autoassinado em um único comando, em vez de criar primeiro um
pedido e, em seguida, um certificado. Neste caso, não é necessário remover o
[req]
linha de seção, como 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