Java调用API遇SSL证书IP匹配错误,关闭主机验证是否安全?
问题:关闭HTTPS主机验证的安全隐患分析
我用Java向https://172.17.14.16的API发起请求时,抛出错误:No subject alternative names matching IP address 172.17.14.16 found;但关闭主机验证后请求能正常执行。想咨询这个操作是否存在安全隐患,是否会被第三方利用?
报错代码
URL urlWs = new URL(url); SSLContext sc = SSLContext.getInstance("TLSv1.2"); sc.init(null, null, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); conexion = (HttpURLConnection) urlWs.openConnection(); this.metodo = "POST"; this.timeout = timeout; init(header)
可行代码(关闭主机验证)
URL urlWs = new URL(url); SSLContext sc = SSLContext.getInstance("TLSv1.2"); sc.init(null, null, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { // 在此处执行主机名验证 // 可将主机名与服务器证书进行比对 // 验证通过返回true,否则返回false return false; } }; HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); conexion = (HttpURLConnection) urlWs.openConnection(); this.metodo = "POST"; this.timeout = timeout;
安全隐患分析
- 存在极大安全风险,完全可能被第三方利用。HTTPS的主机验证是SSL/TLS信任链的核心环节,作用是确认当前连接的服务器确实是目标服务器,直接防范中间人攻击(MITM)。
- 一旦关闭主机验证,攻击者可通过ARP欺骗、DNS劫持等手段,伪造伪装成
172.17.14.16的虚假服务器。Java客户端会跳过主机身份校验,直接接受虚假服务器的证书并建立连接:- 所有请求数据(包括敏感参数、身份令牌等)会被攻击者拦截、篡改;
- 攻击者还能伪造响应返回给客户端,让你误以为请求正常执行,实际数据已泄露或被恶意修改。
正确解决方式
不要通过关闭主机验证绕过错误,应从根源修复证书问题:
- 要求服务器管理员更新SSL证书,将
172.17.14.16添加到证书的**主题备用名称(SAN)**字段,这是符合HTTPS规范的做法; - 如果是内部自签名证书,生成证书时明确指定该IP作为SAN,再将证书导入Java客户端的信任库(
cacerts),客户端就能正常完成主机身份验证。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

