在没有 HttpsUrlConnection 的 Android SSL 套接字中忽略主机名验证
Ignoring hostname verification in Android SSL Sockets without HttpsUrlConnection
如果我无法使用 HttpsUrlConnection class,如何关闭主机名验证?
在调试模式下(和只有在调试模式下)我发现忽略主机名验证很方便,因为每个团队成员都有虚拟如果他们需要签名证书,服务器并针对它们进行调试是一件令人头疼的事情。
使用 HttpsUrlConnection
这很容易实现 (setHostnameVerifier
)。
但是,我今天没有使用 HttpsUrlConnection
- 我正在使用与 SSLSocket
对象相关的其他东西,因为我想要一个网络套接字客户端并且 HttpsUrlConnections
不支持网络套接字。连接失败,因为无法验证证书(对它们有好处 - 这是正确的行为)但我想让它们继续进行。
他们死于
`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
以便接受所有证书,但我找不到切换主机名测试的方法。
I find it convenient to ignore hostname verification, because each team member has virtual servers and debugging against them is a pain in the neck if they need signed certificates.
您混淆了主机名验证和证书签名。使用 HTTPS 的服务器验证由
完成
- 验证信任链,即证书是否由受信任的根 CA 签名(可能还有一些介于两者之间的链证书)。
- 检查证书的主题是否与 URL 中的预期主机名匹配。
您正在尝试仅禁用 #2。如果您确实处于测试设置中并且想要使用自签名证书,您还需要禁用#1。如果您改为将自签名证书导入为受信任的证书,您还可以颁发证书,以便它们与预期的主机名匹配。
HttpsURLConnection.setHostnameVerifier 没有原始 SSL 套接字的等效项,也不是必需的 - 您可以简单地忽略该位。我基本上是想抢先解决一个不存在的问题,但它让我失望了——只要你为 SSLContext 设置自己的 TrustManager 就可以了。
如果我无法使用 HttpsUrlConnection class,如何关闭主机名验证?
在调试模式下(和只有在调试模式下)我发现忽略主机名验证很方便,因为每个团队成员都有虚拟如果他们需要签名证书,服务器并针对它们进行调试是一件令人头疼的事情。
使用 HttpsUrlConnection
这很容易实现 (setHostnameVerifier
)。
但是,我今天没有使用 HttpsUrlConnection
- 我正在使用与 SSLSocket
对象相关的其他东西,因为我想要一个网络套接字客户端并且 HttpsUrlConnections
不支持网络套接字。连接失败,因为无法验证证书(对它们有好处 - 这是正确的行为)但我想让它们继续进行。
他们死于
`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
以便接受所有证书,但我找不到切换主机名测试的方法。
I find it convenient to ignore hostname verification, because each team member has virtual servers and debugging against them is a pain in the neck if they need signed certificates.
您混淆了主机名验证和证书签名。使用 HTTPS 的服务器验证由
完成- 验证信任链,即证书是否由受信任的根 CA 签名(可能还有一些介于两者之间的链证书)。
- 检查证书的主题是否与 URL 中的预期主机名匹配。
您正在尝试仅禁用 #2。如果您确实处于测试设置中并且想要使用自签名证书,您还需要禁用#1。如果您改为将自签名证书导入为受信任的证书,您还可以颁发证书,以便它们与预期的主机名匹配。
HttpsURLConnection.setHostnameVerifier 没有原始 SSL 套接字的等效项,也不是必需的 - 您可以简单地忽略该位。我基本上是想抢先解决一个不存在的问题,但它让我失望了——只要你为 SSLContext 设置自己的 TrustManager 就可以了。