证书中不存在主题备用名称

Subject Alternative Name not present in certificate

我生成了包含字段主题替代名称的 CSR:

openssl req -out mycsr.pem -new -key mykey.pem -days 365

当我检查它时,它看起来像预期的那样存在一个新字段:

X509v3 Subject Alternative Name:
    DNS: my.alt.dns

然而,当我使用它来签署证书时,由于某种原因该字段被省略了。

我使用以下命令生成它:

openssl ca -out mycert.pem -infiles mycsr.pem

我的 CA 证书是否必须包含相同的 Alt 名称才能包含在内?

您可以使用:

copy_extensions = copy 

openssl.cnfCA_default 部分下。

但只有当您确定可以信任 CSR 中的扩展时,如该线程中指出的那样:http://openssl.6102.n7.nabble.com/subjectAltName-removed-from-CSR-when-signing-td26928.html

另请参阅:How can I generate a self-signed certificate with SubjectAltName using OpenSSL?

对于不喜欢在系统范围内编辑 openssl.conf 的每个人,有一个本地 openssl CLI 选项用于将 SAN 从 .csr 添加到 .crt .您只需使用 openssl 的 -extfile-extensions CLI 参数。

这是一个例子:

openssl x509 -req -days 3650 -in alice.csr -signkey aliceprivate.key -out alice.crt -extfile alice-csr.conf -extensions v3_req

这需要一个 alice-csr.conf 文件,它看起来像这样(填写您适当的数据)并且用于通过命令 openssl req -new -key aliceprivate.key -out alice.csr -config alice-csr.conf 生成 .csr:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
C = DE
ST = Thuringia
L = Erfurt
O = Alice Corp
OU = Team Foo
CN = server-alice

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = server-alice
DNS.2 = localhost

请记住,-extensions v3_req 选项对应于文件 alice-csr.conf 中的 [v3_req] 部分,您可以在其中定义主题备用名称,也就是您想要将您的证书颁发给。

由于我一直欣赏完全可以理解的示例,其中可以重现每个步骤,因此我创建了一个示例项目,其中包含 Spring 引导微服务:https://github.com/jonashackt/spring-boot-rest-clientcertificates-docker-compose

这里很好地描述了使用替代名称签署 CSR:https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html#creating-certificates-valid-for-multiple-hostnames

简而言之,您创建了一个仅包含替代名称的 something.ext 文件:

subjectAltName = DNS:*.my.alt.dns, DNS:my.alt.dns

然后在openssl x509 -req ...命令中引用此文件:-extfile something.ext。请注意,它是在签署 CSR 时发生的,而不是在准备 CSR 时发生的。