Android如何优雅实现TLS服务端证书获取及全流程校验
Android平台TLS服务端证书校验实现方案
核心实现步骤
1. 拉取服务端TLS证书
使用系统原生HttpsURLConnection即可直接获取服务端返回的证书链,无需引入老旧的HttpClient组件,示例代码如下:
HttpsURLConnection conn = null; try { URL url = new URL("待校验的目标URL"); conn = (HttpsURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); // 发起连接 conn.connect(); // 获取服务端证书链,数组第一个元素即为服务端叶子证书 Certificate[] certs = conn.getServerCertificates(); X509Certificate serverCert = (X509Certificate) certs[0]; // 后续校验逻辑基于serverCert执行 } catch (IOException e) { // 连接异常处理逻辑 } finally { if (conn != null) { conn.disconnect(); } }
注意:不要为了连接成功随意修改默认TrustManager、绕过系统默认SSL校验逻辑,避免引入安全风险
2. 提取证书subject字段
直接调用X509Certificate自带的方法即可获取:
// 直接获取完整的subject字段字符串 String fullSubject = serverCert.getSubjectX500Principal().getName(); // 如果需要提取单个字段(比如通用名CN)可以遍历X500Principal的属性字段实现
3. 校验证书有效期
系统API直接提供了有效期校验方法,无需自行解析时间字段:
try { // 校验证书是否在有效期内,过期/未生效都会抛出对应异常 serverCert.checkValidity(); } catch (CertificateExpiredException e) { // 证书已过期处理逻辑 } catch (CertificateNotYetValidException e) { // 证书未生效处理逻辑 }
4. OCSP有效性校验
Android 7.0(API 24)及以上系统自带OCSP校验能力,直接使用CertPathValidator配置OCSP参数即可实现自动查询,无需手动构造请求:
// 配置校验参数 PKIXParameters params = new PKIXParameters(TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) .getTrustManagers()[0].getAcceptedIssuers()); // 开启OCSP校验 params.setRevocationEnabled(true); Security.setProperty("ocsp.enable", "true"); // 构造证书路径 List<Certificate> certList = Arrays.asList(certs); CertPath certPath = CertificateFactory.getInstance("X.509").generateCertPath(certList); // 执行校验 CertPathValidator validator = CertPathValidator.getInstance("PKIX"); validator.validate(certPath, params);
如果需要兼容API 24以下版本,可以引入BouncyCastle加密库,手动从证书的Authority Information Access扩展字段提取OCSP服务地址,构造OCSP请求发送并解析响应即可。
内容的提问来源于stack exchange,提问作者Stephen Fong
相关产品推荐
相关产品推荐

