4

我正在尝试通过 https URL 获取图像,但遇到了一些问题。我使用 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 地址,我该如何解决?

谢谢

4

3 回答 3

6

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

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

例如:

keytool -keystore keystore.jks -genkey -ext SAN=IP:192.168.1.1
于 2018-06-14T19:16:01.787 回答
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);

如果您确实尝试了此代码,但它不起作用,请发布为urlHostNameand打印的内容session.getPeerHost()

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

于 2009-07-23T00:44:53.547 回答
1

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

尽管并非所有客户端(特别是并非所有浏览器)都严格执行此验证,但 Java 默认主机名验证器会执行此操作。

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

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

于 2012-01-06T22:37:15.647 回答