我已生成包含字段主题替代名称的 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 名称才能包含在内?
对于不喜欢编辑系统范围
openssl.conf
的每个人来说,有一个本机 openssl CLI 选项,用于将 SAN 从 .crt
添加到 .csr
。您所需要使用的只是 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 文件,它看起来像这样(填写适当的数据),用于使用命令
.csr
生成 openssl req -new -key aliceprivate.key -out alice.csr -config alice-csr.conf
:
[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
选项对应于文件[v3_req]
中的alice-csr.conf
部分,您可以在其中定义您想要向其颁发证书的主题备用名称(也称为域)。
由于我一直欣赏完全理解的示例,可以重现每一步,因此我创建了一个具有 Spring Boot 微服务的示例项目:https://github.com/jonashackt/spring-boot-rest-clientcertificates-docker-compose
您可以使用:
copy_extensions = copy
在
CA_default
的 openssl.cnf
部分下。
但只有当您确定可以信任 CSR 中的扩展时,如本线程中指出的: http://openssl.6102.n7.nabble.com/subjectAltName-removed-from-CSR-when-signing -td26928.html
使用替代名称签署 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 时发生的。
另一种不涉及任何配置文件的方法是将
-copy_extensions copyall
参数添加到 openssl x509 -req ...
命令中。