首页 > 解决方案 > SSLSocket 不执行主机名验证

问题描述

我将 SSLSocket 用于我的 android 应用程序,根据这篇文章 SSLSocket does not perform host name verification here

并且在使用 IP 而不是域时我没有看到任何异常,并且一切正常,所以我可以使用 IP 或任何其他域进行连接吗?

我已经从letsencrypt获得了一个域的证书,我想知道我可以将它用于任何带有SSLSocket的域或IP!

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, nulls, null);
SocketFactory sslsocketfactory = sc.getSocketFactory();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(host, 443);
sslsocket.setSoTimeout(5000);
sslsocket.startHandshake();

标签: javaandroidsocketsssl

解决方案


答案在您的链接上:

您的应用需要进行自己的主机名验证,最好使用预期的主机名调用 getDefaultHostnameVerifier()。此外,请注意 HostnameVerifier.verify()不会在错误时引发异常,而是返回一个您必须明确检查的布尔结果。

“我想知道我可以将它用于任何带有 SSLSocket 的域或 IP!”

不,您将无法这样做,连接的证书必须在您客户端的信任库中,我们可以预期不同的域使用不同的证书:)

请参阅此使用 JSSE 时我应该如何进行主机名验证?关联。


推荐阅读