Android 异常:javax.net.ssl.SSLException: hostname in certificate didn't match

本文介绍了一种在Android应用中使用第三方AsyncHttpClient框架时遇到的HTTPS请求异常问题:javax.net.ssl.SSLException:hostnameincertificatedidn'tmatch。尝试了设置HostnameVerifier但未解决问题。最终解决方案为更换网络请求框架,采用okhttp来替代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关文章:

Android 异常:javax.net.ssl.SSLException: hostname in certificate didn't match

app用的第三方联网框架AsyncHttpClient,服务器是Https请求的,我按照以上文章的方法,

在请求之前加一句话

SSLSocketFactory.getSocketFactory().setHostnameVerifier(newAllowAllHostnameVerifier());

但是并没有解决问题。

最终解决办法:弃用AsyncHttpClient框架,改用okhttp框架。

 

### 解决 `javax.net.ssl.SSLException: Unsupported or unrecognized SSL message` 异常 当遇到 `javax.net.ssl.SSLException: Unsupported or unrecognized SSL message` 异常时,这通常意味着客户端和服务器之间存在协议版本或加密套件兼容性问题。以下是详细的解决方案: #### 1. 协议版本匹配 确保客户端和服务端都支持相同的 SSL/TLS 版本。可以尝试强制指定 TLS 版本来排除旧版本的潜在冲突。 对于 JMeter 或其他 Java 应用程序,可以在启动参数中设置 JVM 参数来启用特定的 TLS 版本: ```bash -Dhttps.protocols=TLSv1.2,TLSv1.3 ``` #### 2. 加密套件一致 确认双方使用的加密算法是否相同。可以通过调整应用程序的安全策略文件或者直接修改代码中的 SSLEngine 配置来进行控制。 Java 程序可通过如下方式限定可用的 Cipher Suites: ```java SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket socket = (SSLSocket)factory.createSocket("hostname", port); socket.setEnabledCipherSuites(new String[]{"TLS_RSA_WITH_AES_128_CBC_SHA"}); ``` #### 3. 自定义 TrustManager 和 HostnameVerifier 有时默认的信任管理器可能会拒绝某些合法但非标准格式的证书。创建自定义实现类并覆盖其验证逻辑可以帮助绕过这些问题。 下面是一个简单的例子展示如何忽略所有主机名验证错误(仅用于测试环境): ```java HostnameVerifier allHostsValid = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager(){ @Override public void checkClientTrusted(X509Certificate[] chain, String authType){} @Override public void checkServerTrusted(X509Certificate[] chain, String authType){} @Override public X509Certificate[] getAcceptedIssuers(){return null;} } }; // Install the all-trusting trust manager try{ SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null,trustAllCerts,new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); }catch(Exception e){ throw new RuntimeException(e); } ``` 请注意上述方法会降低安全性,在生产环境中应谨慎使用,并考虑正式安装受信CA签发的有效证书[^2]。 #### 4. 更新依赖库与JDK版本 保持所使用的第三方库以及 JDK 的最新状态有助于获得更好的安全性和性能表现。特别是针对已知漏洞进行了修补的新版软件更值得信赖。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值