网站通过Let’s Encrypt和CloudFlare开通SSL证书/HTTPS加密

这是一篇来自pure的文章,上一次在 Forece 的博客写文章还是2014年:C# 使用HTTPWEBREQUEST反应缓慢的解决方法.因为Forece 的能力和时间有限(Forece留:你大爷,我只是懒的弄), pure主动要求迁移并全权维护Forece.net服务器. 其中 Forece 的一项要求就是将网站开通SSL证书. 因为我自己之前也搞过这类的东西, 所以差不多也就半个小时就全搞定了, 流程如下:

配置SSL证书

首先系统环境是最新版CentOS 7, Nginx+PHP-FPM, php版本用的是7.3, 不过没太大所谓. Let's Encrypt 这个网站提供几乎傻瓜式一键SSL配置方法, 据说支持各种Linux系统, 以及各种服务端软件架构, 如Nginx, Apache.

在SSH下, 运行如下命令, 安装yum utilities以及激活Let's Encrypt做的certbot(一键安装SSL程序)安装的repo.

$ yum -y install yum-utils 
$ yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

然后运行下载安装命令:

$ sudo yum install certbot python2-certbot-nginx

安装好后, 运行certbot程序, 进行安装以及配置

$ sudo certbot --nginx

配置过程中, 程序会要求输入联系email, 用来通知证书过期, 以及确认是否同意接受日常邮件.
程序同时会自动读取nginx配置文件, 查找所有网站配置, 并询问需要给哪个网站/域名开通SSL证书.
确认完毕后, 程序会自动申请, 安装, 并自动配置SSL证书以及自动修改nginx配置文件来使用证书.

配置完文件后, 程序会询问是否自动转向所有HTTP, 80端口的流量, 我选择了是, 这样可以强制HTTPS, 443端口访问.
当程序运行完之后, SSL证书的申请, 安装, 配置, 就都完成了.

因为Let's Encrypt的证书有效期只有90天(免费无限申请), 所以官方建议设置一个定时程序自动检测证书到期, 如果到期, 自动申请新的.

方法是:
编辑crontab, 并复制官方提前写好的语句.

SSH下, 编辑crontab:

$crontab -e

在文件第一行复制:

0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew 

然后保存文件即可.

在Forece的前几篇文章里, 里边有大致的crontab的用法, 有兴趣的朋友可以往前翻1-2-3-4个左右文章进行查看.

------------------------------
CloudFlare配置

首先切到Crypto页面, 修改SSL选项为 Full(strict)
然后开启Always Use HTTPS选项
然后开启Automatic HTTPS Rewrites选项
------------------------------

之后再打开网址, Chrome浏览器的小锁头就已经出现了.
虽然我们申请的是自己域名的证书, 但是因为网站通过CloudFlare防火墙进行访问, 所以外网用的是CloudFlare的通用SSL证书.
如果网站没用CloudFlare, 小锁头上证书授权写的应该是自己的域名.
理论上CloudFlare也支持提供自己证书, 但是我懒...

如果熟悉Linux, Nginx, 整个过程差不多30分钟就都搞定了.

如果你有任何问题, 欢迎在下方留言, 我有时间会尽量帮助你的.

Live long and prosper.

- pure