豪翔天下

Change My World by Program

0%

使用certbot为Nginx一键配置Let's Encrypt SSL安全证书

还记得Let's Encrypt刚出来的时候,繁琐的手动配置简直是让人心力交瘁。这几天,由于购买了阿里的服务器,并且也需要提供后端服务,于是不得不再次需要去配置免费ssl证书的,但是,这次,让我出乎意料的是,配置ssl证书居然这么简单。

certbotLet's Encrypt官网推荐的自动化配置工具,工具官网可以选择针对Apache/Nginx/Haproxy/Plesk等不同服务器不同操作系统的安装配置方法。这里只介绍最常用的Nginx+CentOS组合。

Certbot配置

首先,不得不说,certbot有几个不得不解决的依赖问题。

  1. certbot依赖的python2的urllib3库版本为1.21.1版本,如果已经安装了更高版本的urllib3库,那么降级吧pip install urllib3==1.21.1issue参考

  2. 如果python2的requests库版本小于2.6.0,那么自觉升级pip install --upgrade --force-reinstall 'requests==2.6.0'issue参考

  3. 接下来真正的安装过程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # for 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
  4. 确保你的nginx配置已经有配置域名,并且域名解析也已经指向该IP地址,域名能够通过80端口正常访问。

  5. 当安装完成以后,一切就简单了,运行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了。

  6. 当然,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
2
3
4
5
6
7
8
9
certbot renew	# 先在原服务器上更新一下证书
certbot certificates # 查看原服务器上证书信息
ls -l /etc/letsencrypt/live/haofly.net/ # 查看软链接信息,信息可能如下,需要注意每个.pem前的数字表示续期第几次了
lrwxrwxrwx 1 root root 34 Jan 22 10:00 cert.pem -> ../../archive/haofly.net/cert3.pem
lrwxrwxrwx 1 root root 35 Jan 22 10:00 chain.pem -> ../../archive/haofly.net/chain3.pem
lrwxrwxrwx 1 root root 39 Jan 22 10:00 fullchain.pem -> ../../archive/haofly.net/fullchain3.pem
lrwxrwxrwx 1 root root 37 Jan 22 10:00 privkey.pem -> ../../archive/haofly.net/privkey3.pem

zip letsencrypt.zip /etc/letsencrypt # 将letsencrypt文件夹直接打包
  • 在新服务器上执行以下命令
1
2
3
4
5
6
7
8
9
cd /etc && unzip letsencrypt.zip	# 解压letsencrypt文件
cd letsencrypt/live/haofly.net
for i in cert chain fullchain privkey ; # 重新建立软连接,这一这里的.pem文件前缀就是旧服务器上的续期次数
do
rm ${i}.pem
ln -s ../../archive/haofly.net/${i}3.pem ${i}.pem
done

certbot renew --dry-run # 运行一次renew看看是否正常--dry-run表示只运行不用保存结果

Let’s Encrypt添加/删除域名

1
2
3
4
sudo certbot certificates	# 先查看当前有哪些域名,比如有haofly.net
certbot --cert-name haofly.net -d haofly.net,2.haofly.net,3.haofly.net # 需要注意的是必须把之前的给加上,如果不加某个域名也可以直接表示移除该域名
cerbot --nginx # 如果都由nginx管理,可以在添加完域名的conf后直接执行这条命令进行添加新的证书
certbot delete # 删除所选择的证书

定时更新证书

1
2
0 3 * * * /usr/bin/certbot renew --post-hook "systemctl reload nginx"	# 更新完成后重启nginx
0 3 * * * /usr/local/bin/certbot-auto renew --nginx # 如果是certbot-auto可以这样做

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
    5
    sudo 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
坚持原创技术分享,谢谢支持

欢迎关注我的其它发布渠道