Let's Encrypt + Apache 使用教程

如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA) 处获取一个证书,Let’s Encrypt就是一个 CA。我们可以从 Let’s Encrypt获得网站域名的免费的证书。这篇文章也主要讲的是通过Let’s Encrypt + Apache 来让网站升级到HTTPS。

Certbot 是Let’s Encrypt官方推荐的获取证书的客户端,可以帮我们获取免费的Let’s Encrypt证书。Certbot 是支持所有 Unix 内核的操作系统的,个人的服务器系统是CentOS 7(我为社区做贡献.jpg),这篇教程也是通过在项目上启用HTTPS的基础上完成的。

开始前得先把如下几个依赖包卸载后,再进行Certbot的安装(不然就会提示ImportError: No module named ‘requests.packages.urllib3’,该问题复现过。)

1
2
3
4
5
$ pip uninstall requests
$ pip uninstall urllib3
$ sudo yum remove python-urllib3 python-requests -y
$ sudo yum install certbot -y
......

安装完成后,可以先通过运行certbot进行测试,如无问题则继续下一步,首先查看端口是否被占用,有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。

1
2
$ netstat -tunlp | grep :443
......

接着继续生成证书

1
2
$ certbot certonly --standalone -d www.example.com
......

证书生成完毕后,可以在 /etc/letsencrypt/live/ 目录下看到对应域名的文件夹找到证书。
这时候我们的第一生成证书已经完成了,接下来就是配置我们的web服务器,启用HTTPS。
Apache需要安装ssl插件,然后在/etc/httpd/conf.d/ssl.conf里面进行配置,如下例。

1
2
3
4
5
6
7
8
<VirtualHost 0.0.0.0:443>
DocumentRoot "/var/www/html"
ServerName www.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.example.com/chain.pem
</VirtualHost>

配置完成后重启httpd,访问https://www.example.com成功。

配置完这些过后,还没有完成。 Let’s Encrypt提供的证书只有90天的有效期,必须在证书到期之前,重新获取这些证书,certbot给我们提供了一个很方便的命令,那就是 certbot renew。 通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。这里直接用crontab设置每月定时更新即可。

1
0 4 * */2 * certbot renew --pre-hook "systemctl stop httpd" --post-hook "systemctl start httpd"

每隔两个月凌晨四点进行证书更新,并先行停止httpd服务,之后再开启。
注:如果遇到生成证书失败问题,项目组在文档中有说明认证失败次数的限制。
There is a Failed Validation limit of 5 failures per account, per hostname, per hour.
每个账户/主机名/小时可以失败五次,所以生成之前确认好DNS记录缓存是否已经更新。