SSL证书更换为Let’s Encrypt

  StartSSL的免费证书总不太稳定,尤其在Chrome下表现更是离奇,这不最近在将macOS Chrome升级到最新版的时候,花图影铺的一个二级域名证书就被列为不信任了,但根域名又是正常的,而在火狐或Safari或iOS 10中都是正常的,真是莫名其妙。正好最近Let’s Encrypt比较火,干脆趁这个国庆节将证书换一下。

1. 下载安装证书

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/
./letsencrypt-auto certonly --standalone --email admin@snapast.com -d snapast.com -d www.snapast.com -d abc.snapast.com

  这里Let’s Encrypt简化了安装步骤,只需要确保域名解析到本机服务器,并且未占用服务器的80和443端口即可创建成功,默认位置在/etc/letsencrypt/live/snapast.com里面,fullchain.pem即是公钥,包含证书链,privkey.pem私钥。

  需要注意的是,有二级域名未解析到本机的不可以,比如使用了CDN,临时改一下问题不大,本机有nginx之类的占用80端口的,也得临时停一下,反正很快,网络好的情况下几秒钟就可以了。如果站点流量大到几分钟都不能停,那想必也没必要用Let’s Encrypt了,毕竟一次申请的有效期也才三个月。

2. nginx配置

ssl_certificate                 /etc/letsencrypt/live/snapast.com/fullchain.pem;
ssl_certificate_key             /etc/letsencrypt/live/snapast.com/privkey.pem;

  配置好nginx,reload一下就生效了,CDN后台的证书也一并替换掉,大功告成。

为花图相册开启全站https

是否为花图相册开启全站https其实考虑已久:一来是发现目前越来越多的网站都走向了https,即便不是电子商务的网站,例如百度。二是服务器计算能力越来越强大,似乎也不必要在乎加解密,握手所消耗的这点资源。三是出于程序员思维,好东西自然要折腾一番,且不说在Chrome地址栏中绿色的scheme是多么的诱人。

1. SSL证书分类

SSL证书大致可以分为Class 1~5这五种,级别依次递增,数字越高,信用级别越高,自然收费也更高。
Class 1(DV),只验证域名真实性,即保证所访问的域名是真实有效的,这个级别的证书申请也是最简单的,只需提供域名管理者邮箱或者以域名为后缀的几个特定邮箱即可。通常用于个人或邮件。
Class 2(IV)验证域名和个人身份证明。
Class 3(OV)验证域名和组织机构信息。
Class 4(EV)电子商务,网上交易等。
Class 5私有组织或政府部门,比较少见。

这里虽然有等级之分,其实也就是准入门槛越来越高而已,增加了造假难度,但底层加密方式可以都是一样的。

2. 证书申请

这里不得不提到两家免费证书提供商,国内的Wosign和国外的StartSSL,这两家都有试用过,这里简单记录下使用过程:

Wosign的免费证书申请地址隐藏比较深,官网拉倒最下面才有个注册入口。由于是国内的,注册就容易多了,基本上顺着向导很容易就能拿到证书,而且提供的证书非常全面,涵盖了常用的几个服务器,包括Apache,Nginx,Tomcat等,可以说非常便捷。

StartSSL就麻烦多了,首先注册时候填写的资料必须是个人的真实的,或者说看起来要真实。其二需要人工审核,一般也很快,十分钟左右就能收到邮件。而这家最该死的设计就是以后的登录必须靠首次登陆所安装的证书来识别,因此需要备份好证书。可惜的是我这里Chrome下首次安装失败了,建议用IE。意味着我只要退出登录了就再也进不来了。不过并不妨碍继续申请域名证书,首先是验证域名,再申请证书,得到的私钥需要用openssl解密,或者在toolbox中在线解密。然后再下载他们家的sub class1证书附加到域名证书中,才可以正常使用。

在实际测试中,Wosign的免费证书顶级CA居然是StartSSL签发的,Wosign作为一个二级CA,有点奇怪,证书链比StartSSL多一层,理论上验证也要花费更多时间。

3. Nginx服务器配置

主要是增加443端口监听,别忘了在防火墙上也要允许通过443端口。开启ssl,很简单。ssl_ciphers可能还需要优化,目前来讲RC4算法已经不太安全了,可以禁用。由于加密所需要的握手次数和时间都增加不少,因此很有必要调节下ssl_session的缓存大小和超时时间。官方资料是1m cache大概能存储4000个会话,timeout 10m是十分钟。部分代码如下:

listen       80;
listen       443 ssl;
server_name  snapast.com www.snapast.com;

ssl			on;
ssl_certificate		/etc/nginx/ssl/ssl.crt;
ssl_certificate_key	/etc/nginx/ssl/ssl.key;
ssl_protocols		TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 		EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers	on;
ssl_session_cache	shared:SSL:10m;
ssl_session_timeout	10m;

开启后,还需要将非https请求从定向到https,这里我做了两步处理:首先host不等于snapast.com的转为snapast.com,即将带www的转为不带www。scheme不是https的转到带https,同时带上上下文和参数。

if ($host != 'snapast.com') {
rewrite ^/(.*)$ https://snapast.com/$1 permanent;
}

if ($scheme != "https") {
rewrite ^/(.*)$ https://snapast.com/$1 permanent;
}

4. 其他说明

Tomcat也可以开启http所访问,但由于都是内网,因此没必要再开启https了,但需要注意的是,在Tomcat看来还是http的请求,所以通过request.getScheme()得到的依然是http,凡有用到的需要注意一下,容易出现在拼接basePath的地方。

出于安全规范,全站https后,若有脚本等资源还是http引入的浏览器都会拒绝加载,而我之前用的51.la统计工具便不支持https,试过腾讯统计也不支持,目前发现百度统计可以用,因为他的脚本没有限定scheme。

到此就算完成了,欢迎访问花图相册看效果:https://snapast.com:cool: