Ada beberapa jawaban hebat yang memberikan contoh cara agar ini berfungsi, tetapi tidak ada yang menjelaskan di mana ada yang salah dalam upaya Anda. OpenSSL dapat menjadi sangat tidak intuitif beberapa kali sehingga layak untuk dilalui.
Pertama, sebagai tambahan, OpenSSL default untuk mengabaikan nilai-nilai nama berbeda apa pun yang Anda berikan dalam konfigurasi. Jika Anda ingin menggunakannya, Anda harus menambahkan prompt = no
ke konfigurasi Anda. Selain itu, perintah yang ditulis hanya menghasilkan permintaan sertifikat,
bukan sertifikat itu sendiri, sehingga -days
perintah tidak melakukan apa-apa.
Jika Anda membuat permintaan sertifikat menggunakan perintah yang Anda berikan dan memeriksa hasilnya, Nama Alt Subjek ada:
$ 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
...
Tetapi jika Anda membuat sertifikat menggunakan perintah di tautan heroku dan memeriksa hasilnya, Nama Alt Subjek tidak ada:
$ 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
...
Alasannya adalah bahwa secara default OpenSSL tidak menyalin ekstensi dari permintaan ke sertifikat. Biasanya, sertifikat akan dibuat / ditandatangani oleh CA berdasarkan permintaan dari pelanggan, dan beberapa ekstensi dapat memberikan sertifikat lebih banyak kekuatan daripada yang dimaksudkan CA jika mereka mempercayai secara membuta ekstensi yang ditentukan dalam permintaan.
Ada cara untuk memberi tahu OpenSSL untuk menyalin ekstensi, tetapi IMHO itu lebih berfungsi daripada hanya memberikan ekstensi dalam file konfigurasi ketika Anda menghasilkan sertifikat.
Jika Anda mencoba menggunakan file konfigurasi yang ada, itu tidak akan berfungsi karena bagian tingkat atas ditandai [req]
sehingga pengaturan itu hanya berlaku untuk perintah req, bukan perintah x509. Tidak perlu memiliki penanda bagian tingkat atas, jadi Anda bisa menghapus baris pertama itu, dan kemudian akan berfungsi dengan baik untuk menghasilkan permintaan atau sertifikat.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Sebagai alternatif, Anda dapat menggunakan -x509
argumen ke req
perintah untuk menghasilkan sertifikat yang ditandatangani sendiri dalam satu perintah, daripada terlebih dahulu membuat permintaan dan kemudian sertifikat. Dalam hal ini tidak perlu untuk menghapus
[req]
baris bagian, karena bagian itu dibaca dan digunakan oleh perintah req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Untuk rekap, berikut adalah file konfigurasi yang dimodifikasi yang digunakan dalam perintah di atas:
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')