Https证书校验不当引起的安全问题

1. 使用Webview进行HTTPs通信

Android系统内置了一些可信机构办法的证书,可用于作HTTPs证书校验。实际上,使用Webview组件进行HTTPs通信,其证书验证环节也是系统默认会去做的。若发现证书不合法,Webview将显示一个空白页面,其错误在onReceivedSslError()这个方法里进行处理。使用Webview进行HTTPs通信应当遵循如下安全规范:
1) onReceivedSslError()方法里不能简单地用proceed()方法进行处理,建议给用户一定的提示(如“SSL证书错误,是否继续连接”等)。
这里给出错误的代码示例。

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
    // 只简单地调用proceed()方法,忽略证书错误问题
    paramSslErrorHandler.proceed();
}

一般来说,使用Webview连接带有可信机构颁发证书的HTTPs站点,onReceivedSslError()方法里无需作任何处理(系统默认是拒绝连接的),这里给出正确的示例代码。

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
    // Do nothing
    // 效果同 paramSslErrorHandler.cancel();
}

2. X509TrustManager

X509TrustManager用于实现SSL证书的安全校验,若使用不当,将导致APP对SSL证书不作校验,从而使黑客有了中间人攻击的可乘之机。开发者经常犯的错误有如下:
 自定义X509TrustManager,且不做任何校验逻辑,一般为空实现;
这里给出常见的自定义X509TrustManager的错误示例代码(以使用HttpsURLConnection进行HTTPs连接的情况为例)。

SSLContext localSSLContext = SSLContext.getInstance("TLS");
TrustManager[] arrayOfTrustManager = new TrustManager[1];
// 自定义X509TrustManager
arrayOfTrustManager[0] = new MyTrustManager();
localSSLContext.init(null, arrayOfTrustManager, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(localSSLContext.getSocketFactory());
HttpsURLConnection localHttpsURLConnection = (HttpsURLConnection) new
URL(paramString).openConnection();
……
class MyTrustManager implements X509TrustManager{
   
   
    // 不作任何校验
  public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) {}
        // 不作任何校验
    public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) {}
    // 返回null
    public X509Certificate[] getAcceptedIssuers(){
        return null;
    }
}

使用上述方式进行HTTPs通信,将存在中间人攻击的可能。由于缺乏证书校验机制,黑客可以通过使用自签名证书,结合DNS欺骗,使用户访问恶意页面。因此,使用HttpsURLConnection或HttpClient进行HTTPs通信时,需要验证证书的合法性。这里把HTTPs站点作分类:
A. 带有可信机构颁发证书的HTTPs站点;
B. 带有自签名证书的HTTPs站点。
对于A类站点,可借助Android系统自带的证书校验机制,开发者无需自己实现任何代码;对于B类站点,则需要把证书文件内置到apk中,根据证书keystore得到用于校验证书内容的TrustManager,并设置在SSLContext当中。
使用HttpsURLConnection或HttpClient进行HTTPs通信,需要遵循如下安全规范:
1) 访问A类站点时,不要自定义X509TrustManager;
2) 访问B类站点时,把证书文件打包到apk中,并根据证书的keystore生成TrustManager。
这里给出使用HttpsURLConnection访问A类站点时的示例代码。

SSLContext localSSLContext = SSLContext.getInstance("TLS");
// 不要自定义X509TrustManager
localSSLContext.init(null, null, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(localSSLContext.getSocketFactory());
HttpsURLConnection localHttpsURLConnection = (HttpsURLConnection) new
URL(paramString).openConnection();
这里给出使用HttpsURLConnection访问B类站点时的示例代码。
// 根据证书文件生成keystore
private KeyStore certTrusted(Context context) throws Exception {
    // 从资源文件中获取.cer证书文件
       AssetManager am = context.getAssets()
### 解决部署 DeepSeek 大模型过程中遇到的 TLS 证书验证失败问题 #### 可能原因分析 TLS 证书验证失败通常由以下几个常见因素引起: - **自签名证书或不受信任的 CA**:如果使用的服务器端证书是由内部 CA 或者自行签发,则客户端默认不会信任该证书[^1]。 - **过期或不匹配域名的证书**:当证书已过有效期或是通配符证书与实际访问地址不符时,也会触发此类错误。 - **网络代理干扰**:某些企业环境下的 HTTP(S) 代理可能会篡改 HTTPS 连接中的 SSL/TLS 握手过程,从而导致认证失败。 - **系统时间不同步**:操作系统的时间设置异常可能导致无法正确校验 X.509 数字证书的有效期限。 #### 解决策略 针对上述情况,可采取如下措施解决问题: ##### 配置可信根证书库 对于使用私有 CA 的场景,在应用启动前需确保加载了包含相应颁发机构在内的完整链路的信任存储文件。可以通过修改应用程序配置或将额外的 PEM 编码形式公钥导入到运行环境中实现这一点。 ```bash export REQUESTS_CA_BUNDLE=/path/to/custom/cacert.pem ``` ##### 跳过特定主机名检查(仅限开发测试) 在非生产环境下为了快速排除其他潜在变量影响,可以选择临时禁用对目标站点的身份确认逻辑。注意这会降低安全性因此不适合长期在线业务采用。 ```python import requests from urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) response = requests.get('https://example.com', verify=False) print(response.status_code) ``` ##### 更新本地日期与时区同步机制 保持计算机系统的实时时钟处于准确状态有助于避免因密钥生命周期管理不当而引发的一系列连锁反应。定期执行 NTP 协议请求并与权威授时源进行比对调整能够有效预防这类隐患的发生。 ```shell sudo timedatectl set-ntp true timedatectl status | grep "System clock synchronized" ``` ##### 安全建议 始终优先考虑获取正式渠道发布的合法商业级安全套件产品;遵循官方文档指导完成必要的安装部署流程;及时跟踪上游维护团队发布的技术通告并尽快落实补丁更新工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值