0. HTTPS通信原理
HTTPS是 HTTP over SSL/TLS,即在HTTP与TCP之间增加了一个安全套接层SSL/TLS
详细原理请参考 : http://blog.jobbole.com/110354/
1. 浏览器
虽然很多网站都是使用了HTTPS,以保证数据不被修改或被第三方看见,但是由于HTTPS有一些隐含的缺陷或者服务器验证不严格这些原因,HTTPS被劫持还是有可能的。
- ssl劫持
https要避免劫持,前提是必须用受信任的SSL证书(权威CA机构颁发的SSL证书)。使用自签证书,浏览器会给出警告提示“此网站安全证书存在问题”。很多用户不明白这是什么意思,就点了继续,这就有可能允许了黑客的伪证书,HTTPS流量因此被劫持。

这就要说到为什么Fiddler等抓包工具能解密https的包了?通过伪装CA证书来欺骗浏览器和服务器,在真正的https服务器面前伪装成浏览器,在浏览器面前伪装成https服务器,来截获通信解密HTTPS。而使用Fiddler需要先在设备上安装一个Fiddler自签发的CA root证书,否则浏览器是不会相信Fiddler发送过来的伪造的网站证书的。
解决办法:网站使用权威机构颁发的证书,用户在看到“此网站安全证书存在问题”时应停止访问。
- SSLStrip攻击
也称https降维攻击,攻击者拦截用户流量后,欺骗用户与攻击者进行http通信,攻击者与服务器保持正常(http或者https)通信,从而获取用户信息。
使用sslstrip工具,再配合attercap进行arp欺骗即可进行SSLStrip攻击(详情请看:http://www.linuxde.net/2011/11/2522.html)
解决办法:网站在配置HTTPS服务的时候加上HTTP Strict Transport Security
配置项;或者是在代码中将所有HTTP的请求强制转移到HTTPS上,使用URL REWRITE也可以达到同样的效果。对于用户登录ID和密码等关键信息,在发送前先经过加密处理。另外用户在访问支持https的网站时,注意观察证书是否安全。
2. Android
Android https开发中常见的安全缺陷:
- 在自定义实现X509TrustManager时,checkServerTrusted中没有检查证书是否可信
- 在重写WebViewClient的onReceivedSslError方法时,忽略证书验证错误信息继续加载页面
- 在自定义实现HostnameVerifier时,没有在verify中严格证书校验
- 在setHostnameVerifier中使用ALLOW_ALL_HOSTNAME_VERIFIER,信任所有Hostname

解决办法:检查服务器端证书是否有问题,要和app预埋的证书作对比。对服务器证书域名进行强校验(STRICT_HOSTNAME_VERIFIER)。另外并不是说强校验了就不能让别人抓到包,而是在窃听上有难度,仍然可以HOOK绕过校验。
3. Webview
目前有很多应用用webview来加载h5页面,如果服务端使用的是可信的CA颁发的证书,在 webView.setWebViewClient(webviewClient) 时重载 WebViewClient的onReceivedSslError() ,如果出现证书错误,直接调用handler.proceed()会忽略错误继续加载证书有问题的页面,如果调用handler.cancel()可以终止加载证书有问题的页面,证书出现问题了,可以提示用户风险,让用户选择加载与否,如果是需要安全级别比较高,可以直接终止页面加载,提示用户网络环境有风险。
详细参考:http://www.cnblogs.com/alisecurity/p/5939336.html