Java的keytool命令,带有IP地址

时间:2009-07-23 00:24:03

标签: java ssl keystore keytool

我正在尝试通过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地址,我该如何解决?

由于

3 个答案:

答案 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);

如果您尝试使用此代码,但该功能不起作用,请发布为urlHostNamesession.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