有几个很棒的答案给出了如何使它工作的示例,但没有一个可以解释您尝试中哪里出了问题。OpenSSL在某些时候可能非常不直观,因此值得一遍。
首先,顺便说一句,OpenSSL默认会忽略您在配置中提供的任何可分辨的名称值。如果要使用它们,则必须将其添加prompt = no
到配置中。另外,编写的命令仅生成证书
请求,而不生成证书本身,因此该-days
命令不执行任何操作。
如果使用给出的此命令生成证书请求并检查结果,则将显示“主题替代名称”:
$ 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链接中的命令生成证书并检查结果,则缺少主题替代名称:
$ 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复制扩展,但是恕我直言,这比在生成证书时仅在配置文件中提供扩展要复杂得多。
如果要尝试使用现有的配置文件,则该文件将不起作用,因为已标记了顶层部分,[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')