Android无需SSL证书密钥获取HTTPS响应码及服务端配置咨询
Android HTTPS 握手异常问题解答
问题1:如何像Chrome等浏览器一样,无需提供crt/key即可获取HTTPS请求的响应内容和响应码?
出现该差异的核心原因是Chrome、Firefox等浏览器会内置额外的可信根证书列表,同时支持自动补全缺失的中间证书,而Android系统仅依赖预置的系统根证书,不会自动补全中间证书。你可以根据场景选择对应方案:
- 生产环境合规方案:确认站点证书由全球公信任CA签发且配置完整证书链的前提下,使用系统默认信任逻辑即可,无需额外导入证书。Android 7.0及以上版本默认信任系统预置的所有可信根证书,只要站点证书链的根证书在系统根证书列表中,即可正常完成SSL握手。
- 测试环境临时方案:可以自定义信任管理器跳过所有证书校验,该方案存在严重的中间人攻击风险,绝对禁止用于生产环境,示例代码如下:
// 仅允许在本地测试环境使用 try { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {} @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {} @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; } } }; SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); // 跳过主机名校验 HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); } catch (Exception e) { e.printStackTrace(); }
将上述代码放在你发起HTTPS请求之前执行即可跳过证书校验拿到响应结果。
问题2:网站开发者需要在服务端做哪些配置,才能让我无需密钥/证书即可正常获取请求内容?
服务端需要满足以下所有配置要求:
- 必须使用全球公认可信CA机构签发的SSL证书,禁止使用自签证书、企业私有CA签发的证书
- 部署证书时必须配置完整的证书链,包含根证书、所有中间证书和最终的域名证书,不要仅部署域名证书,缺失中间证书是Android端出现信任锚异常最常见的原因
- 确保证书绑定的域名与实际访问的域名完全匹配,如果使用泛域名证书需要确认当前访问的子域名在泛域名覆盖范围内
- 确保证书处于有效期内,没有被CA机构吊销
- 服务端开启的TLS版本兼容App适配的最低Android版本:Android 4.4及以上版本默认支持TLS1.2,Android 10及以上支持TLS1.3,不要仅启用过高版本的TLS协议
内容的提问来源于stack exchange,提问作者Karam
相关产品推荐
相关产品推荐

