忙了一上午,终于迎来的https!所有http流量都会被重定向到https(除了某些引用站外http的资源没法加密)

Update  (2017年6月1日):增加关于配置证书链的内容。

所有这些都要感谢Certbot和免费的证书签发机构Let’s encrypty。它们让加密变得更加简单。

简单记录一下做的事情

首先参考Certbot的官方指导,完成我的CentOS 7的配置。包括设置证书对应的域名,web服务器根目录之类。

然后运行命令

certbot renew --dry-run

确认证书更新没有问题之后。准备编写用于更新证书的cron脚本。

由于我使用的是lighttpd,lighttpd接受的证书文件和Let’s Encrypt提供的有点点不同,参考这篇文章,编写一个更新证书的脚本:

#!/bin/sh
certdir="/path/to/cert"
certbot renew
# 因为lighty需要的证书格式不完全是Let's Encrypt提供的现成的格式
# 所欲需要额外的一些操作
cat $certdir/privkey.pem $certdir/cert.pem > $certdir/cert4lighttpd.pem

保存到/root/bin/cert-renew.sh。

然后编辑root的crontab

crontab -e

设置为一天检查两次更新:

#minute  hour  date  month  weekday  command
   00     07    *     *       *     /root/bin/cert-renew.sh >/root/cert-renew.log 2>&1
   00     19    *     *       *     /root/bin/cert-renew.sh >/root/cert-renew.log 2>&1

参考lighttpd的这篇文档,修改配置文件使lighttpd支持https。(注意,这一部要求lighttpd在编译时支持SSL。不过从Cent OS库中安装的都是支持的)

lighttpd配置文件中包含如下内容

ssl.engine  = "enable"
ssl.pemfile = "/path/to/cert/cert4lighttpd.pem"

参考这篇文档,把所有http流量全部重定向到https上去。

别忘了让防火墙允许433端口的进站流量。

到这里为止,所有承认Let’s Encrypt的浏览器(Chrome、Firefox、Edge)和操作系统都应该能够使用加密流量正常访问我的网站了。

但是还有相当一部分浏览器和操作系统(写这篇文章时候的Android)不承认Let’s Encrypt,这部分操作系统或者浏览器在通过https访问我的网站时必然会弹出警告窗。不知情况的用户多半会中止对网站的继续访问。

对于像我这样使用lighttpd的服务器,应付这种情况的方法是把证书链(certificate chain)的信息写入lighttpd的配置文件。关于Let’s Encrypt的证书链详情可以看这里

参考certbot的这个帮助文件。仔细阅读“Where are my certificates?”部分,在lighttpd的配置文件中新增一行

ssl.ca-file = "/etc/letsencrypt/live/YourDomainName/chain.pem"

重启lighttpd之后,原来弹警告窗的应该就不会再弹了。