我正在尝试通过https网址获取图片,但我遇到了一些问题。我用Java的keytool命令生成一个密钥库。如果我指定公共名称(CN)等于我的主机名,例如CN = JONMORRA,然后尝试通过我的主机名查询,例如https://JONMORRA:8443/,那么它可以正常工作。但是,如果我将公共名称指定为我的IP地址,例如CN = 192.168.56.1,并尝试通过我的IP地址查询,例如https://192.168.56.1:8443/,那么我收到错误
HTTPS主机名错误:应为< 192.168.56.1>
这说明我的主机名是错误的,即使这是我在密钥库中指定的内容。
我想使用ip地址而不是主机名,这样我就可以在Linux和Windows框之间进行查询,而无需担心主机名。
为什么CN不接受IP地址,我该如何解决?
由于
答案 0 :(得分:4)
此代码段可能适合您:
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);
如果您尝试使用此代码,但该功能不起作用,请发布为urlHostName
和session.getPeerHost()
打印的内容。
另外,为什么让Windows和Linux机箱互操作需要使用IP地址而不是主机名?
答案 1 :(得分:1)
HTTPS规范(RFC 2818)对使用IP地址的服务器身份验证非常清楚:证书中必须存在主题备用名称(IP)条目(而主题DN中的CN足以作为后备主机名的解决方案)。
虽然并非所有客户端(特别是并非所有浏览器)都严格执行此验证,但Java默认主机名验证程序确实如此。
使用Java 7的keytool
,可以使用OpenSSL创建具有IP SAN条目的证书,或者(在提出/回答此问题时不可用)。
有关详细信息,请参阅此问题:How are SSL certificate server names resolved/Can I add alternative names using keytool?
答案 2 :(得分:1)
要使用keytool
实际生成有效证书,请使用:
keytool -keystore keystore.jks -genkey -ext SAN=IP:{IP_ADDRESS}
e.g:
keytool -keystore keystore.jks -genkey -ext SAN=IP:192.168.1.1