Есть несколько хороших ответов, которые дают примеры того, как заставить это работать, но ни один из них не объясняет, где что-то пошло не так в вашей попытке. OpenSSL может быть довольно не интуитивным иногда, так что стоит пройтись.
Во-первых, кроме этого, OpenSSL по умолчанию игнорирует любые значения отличительных имен, которые вы указываете в конфигурации. Если вы хотите использовать их, вы должны добавить prompt = no
в свой конфиг. Кроме того, записанная команда генерирует только запрос сертификата, а
не сам сертификат, поэтому -days
команда ничего не делает.
Если вы сгенерируете запрос сертификата с помощью этой команды и проверите результат, Subject Alt Name будет присутствовать:
$ 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
...
Но затем, если вы сгенерируете сертификат с помощью команды в ссылке heroku и проверите результат, Subt Alt Name будет отсутствовать:
$ 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
...
Причина в том, что по умолчанию OpenSSL не копирует расширения из запроса в сертификат. Обычно сертификат создается / подписывается ЦС на основе запроса от клиента, и некоторые расширения могут предоставить сертификату больше мощности, чем предполагал ЦС, если они будут слепо доверять расширениям, определенным в запросе.
Есть способы сказать OpenSSL, что нужно копировать расширения, но IMHO, это больше, чем просто предоставление расширений в файле конфигурации при создании сертификата.
Если вы попытаетесь использовать существующий файл конфигурации, он не будет работать, поскольку раздел верхнего уровня помечен, [req]
поэтому эти параметры применяются только к команде req, а не к команде x509. Нет необходимости иметь маркер раздела верхнего уровня, так что вы можете просто удалить эту первую строку, и тогда она будет хорошо работать как для генерации запросов, так и для сертификата.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Кроме того, вы можете использовать -x509
аргумент req
команды для создания самозаверяющего сертификата в одной команде, а не сначала создавать запрос, а затем сертификат. В этом случае нет необходимости удалять
[req]
строку раздела, так как этот раздел читается и используется командой req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Напомним, что здесь есть модифицированный файл конфигурации, используемый в приведенных выше командах:
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')