HttpsURLConnection请求https,抛出javax.net.ssl.SSLException: hostname in certificate didn't match:

本文提供了一种禁用HTTPS证书验证的方法,通过创建一个自定义的信任管理器和主机名验证器来绕过通常的安全检查,这对于调试或者测试环境下的非正式证书很有用。

解决办法:

try {
	SSLContext sc = SSLContext.getInstance("TLS");
	sc.init(null, new TrustManager[]{new X509TrustManager() {
		@Override
		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}

		@Override
		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}

		@Override
		public X509Certificate[] getAcceptedIssuers() {
			return null;
		}
	}}, new SecureRandom());

	HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
		@Override
		public boolean verify(String arg0, SSLSession arg1) {
			return true;
		}
	});
} catch (Exception e) {
	e.printStackTrace();
}



### IDEA Http 请求 `javax.net.ssl.SSLException: Unsupported or unrecognized SSL message` 错误解决方案 当遇到此错误时,表明客户端尝试通过非加密连接发起 HTTPS 请求,而服务器期望的是加密的 SSL/TLS 连接[^2]。具体原因可能是: - **HTTPS 服务配置问题**:服务器端没有正确配置 HTTPS 或者使用的证书不受信任。 - **客户端与服务器之间的证书链问题**:例如自签名证书未被信任或证书路径不正确。 - **客户端配置问题**:客户端没有正确配置 SSL 上下文或者使用了 HTTP 而不是 HTTPS 进行连接。 #### 检查并修正服务器端配置 确保服务器端已正确配置 HTTPS 并且所用证书受客户端信任。对于自签名证书,则需将其导入至客户端的信任库中。 #### 修改 IDE 配置 针对 IntelliJ IDEA 的设置调整如下: 1. 打开项目中的 `build.gradle` 文件(适用于 Gradle 构建工具),添加以下依赖项来更新 JRE 版本的安全提供程序: ```groovy dependencies { implementation 'org.bouncycastle:bcpkix-jdk15on:1.70' } ``` 2. 设置 JVM 参数以启用调试模式查看详细的 SSL 握手过程: - 编辑启动脚本,在 VM options 添加 `-Djavax.net.debug=ssl,handshake,failure` 3. 如果确实不需要安全传输层协议 (TLS),可以考虑临时切换 URL 方案为 http:// 来绕过该问题;但这仅作为测试手段而非长久之计[^3]。 4. 对于特定场景下的 API 测试,可以在代码层面忽略 SSL 验证(注意这会带来安全隐患): ```java import javax.net.ssl.*; ... // 创建默认 TrustManager 实现类实例化对象数组 TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers(){ return null; } @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {} } }; try{ // 安装所有信任管理器 SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // 创建主机名验证器允许所有主机名称 HostnameVerifier allHostsValid = (hostname, session) -> true; // 安装主机名验证器 HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); }catch(Exception e){ System.out.println(e.getMessage()); } ``` 上述方法虽然能够解决问题,但从长远来看并不推荐这样做,因为这样会使应用程序暴露在潜在风险之中。最佳实践还是应该妥善处理好双方的身份认证机制以及数据交换过程中必要的安全性保障措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值