Java的keytool命令,带有IP地址

我试图通过httpsurl获取图片,但我遇到了一些问题。 我用Java的keytool命令生成一个密钥库。 如果我指定公共名称(CN)等于我的主机名,例如CN = JONMORRA,然后尝试通过我的主机名查询,例如https:// JONMORRA:8443 /那么它工作正常。 但是,如果我将公共名称指定为我的IP地址,例如CN = 192.168.56.1,并尝试通过我的IP地址查询,例如https://192.168.56.1:8443/然后我收到错误

HTTPS主机名错误:应为

这说明我的主机名是错误的,即使这是我在密钥库中指定的内容。

我想使用ip地址而不是主机名,这样我就可以在Linux和Windows机箱之间进行查询,而无需担心主机名。

为什么CN不接受IP地址,我该如何解决?

谢谢

此代码段可能适合您:

import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(hv); 

如果您尝试使用此代码,但它不起作用,请发布为urlHostNamesession.getPeerHost()打印的urlHostName

另外,为什么让Windows和Linux机箱互操作需要使用IP地址而不是主机名?

HTTPS规范(RFC 2818)非常清楚使用IP地址进行服务器身份validation:证书中必须存在主题备用名称(IP)条目(而主题DN中的CN足以作为a的后备解决方案)主机名)。

虽然并非所有客户端(特别是并非所有浏览器)都严格执行此validation,但Java默认主机名validation程序确实如此。

例如,使用Java 7的keytool ,可以使用OpenSSL创建具有IP SAN条目的证书,或者(在提出/回答此问题时不可用)。

有关详细信息,请参阅此问题: 如何解析SSL证书服务器名称/我可以使用keytool添加备用名称吗?

要使用keytool生成有效证书,请使用:

 keytool -keystore keystore.jks -genkey -ext SAN=IP:{IP_ADDRESS} 

例如:

 keytool -keystore keystore.jks -genkey -ext SAN=IP:192.168.1.1