有几个很棒的答案给出了如何使它工作的示例,但没有一个可以解释您尝试中哪里出了问题。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')