cover

几天前,外媒针对中国的移动应用 UC 浏览器发布了一篇质疑报道,称其存在信息传输加密问题,详见《UC浏览器中文版被发现会收集发送用户隐私数据 》《NSA劫持访问Google Play商店的连接,利用UC浏览器泄露的信息》

首先吐槽

要是有机会见到斯诺登,一定要请他吃顿饭。1.我俩长得像亲兄弟;2.要是没有他,安全的工作,都可以被“高人”轻轻松松归结为:“用户不可能系列,都是被迫害者狂系列,什么理论上都可以系列,等于废话”。现实中的笑话真是幽默到我都静静地看着不说话。

步入正题

其实信息传输加密问题并非个案,大大小小的厂商都存在明文传输或加密级别不过等问题。比如百度浏览器传输隐私数据只是简单用 so 文件来加密,加密的处理也只是做了倒序;QQ 浏览器直接明文传输隐私数据;京东移动端网页登录时直接明文传输密码……

再联系之前百度统计被底层运营商流量劫持去攻击Github,还得吃哑巴亏,真是流氓见流氓,两眼泪汪汪呀。

有没有更好的解决方案?

有,全站https!

谷歌娘早早在2014年8月就发布公告:“HTTPS as a ranking signal",宣布全线产品支持 https ,且调整搜索引擎算法,采用 https 加密的网站将在搜索结果中排名靠前。

对于 https 加密的好处和必要性就不再这里多做说明,百度在今年的《百度统计js被劫持用来DDOS Github 》后,也全站进入了 https 时代,对此,推荐看下知乎上的讨论《如何看待百度全站搜索进入 HTTPS 时代?》

干起来!

作为关注移动安全的人员我怎能落后?于是乎,我用了一个晚上的时间,将博客也全站进入了 https 。思路很简单,就是通过 Nginx 配置+数字证书机构 ssl 认证就好了。

对于 Ghost 的 Nginx 配置,可以参考“How to setup SSL for self-hosted Ghost”

下面是我的 Ghost 的 Nginx 配置:


server {  
    listen 80;
    server_name androidtest.org; 
    return 301 https://$host$request_uri;
}
server {  
        listen 443 ssl; 
        server_name androidtest.org;
        ssl_certificate        /root/server.crt;
        ssl_certificate_key    /root/server.key;
        location / {
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   Host      $http_host;
                proxy_pass         http://127.0.0.1:2368;
                client_max_body_size 35m;
        }
}

其中, sslcertificate 和 sslcertificate_key 分别指派数字证书机构颁发给你的证书请求文件和私用密钥位置。

注意:认证可以不花钱!

ssl 证书需要钱,一年大概要交几十元到几千元的认证费。startcom 是经过微软认证的全球唯一免费HTTPS证书颁发机构,可以免费认证,教程见《免费 StartSSL 证书申请详细步骤和 IIS 中的 SSL 设置》

注意:百度已经可以收录 https 网页且搜索结果靠前!

百度在2015年5月25号发布《百度开放收录 https 站点公告》

亲爱的网站管理员:从今天开始,百度放开对 https 站点的收录,https 站点不需要再做任何额外的工作就可以被百度顺利抓收。在此之前,百度站长学院曾发表文章,指导https站点制作 http 可访问版便于百度抓收。技术升级后,百度视同一个域名的 http 版和 https 版为一个站点,优先收录 https 版。建议站长关闭 http 版,或者将 http 页面直接跳转到对应的https页面。

如果你仍要检查自己的 https 站点是否能被百度正常收录,可以使用百度的《百度站长工具:抓取诊断》,如果正常抓取,会返回HTTP头和页面内容。 full-img

注意:所有的页面、图片、视频、js的引用都必须是 https !

你只有将页面本身和所有引用的资源(图片、js)都是 https 的,浏览器才认为是安全的,只要其中引用了非安全资源(即使图片),浏览器都会给出不安全的提示,特别是有 js 的情况。参看Chrome对混合脚本危害的说明与提示:“Trying to end mixed scripting vulnerabilities”

如果浏览器提示不安全,那样我们就达不到原来目的了。

注意:startssl证书在手机上访问会不受信任!

电脑上chrmoe、IE、firefox下访问正常,但是在手机上访问就提示证书不受信任,微信上打开网页直接显示空白页。

查看了android和ios的受信任凭据列表,startcom也在名单中,网络查了资料,才明白:

有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另外一些浏览器却接受它们。这是由 于证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构授权代为签发证书, 但是它们自己却不被广泛认知,所以有些客户端不予识别。针对这种情况,证书认证机构提供一个证 书链的包裹,用来声明众所周知的认证机构和自己的关系,需要将这个证书链包裹与服务器证书合并 成一个文件。

也就是说StartCom的Class 1就是个中间签发机构,而手机的系统并不认识它们。那么按照文章里提供的方法,只需要将StartCom的CA证书链合并到我们的证书里面,就可以搞定了。

http://www.startssl.com/certs/上,找到了 StartCom 的证书链包裹,文件名为 ca-bundle.crt。下载下来以后,用 Linux 的 cat 指令把它们和我的证书合并。


cat  service.crt ca-bundle.crt >  server.new.crt

非常重要的一点是,执行cat命令时,自己的证书一定要放在 ca-bundle.crt 的前面,否则上传到服务器后会出现密钥验证错误。

做好新证书后先别急,由于是cat的两个证书文件,所以两个证书文件拼接处是没有换行符的。


vim service.new.crt

编辑一下证书文件。将:


-----END CERTIFICATE----------BEGIN CERTIFICATE-----

在正中间加个空格,使其变成:


-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

将service.new.crt文件替换原来掉原服务器的service.crt文件,重启服务后然后再在手机上测试即正常了。

结尾

如果正常,那么就大功告成了。

支付宝扫码打赏 微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章

蔡培培's Picture
蔡培培

精于规划,热爱研究,自我实现者。目前专注于安卓测试架构、测试开发与移动安全。

Guangzhou「广州」 http://androidtest.org