Є кілька чудових відповідей, які наводять приклади, як це зробити, але жоден, що пояснює, де все пішло не так у вашій спробі. OpenSSL може бути досить інтуїтивно зрозумілим, тому варто пройтись.
По-перше, як сторону, OpenSSL за замовчуванням ігнорує будь-які виділені значення імен, які ви надаєте в конфігурації. Якщо ви хочете їх використовувати, ви повинні додати їх prompt = no
у конфігурацію. Крім того, написана команда створює лише
запит на сертифікат, а не сам сертифікат, тому -days
команда нічого не робить.
Якщо ви генеруєте свій запит на сертифікат за допомогою цієї команди, яку ви дали та перевіряєте результат, ім'я Alt Subject присутнє:
$ 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 та перевіряєте результат, ім'я Alt Subject відсутнє:
$ 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')