Java';具有IP地址的s keytool命令

Java';具有IP地址的s keytool命令,java,ssl,keystore,keytool,Java,Ssl,Keystore,Keytool,我试图通过https URL获取图像,但遇到了一些问题。我使用Java的keytool命令生成密钥库。如果我指定与我的主机名相等的公共名称(CN),例如CN=JONMORRA,然后尝试通过我的主机名进行查询,例如,那么它可以正常工作。但是,如果我将公共名称指定为我的ip地址,例如CN=192.168.56.1,并尝试通过我的ip地址进行查询,例如,那么我会得到一个错误 HTTPS主机名错误:应为 这表明我的主机名是错误的,尽管这是我在密钥库中指定的 我想使用ip地址而不是主机名,这样我就可以在L

我试图通过https URL获取图像,但遇到了一些问题。我使用Java的keytool命令生成密钥库。如果我指定与我的主机名相等的公共名称(CN),例如CN=JONMORRA,然后尝试通过我的主机名进行查询,例如,那么它可以正常工作。但是,如果我将公共名称指定为我的ip地址,例如CN=192.168.56.1,并尝试通过我的ip地址进行查询,例如,那么我会得到一个错误

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);
如果您确实尝试了此代码,但它不起作用,请发布为
urlHostName
session.getPeerHost()
打印的内容

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

HTTPS规范(RFC 2818)非常清楚使用IP地址进行服务器身份验证:证书中必须存在使用者替代名称(IP)条目(鉴于主题DN中的CN足以作为主机名的回退解决方案)

尽管并非所有客户端(尤其是并非所有浏览器)都严格实现此验证,但Java默认主机名验证器确实实现了此验证

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


有关详细信息,请参阅此问题:

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

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


我实际上是用一个库来做这个传输,我没有实现这个的源代码。如果你没有源代码也没关系,在从库中加载任何类之前,在你的主类中这样做就行了。除非你的设置被显式重写,否则它应该可以工作。嘿,谢谢你的帖子。非常有用。什么安全性的影响会在这里吗?这会使服务容易受到中间人攻击吗?由于提议的验证者实际上不做任何验证,它可能会导致安全风险;我认为IP地址的需要是由于在开发环境中工作。
keytool -keystore keystore.jks -genkey -ext SAN=IP:192.168.1.1