java - 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();
解决方案
答案在您的链接上:
您的应用需要进行自己的主机名验证,最好使用预期的主机名调用 getDefaultHostnameVerifier()。此外,请注意 HostnameVerifier.verify()不会在错误时引发异常,而是返回一个您必须明确检查的布尔结果。
“我想知道我可以将它用于任何带有 SSLSocket 的域或 IP!”
不,您将无法这样做,连接的证书必须在您客户端的信任库中,我们可以预期不同的域使用不同的证书:)
请参阅此使用 JSSE 时我应该如何进行主机名验证?关联。
推荐阅读
- io - 这些命令中使用了什么转换——16 的倍数?
- c# - 为什么替换 \" 不适用于我的情况?
- ios - 一个 URLSession 中的不同超时
- ios - 可自定义的表格视图单元格滑动以停止完全扩展?
- ruby-on-rails - `method_missing':未定义的方法`devise_modules'
- c++ - 为什么进程会在 RtlExitUserProcess/LdrpDrainWorkQueue 中挂起?
- python - 在 TKinter 函数执行期间拒绝事件
- kubernetes - 零停机时间的 Kubernetes 部署
- hibernate - 即使该查询有一行,也没有找到查询异常的实体
- angular - 角度 5 中的拦截器