还记得Let's Encrypt
刚出来的时候,繁琐的手动配置简直是让人心力交瘁。这几天,由于购买了阿里的服务器,并且也需要提供后端服务,于是不得不再次需要去配置免费ssl证书的,但是,这次,让我出乎意料的是,配置ssl证书居然这么简单。
certbot
是Let's Encrypt
官网推荐的自动化配置工具,工具官网可以选择针对Apache/Nginx/Haproxy/Plesk等不同服务器不同操作系统的安装配置方法。这里只介绍最常用的Nginx+CentOS组合。
Certbot配置
首先,不得不说,certbot
有几个不得不解决的依赖问题。
certbot
依赖的python2的urllib3
库版本为1.21.1版本,如果已经安装了更高版本的urllib3
库,那么降级吧pip install urllib3==1.21.1
,issue参考如果python2的requests
库版本小于2.6.0,那么自觉升级pip install --upgrade --force-reinstall 'requests==2.6.0'
,issue参考接下来真正的安装过程:
1
2
3
4
5
6
7
8
9
10
11
12
13for ubuntu < 20
add-apt-repository ppa:certbot/certbot && apt update
apt install -y certbot python3-acme python3-augeas python3-certbot python3-certbot-nginx python3-certbot-apache # nginx和apache根据实际需要选择
for ubuntu >= 20
sudo apt-get install -y certbot python3-certbot-nginx
for centos
yum install epel-release -y && yum update -y
yum install certbot certbot-nginx
如果各种安装方式都不行,比如一些无法解决的依赖问题no module named openssl, no module named cryptography,那么尝试安装一个独立的python3版本
pip3 install certbot certbot-nginx确保你的nginx配置已经有配置域名,并且域名解析也已经指向该IP地址,域名能够通过80端口正常访问。
当安装完成以后,一切就简单了,运行
sudo certbot --nginx
,会以提问的方式询问你几个配置问题:1
2
3
4
5
6
7
8第一步会读取你的nginx配置,询问你需要对哪些域名需要添加ssl
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: a.haofly.net
2: b.haofly.net
-------------------------------------------------------------------------------
第二步询问你在遇到http的时候是否需要重定向到https
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.就这样,配置就算完成了,可以看到新的nginx配置已经写入到配置文件中,访问域名也会自动跳转到https了。
当然,
Let's Encrypt
只有90天的有效期,可以使用这条命令更新证书:sudo certbot renew --dry-run
,官方建议每天随机运行两次该命令,如果证书没有过期,运行命令并不会对你的服务器造成什么影响,所以就添加如下定时任务, 默认会自动创建定时任务在:/etc/cron.d/certbot
:1
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew
Let’s Encrypt证书迁移
要把证书从一台服务器迁移到另外一台服务器,其实挺简单的主要是那几个link文件需要重新链接一下,迁移步骤如下:
在旧服务器上执行以下命令
1 | certbot renew # 先在原服务器上更新一下证书 |
- 在新服务器上执行以下命令
1 | cd /etc && unzip letsencrypt.zip # 解压letsencrypt文件 |
Let’s Encrypt添加/删除域名
1 | sudo certbot certificates # 先查看当前有哪些域名,比如有haofly.net |
定时更新证书
1 | 0 3 * * * /usr/bin/certbot renew --post-hook "systemctl reload nginx" # 更新完成后重启nginx |
Troubleshooting
**如果安装时出现错误: Problem binding to port 80: Could not bind to IPv4 or IPv6.**此时需要把nginx暂停一下
service nginx stop
cannot import name UnrewindableBodyError: 执行以下命令重新安装
certbot
,可能是依赖和python
本身的包依赖有冲突:1
2
3
4
5sudo pip uninstall requests
sudo pip uninstall urllib3
sudo yum remove python-urllib3
sudo yum remove python-requests
sudo yum install python-urllib3 python-requests certbot -y设置了定时任务但是没有自动续费成功: 最好把日志输出到一个自己知道的日志文件里面去,例如
/tmp/certbot.log
,这样方便排查,我遇到的是下面的问题:- Failed to renew certificate xxx with error: The nginx plugin is not working; there may be problems with your existing configuration. The error was: NoInstallationError(“Could not find a usable ‘nginx’ binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.”: 需要正确安装certbot的nginx插件,例如
apt-get install python3-certbot-nginx -y
- Failed to renew certificate xxx with error: The nginx plugin is not working; there may be problems with your existing configuration. The error was: NoInstallationError(“Could not find a usable ‘nginx’ binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.”: 需要正确安装certbot的nginx插件,例如