在没有HttpsUrlConnection的情况下忽略Android SSL套接字中的主机名验证

时间:2015-05-01 14:39:48

标签: java android ssl ssl-certificate

如果我不能使用HttpsUrlConnection类,如何关闭主机名验证?

在调试模式下(并且在调试模式下只 )我发现忽略主机名验证很方便,因为每个团队成员都有虚拟服务器并且对它们进行调试很痛苦如果他们需要签名证书,那就在脖子上。

使用HttpsUrlConnection,这很容易实现(setHostnameVerifier)。

但是,我今天没有使用HttpsUrlConnection - 我正在使用与SSLSocket对象相关的其他内容,因为我想要一个Web套接字客户端而HttpsUrlConnections不支持Web套接字。连接失败,因为证书无法验证(对他们有利 - 这是正确的行为),但我想让它们继续运行。

他们死了

`javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:409)`

我已经使用自己的信任管理器设置SSLContext,以便接受所有证书,但我找不到切换主机名测试的方法。

2 个答案:

答案 0 :(得分:1)

  

我发现忽略主机名验证很方便,因为每个团队成员都有虚拟服务器,如果他们需要签名证书,对他们进行调试是一件痛苦的事。

您混合主机名验证和证书签名。使用HTTPS验证服务器是通过

完成的
  1. 验证信任链,即证书是否由受信任的根CA签署(可能还有一些链证书)。
  2. 检查证书的主题是否与URL中的预期主机名匹配。
  3. 您正尝试禁用#2。如果您确实处于测试设置并希望使用自签名证书,则还需要禁用#1。如果您将自签名证书导入为受信任证书,则还可以颁发证书以使其与预期的主机名匹配。

答案 1 :(得分:0)

HttpsURLConnection.setHostnameVerifier没有原始SSL套接字的等效项,并且不是必需的 - 您可以忽略该位。我基本上试图抢占一个不存在的问题,它让我失望 - 只要你为SSLContext设置自己的TrustManager就可以了。