มีคำตอบที่ดีมากมายที่ให้ตัวอย่างของวิธีการทำงานนี้ แต่ไม่มีใครอธิบายว่าสิ่งใดที่ผิดพลาดในความพยายามของคุณ OpenSSL นั้นค่อนข้างใช้งานไม่ได้ในบางครั้งดังนั้นจึงควรค่าแก่การเดินผ่าน
ก่อนอื่น OpenSSL จะใช้ค่าเริ่มต้นเพื่อข้ามค่าชื่อที่แตกต่างที่คุณระบุในการกำหนดค่า หากคุณต้องการใช้คุณต้องเพิ่มprompt = no
การกำหนดค่าของคุณ นอกจากนี้คำสั่งที่เขียนจะสร้างการร้องขอใบรับรอง
ไม่ใช่ใบรับรองเองดังนั้น-days
คำสั่งจะไม่ทำอะไรเลย
หากคุณสร้างคำขอใบรับรองโดยใช้คำสั่งนี้คุณให้และตรวจสอบผลลัพธ์ชื่อ Alt ของหัวเรื่องจะปรากฏขึ้น:
$ 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 ของหัวเรื่องจะหายไป:
$ 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 จะไม่คัดลอกส่วนขยายจากคำขอไปยังใบรับรอง โดยปกติแล้วใบรับรองจะถูกสร้าง / เซ็นชื่อโดย CA ตามคำขอจากลูกค้าและส่วนขยายบางอย่างสามารถให้ใบรับรองพลังงานมากกว่า CA นั้นตั้งใจหากพวกเขาเชื่อถือส่วนขยายที่กำหนดไว้ในคำขอโดยไม่ตั้งใจ
มีวิธีที่จะบอก 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')