Boss说,我们买了个权威证书,不如做全站式的https吧,让用户打开主页就能看到受信任的绿标。于是我们就开始了填坑之旅。
【只上主域好不好?】
不好。。。console会报出一大堆warning因为图片域没有https~浏览器证书符号也不是绿色的~
【在哪里解密SSL?】
大网站都是架构复杂的啦~各层负载均衡和动静分离~其中最经典的就是图片和应用分离,这也导致了我们要给两个域配证书。
想过在NginX配,好处是在一台机上只配一个证书,坏处是多个机器的配置难以管理,所以只好在前面HA层配~
具体怎么配网上很多教程啦~大概就是配置指向一个文本文件,里面是域名和证书的列表。
【测试环境怎么办?】
凉拌呗~用openssl生成几个自签证书就结了~然后自己手动导入到浏览器就可以愉快玩耍了~
大概会是这样
有几个要点:
1.刚开始的私钥是有密码保护的,但是放在服务器中一般是直接使用的,所以要把该私钥转换成无密码保护的。
2.pem文件等于:crt证书+私钥,密码体系pem、X509之类的各种国际标准就不展开了,总之就是些机构信息、密钥、摘要等。
3.想偷懒的可以签给*.主域.com,但这样就没法提前在测试环境踩坑填坑了,多证书的情况终归是不同的。
4.密钥和证书的400权限设置,非生产环境可随意~
【HSTS好不好?】
当然好,全站式https就该开启HSTS严格传输安全,直接在浏览器就帮你把http转为https请求,而不用301回来跳转。
然而如果有个别页面确实还没上https,那就没办法了~
【烂鬼证书商,在手机浏览器打不开?】
怎么可能啊,证书供应商是权威机构,怎么会在安卓里没根证书啊?一般排查之后发现,安卓里确实是有证书商的根证书的。再几番查资料之后才发现,要配置ca-bundle证书链,也就是受信任的根证书层层签下来的这个依赖关系~手机浏览器也能愉快玩耍了~
【你的https安全性如何?】
举个百度的栗子(也不知道ip对不对,不是a.shifen.com那个~)
https://www.ssllabs.com/ssltest/analyze.html?d=baidu.com&s=103.235.46.39
我们网站就类似这样。。。神马贵宾犬漏洞啊心脏流血漏洞啊全都露出来了~读完一大堆英文警告,说什么会被中间人攻击利用之类之类的,最后其实就一句话。。。要升级openssl版本,要提高TSL版本。。。
可以看看这篇文章
【要不要用SNI?】
买CDN服务的时候云服务商问要不要非SNI支持啊?SNI是什么呢?Server Name Indication是TSL协议的扩展,用于支持一个IP绑定多个证书。所以非SNI,就是IE7等旧版本浏览器的兼容问题。。。请用现代浏览器。。。
【客户端报错peer not authenticated】
浏览器、手机和一般客户端访问似乎是没问题的,然而天杀的某外部系统接入调用就出问题了。。。网上都说是没装证书,然而我们是权威证书啊怎么会~
然后我写了个简单的httpclient调用,在服务器端启动调用的返回是正常的,在IDE中启动调用就报SSL这个错误。
几番排查确认,在jdk1.7中运行正常,在jdk1.6中报错,这里用的httpclient是4.1。
然后两个怀疑,一个是httpclient或jdk中是否有什么bug,另一个是旧版jdk是否用了太旧的SSL协议而服务端不允许。
这个问题还有待验证和有待解决。欢迎大牛提建议。
至此,近似全站https就跑起来了~好多概念和操作细节就不一一展开了。
最后奉上阮大神对SSL/TSL的原理分析,篇幅不长,但是精要地解释了https握手和通信的过程。