CertificateException:不存在主题替代名称

在调用https webservice时出现以下exception。

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 webservice。 CN(通用名称),即证书上的IP地址和我所调用的IP地址是不同的。 我已经在java的密钥库中添加了证书。 有人能帮我解释为什么会发生这种情况吗? 我哪里去错了? CN是服务器IP地址。 我打电话给那个服务器使用它的外部IP地址也给我们,因为防火墙的问题。

Solutions Collecting From Web of "CertificateException:不存在主题替代名称"

CN(通用名称)即IP上的证书是不同的,我打电话的IP是不同的。

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

当通用名称(CN)中存在名称时,该名称也必须出现在主题备用名称(SAN)中。 您有一个格式不正确的证书(可能还有其他问题)。 见公开信托证书颁发和管理的基准要求 ,第9节(第9和10页):

9.2.2主题通用名称字段

证书字段:subject:commonName(OID 2.5.4.3)

必需/可选:弃用(劝阻,但不禁止)

内容:如果存在,这个字段必须包含一个IP地址或完全合格的域名,它是证书的subjectAltName扩展名(见第9.2.1节)中包含的值之一。

Bruno大概可以引用RFC 6125中的相关部分。

Java客户端在检查IP地址的服务器身份时通常严格遵守RFC 2818的规定。 这意味着IP地址必须在主题备用名称条目中,而不是在CN中。 这个问题的细节。

修复证书以符合RFC 2818(即将IP地址放在IP地址SAN中)应修复java.security.cert.CertificateException: No subject alternative names present. 例外。

但是,由于您没有使用证书中的IP地址来呼叫服务器,所以仍然存在问题。 你有两个选择:

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

  • 在该连接使用的信任库中导入该证书,并禁用主机名验证。 一般不要禁用主机名验证 。 禁用主机名验证的问题是,任何有效的证书都可以冒充任何可以用于MITM攻击的证书。 如果您信任的唯一证书是您想要连接的唯一服务器(您可以通过为此单独设置一个信任存储库来执行此操作),则可以限制此风险。 通常情况下,对这些特殊情况进行编码会导致不良遗留代码,以致某些人可能会在稍后拿起并使用不安全的代码。 出于这个原因,修复证书是更好的选择。