如何将主题替代名称添加到 ssl 证书?

Posted

技术标签:

【中文标题】如何将主题替代名称添加到 ssl 证书?【英文标题】:How to add subject alernative name to ssl certs? 【发布时间】:2012-02-03 09:38:24 【问题描述】:

我正在使用 openssl 创建自签名证书。我生成的证书出现此错误:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException:没有主题替代名称 现在

有谁知道在创建证书时如何指定“主题替代名称”? 这就是我生成密钥库的方式:

sudo $JAVA_HOME/bin/keytool -genkey -dname "CN=192.168.x.xxx, OU=I, O=I, L=T, ST=On, C=CA" -alias tomcat -validity 3650 -keyalg RSA -keystore /root/.keystore -keypass abcd -storepass abcd

要生成密钥:

 openssl s_client -connect 192.168.x.xxx:8443 2>/dev/null

请帮忙!谢谢!

【问题讨论】:

How are SSL certificate server names resolved/Can I add alternative names using keytool?的可能重复 @蓝宝石:我不明白你的问题。主题备用名称是NOT X.509 证书中的必需扩展名。因此,如果您有没有它的证书,没有问题。那么你是如何得到这个异常的呢? @user384706 你能看看这个问题吗?即使我对它为什么抛出这个错误感到困惑。 [***.com/questions/8759956/… @Sapphire: 已在另一帖回复 接受的答案是 Java。要使用 OpenSSL 做到这一点,这里有一个答案:security.stackexchange.com/a/91556 【参考方案1】:

虽然this question 更具体地涉及主题替代中的 IP 地址。名称,命令类似(使用DNS 条目作为主机名,使用IP 条目作为IP 地址)。

引用我自己的话:

如果您使用的是keytool,则从Java 7, keytool 开始,您可以选择 包括一个主题备用名称(请参阅文档中的表格 对于 -ext):您可以使用 -ext san=dns:www.example.com 或 -ext san=ip:10.0.0.1

请注意,您只需要 Java 7 的 keytool 即可使用此命令。准备好密钥库后,它应该可以与以前的 Java 版本一起使用。

(这个答案的其余部分还提到了如何使用 OpenSSL 执行此操作,但它似乎不是您使用的。)

【讨论】:

我无法更改为 Java7。有没有办法绕过我的 Java 代码中的 subjectalternativename 检查? 不要回避这个检查。正如我所说,您只需要 Java 7 即可使用此 keytool 命令。完成后,您应该能够在 Java 6(或更低版本)安装中使用 JKS 文件(甚至不必在同一台机器上)。或者,您可以使用 OpenSSL 生成此(自签名)证书(命令和设置可能有点复杂):您可以将使用 OpenSSL 生成的 PEM 密钥/证书转换为 .p12 文件并直接从Java 作为使用密钥库类型PKCS12 的密钥库。您也可以使用主机名而不是 IP 地址:您可以使用 CN。 我使用了一个主机名,就像你建议的那样,我得到了这个:找不到与 myhostname.com 匹配的名称。 嗯,您需要使用配置为匹配该 IP 地址的主机名(在 DNS 或主机文件中)。如果您不熟悉这些概念,听起来在某处安装 Java 7 可能是您最简单的解决方案。 我用“myip myhostname”更新了 /etc/hosts 文件,并在证书中使用了 myhostname。【参考方案2】:

IP和DNS都可以用keytool附加参数-ext SAN=dns:abc.com,ip:1.1.1.1指定

例子:

keytool -genkeypair -keystore <keystore> -dname "CN=test, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown" -keypass <keypwd> -storepass <storepass> -keyalg RSA -alias unknown -ext SAN=dns:test.abc.com,ip:1.1.1.1

【讨论】:

请注意,上述命令不会创建 CSR。 Java 的 keytool 在密钥库中以自签名证书的形式创建密钥对,并将 SAN 属性放入该自签名证书中。如果要发布具有 SAN 属性的 CSR,则需要将相同的 -ext 参数传递给“keytool -certreq”。有趣的是 keytool 的自文档帮助包含 -ext 选项,尽管 keytool 确实处理 -ext 就好了。 @avarvit 这意味着我可以在 CSR 中添加 altNames,即使在调用 -genkeypair 时未使用这些名称。从 CA 收到带有此 CSR 的证书时会发生什么? Woule keytool 导入它并链接到正确的私钥?这是将 altName 添加到错过它的证书的一种可能方式吗? 感谢您添加完整示例【参考方案3】:

在生成 CSR 时,可以再次指定 -ext 属性以将其插入到 CSR 中

keytool -certreq -file test.csr -keystore test.jks -alias testAlias -ext SAN=dns:test.example.com

此处的完整示例:How to create CSR with SANs using keytool

【讨论】:

以上是关于如何将主题替代名称添加到 ssl 证书?的主要内容,如果未能解决你的问题,请参考以下文章

javax.net.ssl.SSLPeerUnverifiedException:<sub.app.domain> 的证书与任何主题替代名称都不匹配:[*.app.domain]]

如何检查 SSL/TLS 证书的主题备用名称?

如何使用 Apache mod_ssl 变量验证 URI 格式的主题备用名称的内容?

无法使用主题备用名称证书为 SSL/TLS 安全通道建立信任关系

如何从trust.p12证书文件中获取SSL证书主题,颁发者,开始日期和过期日期

SSLHandshakeException:不存在主题替代名称