【问题标题】:CertificateException: No subject alternative names presentCertificateException:不存在主题替代名称
【发布时间】:2014-04-25 15:58:19
【问题描述】:

调用 https 网络服务时出现以下异常。

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present.

我正在从 Java 代码调用一个 php web 服务。 CN(通用名称),即证书上的 IP 地址和我呼叫的 IP 地址不同。我已在 java 的密钥库中添加了证书。 有人可以帮我弄清楚为什么会这样吗?我哪里错了? CN 是服务器 IP 地址。由于防火墙问题,我正在使用我们给定的外部 IP 地址调用该服务器。

【问题讨论】:

  • 我在@noloader 的解决方案的帮助下解决了这个异常,但现在我得到了不同的错误.. 似乎这个错误是因为,我在 java 密钥库中添加了证书。我需要在信任库中添加它吗?

标签: java linux ssl openssl


【解决方案1】:

在使用 IP 地址检查服务器身份时,Java 客户端通常严格遵守 RFC 2818。这意味着 IP 地址必须在主题备用名称条目中,而不是在 CN。这个this question了解详情。

修复证书以符合 RFC 2818(即将 IP 地址放入 IP 地址 SAN)应该修复 java.security.cert.CertificateException: No subject alternative names present. 异常。

但是,由于您没有使用证书中的 IP 地址调用服务器,因此您仍然会遇到问题。你有两个选择:

  • 如果您可以找人修复证书,请放置两个 SAN 条目,用于内部和外部 IP 地址。这是迄今为止最好的选择(仅次于在该机器上设置名称,这可以更好地防止此类问题)。

  • 在该连接使用的信任库中导入该证书并禁用主机名验证。 一般情况下不要禁用主机名验证。禁用主机名验证的问题是任何有效证书都可以冒充任何其他证书,这可用于 MITM 攻击。如果您信任的唯一证书是您想要连接的唯一服务器的证书(您可以为此目的使用单独的信任存储来做到这一点),您可以限制这种风险。通常,为这些特殊情况编写代码会导致糟糕的遗留代码,以后有人可能会不安全地拾取和使用这些代码。因此,修复证书是迄今为止更好的选择。

【讨论】:

    【解决方案2】:

    CN(通用名称),即证书上的 IP 不同,我呼叫的 IP 也不同。

    ...

    HTTP 传输错误:javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:不存在主题替代名称。

    当一个名称出现在通用名称 (CN) 中时,它必须也出现在主题备用名称 (SAN) 中。您的证书格式不正确(可能还有其他问题)。请参阅Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates,第 9 节(第 9 和 10 页):

    9.2.2 主题公用名字段

    证书字段:主题:commonName (OID 2.5.4.3)

    必需/可选:已弃用(不鼓励,但不禁止)

    Contents:如果存在,此字段必须包含单个 IP 地址或 完全限定域名,它是包含在 证书的 subjectAltName 扩展名(参见第 9.2.1 节)。

    Bruno 可能会引用 RFC 6125 中的相关部分。

    【讨论】:

    • 哈...实际上,RFC 6125 没有为 IP 地址指定任何内容,它位于 "out of scope" section 中。您从 CA 浏览器基线规范中引用的部分更多地是关于在有 SAN 时在 CN 中放置的内容,而不是关于在使用 IP 地址时需要有 SAN 的事实。此外,Java 不使用该规范,而且奇怪的是,浏览器往往不遵循 RFC 2818(通过在 CN 中接受 IP 地址而不在 SAN 中)。
    • 这只是我的意见,但我不确定我是否会过多地参考 CA 浏览器论坛文档(它们似乎与推动 EV 证书的一般性更相关,很可能与一些 CA 既得利益者)。毕竟,基线要求。您链接到的链接没有一次引用 RFC 2818,并且似乎几乎不知道“Internet”和“Web”之间的区别(请参阅介绍:“[... only ...] 身份验证可通过以下方式访问的服务器Internet。在未来的版本中可能会涵盖对代码签名、S/MIME、时间戳、VoIP、IM、Web 服务等的类似要求。")!
    • @noloader:谢谢,这对我有用。但现在我得到了新的例外。 javax.xml.ws.soap.SOAPFaultException:SOAP 错误:解析 WSDL:在“/var/www-ssl/ingram/wsdls/deviceprofileInfoAnother.wsdl”中找不到 。我在 java keystore 中添加了证书,我想我需要在 truststore 中添加它。请帮我解决这个问题...
    猜你喜欢
    • 2014-04-02
    • 2023-04-11
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2015-05-23
    • 2014-11-28
    相关资源
    最近更新 更多