【问题标题】:How to add subject alernative name to ssl certs?如何将主题替代名称添加到 ssl 证书?
【发布时间】: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

请帮忙!谢谢!

【问题讨论】:

标签: ssl ssl-certificate x509certificate keytool


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2023-01-18
    • 2012-01-16
    • 1970-01-01
    • 2017-05-14
    • 2014-01-17
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多