网站上HTTPS

网站速度一直太快,哪怕上加了百度云减速以后还是快,只好上https。
建站初期没有上https,运营过一段时间后再上,还是有些许麻烦的。本站现在情况:
➤图片放在七牛,绑定了一个子域img.hqidi.com,这样就有一个问题,上https得用通配符证书,太贵。。
➤文章ID是绝对连续的,看这里
➤网站运行在阿里云的VPS上。
此次上https要达到的效果:
➤使用HTTP/2传输协议,原理之类的不多说,就一个字“”。
➤没钱买通配符证书,把原来在七牛的图片放到本地。
➤服务器不能裸奔,得套一层CDN。

HTTPS 升级步骤

获取证书

我的证书是从https://www.namecheap.com/购买的单域名证书,该网站有详细的文档指导你获取证书,过程不表,最后通过邮箱发来证书,最好使用国外邮箱。邮件里面有一句:
Thank you for placing your order. We are pleased to announce that your PositiveSSL Certificate for hqidi.com has been issued.
To help reduce domain name mismatch warnings, we have also included the domain name www.hqidi.com in your certificate.

就是说颁发的证书也适用于www.hqidi.com子域,以应付那些一定要加www访问的可爱人士。
邮箱附件就是证书文件,解压后得到两个文件,一个hqidi_com.ca-bundle是证书链,另外一个hqidi_com.crt就是证书了。

开启HTTP/2支持

Nginx官方文档里面写到,要支持HTTP/2,得两个必要条件,nginx版本至少是1.9.5,openssl版本至少是1.0.2。
看到这里,心急的朋友可能马上就想要升级openssl版本了,在生产环境,这是非常不可取的,openssl和系统的关联性很大,至少跟SSHD服务是密切相关的。若你冒然升级openssl,万一出现问题,那就是“机房那么大,你得去看看”。我们只需在编译nginx的时候,告诉编译程序把最新的openssl库也编译进去就行了。

cd download
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar xf openssl-1.1.0f.tar.gz

然后在nginx的源码目录重新configure,最主要的就是添加上--with-http_ssl_module --with-http_v2_module --with-openssl=/root/download/openssl-1.1.0f

./configure --user=www --group=www --prefix=/usr/local/nginx   --with-http_gzip_static_module --with-http_realip_module  --with-http_addition_module --with-http_ssl_module --with-http_v2_module --with-openssl=/root/download/openssl-1.1.0f
make

检查下是否正常编译进去了openssl-1.1

[root@hqidi nginx-1.12.0]# objs/nginx -V
nginx version: nginx/1.12.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled

可以看到 nginx 相关联的OpenSSL版本已经变成1.1.0f,把新编译出来的nginx移动到/usr/local/nginx/sbin目录,HTTP/2支持到此搞定。

图片问题

原来图片放在七牛,通过http://img.hqidi.com/1/whoami.gif引用,img.hqidi.com绑定在七牛的bucket上,后面的/1/是本博客的文章ID,最后是文件名。
现在要这样引用:https://hqidi.com/img/1/whoami.gif,这样就不用通配符证书了,因为我自己的PC上有跟七牛目录结构一样的一个备份,所以直接打包本地的img目录上传到网站根目录了事。

链接问题

直接动数据库,在改数据库前,后台常规设置中的“WordPress地址”和“站点地址”需要变更为https的方式。否则,改好数据库后无法登录后台。提示:“错误:Cookies被阻止或者您的浏览器不支持。要使用WordPress,您必须启用cookies。”
网上有各种各样修改链接的方法,居然还有通过插件修改的建议,那PHP程序得多耗资源啊。我是直接改数据库,先用mysqldump把整个网站的数据库导出,然后多备份几份。然后用Notepad++直接修改mysqldump导出的备份文件。先把img.hqidi.com全部替换成hqidi.com/img,然后再把http://hqidi全部替换成//hqidi,为什么不替换成https://hqidi呢,原因有二,第一,//hqidi比https://hqidi要少几个字节。第二,//hqidi同时兼顾http://和https://访问,进退自如。对于 // 开头的 URL,浏览器会自动补上当前页面协议去请求。

https重定向问题

首先当然是把原来的http请求重定向到https的问题,网上重定向的写法很多,我们看官方文档

所以重定向到https最好是用BETTER的写法。

HTTPS配置文件

证书文件的相对路径为nginx.conf配置文件所在目录,把获取到的证书文件和自己的密钥放到nginx.conf同一个目录。
配置文件可以点击这里生成,选择Intermediate的配置就行,当然,如果你的网站无视那些用上古浏览器的用户的话,可以用激进的配置。

listen 80;
server_name hqidi.com www.hqidi.com;
return 301 https://hqidi.com$request_uri;

listen 443 http2 fastopen=3 reuseport;
ssl on;
ssl_certificate hqidi_com.crt;
ssl_certificate_key hqidi.key;

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;

开启 Tcp Fast Open 和关闭 ipv6

Tcp Fast Open,字面意思,tcp快速打开,所以我们得开启,但这个我还没彻底弄清。在百科上说, Tcp Fast Open在内核版本3.13开始默认打开,而开源中国却说内核版本得3.7.1才支持。不纠结这个,我们先在nginx的配置文件里面开启再说

server {
    listen              443 ssl http2 fastopen=3 reuseport;
}

然后修改 /etc/sysctl.conf 来完成启用。
关闭 ipv6 的原因主要是部分浏览器开启 ipv6 后会优先走 ipv6,导致速度很慢。

net.ipv4.tcp_fastopen = 3
net.ipv6.conf.all.disable_ipv6 = 1

阿里云的ECS是默认关闭ipv6的,/etc/sysctl.conf文件里面加入上面两行后,执行sysctl -p让修改生效。

HTTPS会话保持

要握六次手,才能建立一个https连接,可不能轻易断开。SSL / TLS的几乎所有开销都是在初始连接建立过程中,因此通过缓存会话的连接参数,将大大改善后续请求。修改如下两行

ssl_session_timeout 60m;
ssl_session_cache shared:SSL:20m;

根据nginx官方文档,1MB可以存储约4000个会话,20M应该很够了。
至于会话超时时间,不低于10分钟就行,我上面设的是60分钟。

HTTPS CDN

我选用的是verycloud.cn提供的CDN服务,每月提供50G的https免费流量,而且国庆期间也有技术客服24h在线,技术水平还不低,虽然他把HTTP/2 说成 HTTP/2.0弄的有点别扭。
添加自己的证书可以参考张戈的博客,https://zhangge.net/5078.html,只是有一个地方要注意,

在CA机构证书那里,把证书链上传了(人是活的,namecheap发来的证书链文件后缀改成.crt后上传),否则,Android设备访问网站的时候,会提示“当前网站证书不可信,且证书链长度为1”,苹果设备和PC都是正常显示小绿锁的。

速度对比

http速度

直接访问源站HTTP/2的速度:

最终访客,过CDN的速度,昨天测还是SPDY 协议的,今天突然支持H2了。

如果是对安全性要求不高的场合,为了提高网页性能,建议不要采用保密强度很高的数字证书。一般场合下,1024位的证书已经足够了,2048位和4096位的证书将进一步延长SSL握手的耗时。

最终效果


以国人朋友圈表现出来的智商,看到“安全”两个字,哪怕是pingguoid.com都会认为是苹果官方网站,然后被钓鱼。坐等chrome因为这两字被起诉的那天。

原创文章,转载请注明: 转载自笛声

本文链接地址: 网站上HTTPS

34 条评论

  • 那人 2017年10月7日 回复

    除了对付网络运营商劫持,基本上没有其他用处,对个人博客来说。

  • 老刘 2017年10月12日 回复

    这家CDN还不错,记得cnbeta就是用的这家。

  • Mr.Li 2017年10月12日 回复

    我来打个酱油

  • 孙华ihua 2017年10月12日 回复

    没想到你这个博客这么坚挺!赞
    我的博客域名换了,同时还沦为次级域名了blog.ihua.win

  • 半山马 2017年10月12日 回复

    我用的是阿里云的免费证书,刚刚好够一年续签了,还是你土豪,VPS+单域名商业证书

    • 笛声 2017年10月12日 回复

      vps是表妹的阿里云学生机,明年就毕业了,证书用起来和免费的没差。

  • 姜辰 2017年10月14日 回复

    恭喜恭喜,又是小绿锁。

  • 呆毛电脑配置网 2017年10月14日 回复

    我的几个网站,都没有开S的。

    • 笛声 2017年10月14日 回复

      HTTPS是大势所趋,google的政策越来越严,有时间还是上吧S,对SEO没有任何负面影响。

  • 豆芽笔记 2017年10月14日 回复

    厉害了,如今都在走https路线了啊。

  • 今天新闻头条 2017年10月17日 回复

    文章不错支持一下吧

  • 懿古今 2017年10月17日 回复

    越来越多人使用HTTPS了,看来我也要考虑这个东东了

    • 笛声 2017年10月17日 回复

      早晚都得上,不如趁早。

  • 电炖锅的那些事 2017年10月17日 回复

    好事啊。
    安全第一。
    显得也高大上了。

  • 邹振忠 2017年10月19日 回复

    加了s,流氓运营商的充流量广告不见了。哈哈,最后一段话很有意思。

  • 胡俊杰 2017年10月20日 回复

    之前的我也想过做小绿锁,但是考虑到备案问题,腾讯ssl不能使用。即使腾讯ssl能使用,我的cdn放在百度云,免费的百度云不支持接入。又是未成年,我们浙江不允许未成年备案,有点烦.....

  • 懿古今 2017年10月22日 回复

    我昨晚也上线了HTTPS,感觉还是很轻松的,就是折腾的时候麻烦事很多,幸好最终都解决了

  • 老何 2017年10月24日 回复

    证书价格如何?我这里那个网站打不开

    • dige 2017年10月24日 回复 作者

      国外支付比较方便(支付宝)而且价格比较便宜的就是这里了 购买证书一年人民币39块。应该是最便宜的了,而且不怕chrome不信任。

  • 夏日博客 2017年10月24日 回复

    https是个趋势。

  • 狂放 2017年10月28日 回复

    大佬上HTTPS变快,我变慢(虚机只有H1.1
    还有,既然是免费的证书,完全可以申请两个

    • dige 2017年10月28日 回复 作者

      一个网站用两证书,影响速度。

      • 狂放 2017年10月28日 回复

        一个网址俩证书的我(以前三个

        • dige 2017年10月28日 回复

          一次https连接得六次握手,两证书的话就是12次,对方又不是刘亦菲,握那么多次干啥。

          • 狂放 2017年10月28日

            大佬

  • 我爱动感单车网 2017年10月29日 回复

    什么时候我的也上这个的话,再来向博主讨教了……

  • 龙舒 2017年11月17日 回复

    我用的是阿里云的免费证书,大佬真是土豪啊

  • 大佬真是土豪啊 2017年12月12日 回复

    大佬真是土豪啊

  • 明月清风 2017年12月30日 回复

    这个教程很不赖,希望有空帮我看看我的有没有问题

    • dige 2017年12月30日 回复

      我去看了,你博客还没弄https啊

      • 明月清风 2017年12月30日 回复

        弄了,只是默认访问80端口不是443,你可以加个s访问看看,https://

        • dige 2017年12月30日 回复 作者

          HTTP/2没有启用、https://www.rsdesw.cn/static/api/js/share/share_api.js这个js404了,总共有3个404的js,还有你COMODO的证书咋是两年有效期的?一般不是一年或者三年吗,还有记得去百度站长那边弄下https验证。

          • 明月清风 2017年12月30日

            这个我也不知道,哪个404的js我不是换了吗?,谢谢你的帮助啦!

  • 广州网站建设 2018年8月29日 回复

    弄了好久了

发表评论

电子邮件地址不会被公开。 必填项已用*标注