博客
关于我
Android通信安全之HTTPS
阅读量:796 次
发布时间:2023-03-28

本文共 5391 字,大约阅读时间需要 17 分钟。

HTTPS通信中的安全漏洞及修复方案
在Android应用中处理HTTPS通信时,确保安全性至关重要。近期我们发现了一项与数字证书验证相关的安全漏洞,这一问题最初在2014年被乌云平台暴露,但由于各种原因未能及时解决。以下将详细分析这一问题的成因、表现形式以及修复方案。

问题描述

HTTPS通信的安全性依赖于SSL协议中的证书验证机制。如果缺乏适当的安全校验,攻击者可能利用中间人攻击的方式窃取敏感信息。本文将重点介绍两种常见的漏洞形式。

自定义X509TrustManager

在HTTPS通信中,开发者可能会提供一个自定义的X509TrustManager来实现特定的验证逻辑。然而,如果没有正确实现安全校验,会导致系统接受任意客户端或服务器证书,从而引发安全隐患。例如,在新浪微博分享SDK中的代码片段中,提供了一个空置的X509TrustManager,导致缺乏基本的证书验证。
TrustManager tm = new X509TrustManager() {    @Override    public void checkClientTrusted(X509Certificate[] chain, String authType)            throws CertificateException {              //do nothing,接受任意客户端证书    }    @Override    public void checkServerTrusted(X509Certificate[] chain, String authType)            throws CertificateException {              //do nothing,接受任意服务端证书    }    @Override    public X509Certificate[] getAcceptedIssuers() {        return null;    }};sslContext.init(null, new TrustManager[] { tm }, null);

自定义HostnameVerifier

此外,在SSL握手过程中,主机名验证也是一个关键环节。如果没有正确实现主机名验证,攻击者可能伪造服务器的标识主机名,进而实施中间人攻击。例如,提供一个总是返回true的HostnameVerifier,会导致系统接受任意域名,严重威胁通信安全。
HostnameVerifier hnv = new HostnameVerifier() {  @Override  public boolean verify(String hostname, SSLSession session) {    // Always return true,接受任意域名服务器    return true;  }};HttpsURLConnection.setDefaultHostnameVerifier(hnv);

修复方案

针对上述漏洞,我们可以采取以下措施来提升HTTPS通信的安全性。

解决方案一

一种有效的修复方法是将权威的证书打包到应用程序中,并使用这些证书初始化自己的KeyStore和TrustManager。通过这种方式,可以确保只允许与特定服务器建立连接,从而防止中间人攻击。具体实现步骤如下:
try {  CertificateFactory cf = CertificateFactory.getInstance("X.509");  InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt"));  Certificate ca;  try {      ca = cf.generateCertificate(caInput);  } finally {      caInput.close();  }  KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());  keyStore.load(null, null);  keyStore.setCertificateEntry("ca", ca);  TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  tmf.init(keyStore);  SSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL");  context.init(null, tmf.getTrustManagers(), null);  URL url = new URL("https://certs.cac.washington.edu/CAtest/");  HttpsURLConnection urlConnection =          (HttpsURLConnection)url.openConnection();  urlConnection.setSSLSocketFactory(context.getSocketFactory());  InputStream in = urlConnection.getInputStream();  copyInputStreamToOutputStream(in, System.out);} catch (CertificateException e) {  e.printStackTrace();} catch (IOException e) {  e.printStackTrace();} catch (NoSuchAlgorithmException e) {  e.printStackTrace();} catch (KeyStoreException e) {  e.printStackTrace();} catch (KeyManagementException e) {  e.printStackTrace();} catch (NoSuchProviderException e) {  e.printStackTrace();}

这种方式确保了只有与特定服务器通信时,才能成功验证证书,从而提升安全性。

解决方案二

另一种修复方法是直接自定义TrustManager,实现详细的证书验证逻辑。这种方式适用于需要高度定制化验证的场景。具体实现如下:
try {  CertificateFactory cf = CertificateFactory.getInstance("X.509");  InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt"));  final Certificate ca;  try {      ca = cf.generateCertificate(caInput);  } finally {      caInput.close();  }  SSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL");  context.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 {                  for (X509Certificate cert : chain) {                      cert.checkValidity();                      try {                          cert.verify(((X509Certificate) ca).getPublicKey());                      } catch (NoSuchAlgorithmException e) {                          e.printStackTrace();                      } catch (InvalidKeyException e) {                          e.printStackTrace();                      } catch (NoSuchProviderException e) {                          e.printStackTrace();                      } catch (SignatureException e) {                          e.printStackTrace();                      }                  }              }              @Override              public X509Certificate[] getAcceptedIssuers() {                  return new X509Certificate[0];              }          }  }, null);  URL url = new URL("https://certs.cac.washington.edu/CAtest/");  HttpsURLConnection urlConnection =          (HttpsURLConnection)url.openConnection();  urlConnection.setSSLSocketFactory(context.getSocketFactory());  InputStream in = urlConnection.getInputStream();  copyInputStreamToOutputStream(in, System.out);} catch (CertificateException e) {  e.printStackTrace();} catch (IOException e) {  e.printStackTrace();} catch (NoSuchAlgorithmException e) {  e.printStackTrace();} catch (KeyManagementException e) {  e.printStackTrace();} catch (NoSuchProviderException e) {  e.printStackTrace();}

这种方式允许开发者根据具体需求,自定义验证逻辑,例如验证证书是否过期或签名是否合法,从而进一步提升安全性。

主机名验证优化

除了上述方法,还可以通过设置严格的主机名验证策略来防止中间人攻击。例如,可以使用SSLSocketFactory的STRICT_HOSTNAME_VERIFIER选项,确保主机名严格匹配,避免伪造域名的情况。
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

通过这些措施,我们可以有效防范HTTPS通信中的安全漏洞,确保数据传输的安全性。

转载地址:http://cshfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现kth order statistick阶统计量算法(附完整源码)
查看>>
Objective-C实现LRU 缓存算法(附完整源码)
查看>>
Objective-C实现lstm prediction预测算法(附完整源码)
查看>>
Objective-C实现Luhn (Mod 10)Algorithm算法(附完整源码)
查看>>
Objective-C实现max subarray sum最大子数组和算法(附完整源码)
查看>>
Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
查看>>
Objective-C实现max_heap最大堆算法(附完整源码)
查看>>
Objective-C实现md5算法(附完整源码)
查看>>
Objective-C实现memoization优化技术算法(附完整源码)
查看>>
Objective-C实现memset函数功能(附完整源码)
查看>>
Objective-C实现merge insertion sort合并插入排序算法(附完整源码)
查看>>
Objective-C实现merge sort归并排序算法(附完整源码)
查看>>
Objective-C实现mergesort归并排序算法(附完整源码)
查看>>
Objective-C实现miller rabin米勒-拉宾素性检验算法(附完整源码)
查看>>
Objective-C实现Miller-Rabin素性测试程序(附完整源码)
查看>>
Objective-C实现Miller-Rabin素性测试程序(附完整源码)
查看>>
Objective-C实现MinhashLSH算法(附完整源码)
查看>>
Objective-C实现MinHeap最小堆算法(附完整源码)
查看>>
Objective-C实现multilayer perceptron classifier多层感知器分类器算法(附完整源码)
查看>>
Objective-C实现n body simulationn体模拟算法(附完整源码)
查看>>