【问题标题】:Subject Alternative Name not present in certificate证书中不存在主题备用名称
【发布时间】:2015-09-07 17:54:14
【问题描述】:

我已生成包含字段主题替代名称的 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 名称才能包含在内?

【问题讨论】:

标签: ssl openssl ssl-certificate


【解决方案1】:

对于不喜欢编辑系统范围内的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 Boot 微服务为特色的示例项目:https://github.com/jonashackt/spring-boot-rest-clientcertificates-docker-compose

【讨论】:

  • 我不明白为什么这与我尝试的其他 20 件事相比有效,但确实有效.. 谢谢。
  • 非常感谢...这应该是公认的答案 b/c 它不需要系统范围内的更改(因此可以编写脚本)
  • 这是我唯一可以为我工作的事情。即使按照接受的答案中的建议更改系统 .cnf 文件也不起作用。我做了一个小改动来使它高度便携。我完全摆脱了[alt_names] 部分,并用subjectAltName = $ENV::SAN 替换了subjectAltName = @alt_names。使用它,您可以通过分配 SAN 环境变量来指定任何主题替代名称。
  • 这让我更进一步。在构建看起来像的 CA 时,您仍然必须将 -config 与 req 命令一起使用。
  • 此答案中提供的 github 链接有一个示例,但它不使用 CA 对 csr 进行签名(除非我忽略了某些内容)。
【解决方案2】:

你可以使用:

copy_extensions = copy 

openssl.cnf 中的CA_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?

【讨论】:

  • @jimmy - 小心copy_extensions = copy。您需要验证每个签名请求。一个坏人可以设置CA = TRUE,你会给他一个下属CA。
  • @jww 好建议。我将不得不考虑这一点。
  • 那为什么没有可以将要复制的扩展名列入白名单的功能呢? :(
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-01-18
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2021-08-13
    相关资源
    最近更新 更多