Có một số câu trả lời tuyệt vời đưa ra ví dụ về cách làm cho điều này hoạt động, nhưng không có câu trả lời nào giải thích được sự cố xảy ra trong nỗ lực của bạn. OpenSSL có thể khá không trực quan một số lần vì vậy nó đáng để đi qua.
Đầu tiên, như một bên, OpenSSL mặc định bỏ qua mọi giá trị tên phân biệt mà bạn cung cấp trong cấu hình. Nếu bạn muốn sử dụng chúng, bạn phải thêm prompt = no
vào cấu hình của bạn. Ngoài ra, lệnh như được viết chỉ tạo ra một yêu cầu chứng chỉ
chứ không phải chính chứng chỉ, vì vậy -days
lệnh không làm gì cả.
Nếu bạn tạo yêu cầu chứng chỉ của mình bằng lệnh này, bạn đã đưa ra và kiểm tra kết quả, Tên Alt chủ đề sẽ xuất hiện:
$ 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
...
Nhưng sau đó nếu bạn tạo chứng chỉ bằng lệnh trong liên kết heroku và kiểm tra kết quả, Tên Alt của chủ đề bị thiếu:
$ 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
...
Lý do là theo mặc định OpenSSL không sao chép các phần mở rộng từ yêu cầu sang chứng chỉ. Thông thường, chứng chỉ sẽ được tạo / ký bởi CA dựa trên yêu cầu từ khách hàng và một số tiện ích mở rộng có thể cấp cho chứng chỉ nhiều quyền lực hơn CA dự định nếu họ tin tưởng một cách mù quáng vào các tiện ích mở rộng được xác định trong yêu cầu.
Có nhiều cách để yêu cầu OpenSSL sao chép các phần mở rộng, nhưng IMHO nó hoạt động nhiều hơn là chỉ cung cấp các phần mở rộng trong tệp cấu hình khi bạn tạo chứng chỉ.
Nếu bạn đã cố gắng sử dụng tệp cấu hình hiện tại của mình, nó sẽ không hoạt động vì phần cấp cao nhất được đánh dấu [req]
để các cài đặt đó chỉ áp dụng cho lệnh req chứ không phải lệnh x509. Không cần thiết phải có điểm đánh dấu phần cấp cao nhất, vì vậy bạn chỉ cần xóa dòng đầu tiên đó và sau đó nó sẽ hoạt động tốt cho cả việc tạo yêu cầu hoặc chứng chỉ.
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
Thay phiên, bạn có thể sử dụng -x509
đối số cho req
lệnh để tạo chứng chỉ tự ký trong một lệnh, thay vì trước tiên tạo yêu cầu và sau đó là chứng chỉ. Trong trường hợp này, không cần thiết phải loại bỏ
[req]
dòng phần, vì phần đó được đọc và sử dụng bởi lệnh req.
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
Tóm lại, đây là tập tin cấu hình đã sửa đổi được sử dụng trong các lệnh trên:
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')