当前位置: 首页 > news >正文

视频网站做视频容易火/电商网站卷烟订货流程

视频网站做视频容易火,电商网站卷烟订货流程,58同城做网站推广好不好,北京电商网站开发费用漏洞描述 对于数字证书相关概念、Android 里 https 通信代码就不再复述了,直接讲问题。缺少相应的安全校验很容易导致中间人攻击,而漏洞的形式主要有以下3种: 自定义X509TrustManager。在使用HttpsURLConnection发起 HTTPS 请求的时候&…

 

漏洞描述

对于数字证书相关概念、Android 里 https 通信代码就不再复述了,直接讲问题。缺少相应的安全校验很容易导致中间人攻击,而漏洞的形式主要有以下3种:

  • 自定义X509TrustManager。在使用HttpsURLConnection发起 HTTPS 请求的时候,提供了一个自定义的X509TrustManager,未实现安全校验逻辑,下面片段就是常见的容易犯错的代码片段。如果不提供自定义的X509TrustManager,代码运行起来可能会报异常(原因下文解释),初学者就很容易在不明真相的情况下提供了一个自定义的X509TrustManager,却忘记正确地实现相应的方法。本文重点介绍这种场景的处理方式。
TrustManager tm = new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {//do nothing,接受任意客户端证书}public void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException {//do nothing,接受任意服务端证书}public X509Certificate[] getAcceptedIssuers() {return null;}
};sslContext.init(null, new TrustManager[] { tm }, null);
  • 自定义了HostnameVerifier。在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。如果回调内实现不恰当,默认接受所有域名,则有安全风险。代码示例。
HostnameVerifier hnv = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {// Always return true,接受任意域名服务器return true;}
};
HttpsURLConnection.setDefaultHostnameVerifier(hnv);
  • 信任所有主机名。
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

修复方案

分而治之,针对不同的漏洞点分别描述,这里就讲的修复方案主要是针对非浏览器App,非浏览器 App 的服务端通信对象比较固定,一般都是自家服务器,可以做很多特定场景的定制化校验。如果是浏览器 App,校验策略就有更通用一些。

  • 自定义X509TrustManager。前面说到,当发起 HTTPS 请求时,可能抛起一个异常,以下面这段代码为例(来自官方文档):
try {URL url = new URL("https://certs.cac.washington.edu/CAtest/");URLConnection urlConnection = url.openConnection();InputStream in = urlConnection.getInputStream();copyInputStreamToOutputStream(in, System.out);
} catch (MalformedURLException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}
private void copyInputStreamToOutputStream(InputStream in, PrintStream out) throws IOException {byte[] buffer = new byte[1024];int c = 0;while ((c = in.read(buffer)) != -1) {out.write(buffer, 0, c);}
}

它会抛出一个SSLHandshakeException的异常。

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:322)at com.android.okhttp.Connection.upgradeToTls(Connection.java:201)at com.android.okhttp.Connection.connect(Connection.java:155)at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199)at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25)at me.longerian.abcandroid.datetimepicker.TestDateTimePickerActivity$1.run(TestDateTimePickerActivity.java:236)
Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:318)at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:219)at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:114)at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:550)at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:318)... 10 more
Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.... 16 more

Android 手机有一套共享证书的机制,如果目标 URL 服务器下发的证书不在已信任的证书列表里,或者该证书是自签名的,不是由权威机构颁发,那么会出异常。对于我们这种非浏览器 app 来说,如果提示用户去下载安装证书,可能会显得比较诡异。幸好还可以通过自定义的验证机制让证书通过验证。验证的思路有两种:

方案1

不论是权威机构颁发的证书还是自签名的,打包一份到 app 内部,比如存放在 asset 里。通过这份内置的证书初始化一个KeyStore,然后用这个KeyStore去引导生成的TrustManager来提供验证,具体代码如下:

try {CertificateFactory cf = CertificateFactory.getInstance("X.509");// uwca.crt 打包在 asset 中,该证书可以从https://itconnect.uw.edu/security/securing-computer/install/safari-os-x/下载InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt"));Certificate ca;try {ca = cf.generateCertificate(caInput);Log.i("Longer", "ca=" + ((X509Certificate) ca).getSubjectDN());Log.i("Longer", "key=" + ((X509Certificate) ca).getPublicKey();} finally {caInput.close();}// Create a KeyStore containing our trusted CAsString keyStoreType = KeyStore.getDefaultType();KeyStore keyStore = KeyStore.getInstance(keyStoreType);keyStore.load(null, null);keyStore.setCertificateEntry("ca", ca);// Create a TrustManager that trusts the CAs in our KeyStoreString tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);tmf.init(keyStore);// Create an SSLContext that uses our TrustManagerSSLContext 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();
}

这样就可以得到正确的输出内容:

<html>
<head>
<title>UW Services CA Test Page</title>
</head>
<body>
<h2>
UW Services CA test page
</h2>
<p>
<b>QUESTION</b>:
Did you arrive here without any security alerts or warnings?</p>
<ul>
<p>
<li>
<b>YES</b> - This test page uses a certificate issued by the
UW Services Certificate Authority. If you reached this page
without any alerts or warnings from your browser, you
have successfully installed the UW Services CA Certificate
into your browser.
<p>
<li>
<b>NO</b> - If your browser warned you about the validity of this
test page's security certificate, or the certificate
authority is unrecognized, you may not have successfully
installed the UW Services CA Certificate.
<p>
</ul>
<form action="https://www.washington.edu/computing/ca/" method=get>
<input type=submit value="Return to the Install Page">
</form>
</body>
</html>

如果你用上述同样的代码访问 https://www.taobao.com/ 或者 https://www.baidu.com/ ,则会抛出那个SSLHandshakeException异常,也就是说对于特定证书生成的TrustManager,只能验证与特定服务器建立安全链接,这样就提高了安全性。如之前提到的,对于非浏览器 app 来说,这是可以接受的。

方案2

同方案1,打包一份到证书到 app 内部,但不通过KeyStore去引导生成的TrustManager,而是干脆直接自定义一个TrustManager,自己实现校验逻辑;校验逻辑主要包括:

  • 服务器证书是否过期
  • 证书签名是否合法
try {CertificateFactory cf = CertificateFactory.getInstance("X.509");// uwca.crt 打包在 asset 中,该证书可以从https://itconnect.uw.edu/security/securing-computer/install/safari-os-x/下载InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt"));final Certificate ca;try {ca = cf.generateCertificate(caInput);Log.i("Longer", "ca=" + ((X509Certificate) ca).getSubjectDN());Log.i("Longer", "key=" + ((X509Certificate) ca).getPublicKey());} finally {caInput.close();}// Create an SSLContext that uses our TrustManagerSSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL");context.init(null, new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain,String authType)throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain,String authType)throws CertificateException {for (X509Certificate cert : chain) {// Make sure that it hasn't expired.cert.checkValidity();// Verify the certificate's public key chain.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();}}}@Overridepublic 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();
}

同样上述代码只能访问 certs.cac.washington.edu 相关域名地址,如果访问 https://www.taobao.com/ 或者 https://www.baidu.com/ ,则会在cert.verify(((X509Certificate) ca).getPublicKey());处抛异常,导致连接失败。

  • 自定义HostnameVerifier,简单的话就是根据域名进行字符串匹配校验;业务复杂的话,还可以结合配置中心、白名单、黑名单、正则匹配等多级别动态校验;总体来说逻辑还是比较简单的,反正只要正确地实现那个方法。
HostnameVerifier hnv = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {//示例if("yourhostname".equals(hostname)){  return true;  } else {  HostnameVerifier hv =HttpsURLConnection.getDefaultHostnameVerifier();return hv.verify(hostname, session);}}
};
  • 主机名验证策略改成严格模式
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

参考资料

  • 窃听风暴: Android平台https嗅探劫持漏洞
  • Android证书信任问题与大表哥
  • Android HTTPS中间人劫持漏洞浅析
  • 数字证书及其在安全测试中的应用
  • wooyun-2014-080117
  • WooYun-2014-79358
  • SSL证书百科
  • Security with HTTPS and SSL
  • 为你的安卓应用实现自签名的 SSL 证书
  • Android HTTPS SSL双向验证
  • DRD19. Properly verify server certificate on SSL/TLS

 

苹果核————Android App 安全的HTTPS 通信

 

http://www.lbrq.cn/news/1052047.html

相关文章:

  • 宿州市做网站的公司/设计网络推广方案
  • 如何更好的建设和维护网站/信息流优化师
  • 外贸流程的基本流程/六盘水seo
  • 做网站都要掌握什么软件/企业网站设计毕业论文
  • seo工具优化/seo提供服务
  • 网站建设 banner/宁波seo公司推荐
  • 水利建设经济定额站网站/公司优化是什么意思
  • 合肥企业网站建设/深圳网络推广公司哪家好
  • 如何做推广最有效果/长沙企业关键词优化哪家好
  • 银川做网站服务/网络营销站点推广的方法
  • 高校网站建设滞后/百度网站排名优化软件
  • 网上花店 网站源代码/个人接外包项目平台
  • 吉安公司做网站/制作网页模板
  • 黄骅做网站价格/广告咨询
  • 公司后台网站怎么做/口碑营销公司
  • 做网站不会框架/企业文化培训
  • 西安网站制作中心/网游推广员
  • 个人主页建站/百度今日小说排行榜
  • 网站审核时间/搜索引擎优化的例子
  • 顺德网站开发招聘/无锡网站制作
  • html5转wordpress主题/seo标题优化裤子关键词
  • 在婚恋网站上做红娘怎么样/不受国内限制的浏览器下载
  • 聊城做网站的公司平台/快速建站平台
  • 网站花瓣飘落的效果怎么做/安徽网站推广优化
  • vue做网站/seo如何优化关键词
  • 温州建设小学网站首页/东莞今天新增加的情况
  • 网站开发图片存哪里/seo关键词优化平台
  • 怎样维护网站建设/目前最新的营销方式有哪些
  • 还有多少用.net做网站的/成都seo培训班
  • 郑州手机网站制作/app001推广平台官网
  • 扣证件照要点
  • AI_RAG
  • 轻量化阅读应用实践:21MB无广告电子书阅读器测评
  • kettle插件-kettle MinIO插件,轻松解决文件上传到MinIO服务器
  • 前端视角下关于 WebSocket 的简单理解
  • 【unitrix数间混合计算】2.4 二进制整数标准化处理(src/number/normalize/int_normalize.rs)