Java 得到';IOException:未验证主机名';,尽管给定的主机名(IP地址)与通用名称匹配

Java 得到';IOException:未验证主机名';,尽管给定的主机名(IP地址)与通用名称匹配,java,android,ssl,okhttp,Java,Android,Ssl,Okhttp,在我成功插入证书并将其用作OKHttp的SSLFactory实例的一部分后,我如何可能获得IOException:hostname未经验证?我知道这是自签名证书的常见问题,但仅当服务器上的名称与证书上的名称不匹配时才会出现。在我的例子中,异常消息向我显示了地址,然后是CN,它们确实完全匹配 我通过提供一个超级许可的主机验证器暂时解决了这个问题: this.client.setHostnameVerifier(new HostnameVerifier() { @Override p

在我成功插入证书并将其用作OKHttp的SSLFactory实例的一部分后,我如何可能获得
IOException:hostname未经验证
?我知道这是自签名证书的常见问题,但仅当服务器上的名称与证书上的名称不匹配时才会出现。在我的例子中,异常消息向我显示了地址,然后是CN,它们确实完全匹配

我通过提供一个超级许可的主机验证器暂时解决了这个问题:

this.client.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        //TODO: Make this more restrictive
        return true;
    }
});
但感觉还是很奇怪。你能告诉我是什么导致了这个问题吗?或者,至少,在你看来,哪种处理方式更具限制性?我猜,是一个试图从会话中提取主机名并与
hostname
param进行比较的程序

更新: 这是堆栈跟踪,根据请求。出于隐私原因,我不能透露任何数据,但请记住主机名IP和CN的匹配比例为1:1

java.io.IOException: Hostname xxx.xxx.xxx.xxx not verified:
certificate: sha1/xxxxxxxxxxxxxxxxxxxxxxxxx=
DN: xxx.xxx.xxx.xxx.xxx.xxx.xxx=#xxxxxxxxxxxxxxxxxxxxxxxxxxxxx,CN=xxx.xxx.xxx.xxx,OU=xxxxxx,O=xxxxxx,L=xxxxxx,ST=xxxxxx,C=xx
subjectAltNames: []
at com.squareup.okhttp.Connection.upgradeToTls(Connection.java:260)
at com.squareup.okhttp.Connection.connect(Connection.java:158)
at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:174)
at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:120)
at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:131)
at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:312)
at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:235)
at com.squareup.okhttp.Call.getResponse(Call.java:262)
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:219)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:192)
at com.squareup.okhttp.Call.execute(Call.java:79)
主机名xxx.xxx.xxx.xxx未验证

看起来您正在连接到IP地址。 IP的匹配行为在不同的实现中有所不同,但为RFC2818(https)定义的检查要求IP地址位于subject alternative name部分():

在某些情况下,URI被指定为IP地址而不是IP地址 主机名。在这种情况下,iPAddress subjectAltName必须存在 并且必须与URI中的IP完全匹配


实现之间的实际行为不同。一些人接受知识产权为CN,其他人则不接受。有些实现了正确的行为,要求IP作为iPAddress类型,而另一些实现了dNSName类型。因此,您最好将其放在CN中,并在subject alternative names部分加上iPAdress和dNSName:(

添加完整的stacktrace和更多代码。@Jens添加了stacktrace我想这就是原因