目录

阿里云免费SSL证书的替代--Let’s Encrypt,实现泛域名配置并自动续订

最近阿里云服务器的SSL证书过期了,准备重新申请个免费的,结果发现现在阿里云的免费证书(20次的那个)新申请的有效期只有3个月,像之前1年有效期的现在现在是新服务,要68元一年。要每隔3个月手动换一次证书对我这种懒癌晚期的人简直是致命打击。
最后在网上找到了LetsEncrypt,本文内容主要实现在阿里云上用LetsEncrypt替代原本的SSL证书泛域名配置并自动续订。

准备工作

安装Certbot

Certbot是一个免费的开源软件工具,用于在手动管理的网站上自动使用Let’s Encrypt证书以启用HTTPS。

1
2
3
4
5
6
# 通过wget下载,报404问题,不晓得是不是源的问题,换为yum来安装
# wget https://dl.eff.org/certbot-auto

yum install -y epel-release
# yum安装,直接在bin目录有可执行程序,不用像wget那样赋予执行权限
yum install -y certbot

安装可能出现的问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
作为依赖被安装:
  pyOpenSSL.x86_64 0:0.13.1-4.el7                         python-cffi.x86_64 0:1.6.0-5.el7                         python-enum34.noarch 0:1.0.4-1.el7                        
  python-idna.noarch 0:2.4-1.el7                          python-ndg_httpsclient.noarch 0:0.3.2-1.el7              python-ply.noarch 0:3.4-11.el7                            
  python-pycparser.noarch 0:2.14-1.el7                    python-requests.noarch 0:2.6.0-10.el7                    python-requests-toolbelt.noarch 0:0.8.0-3.el7             
  python-zope-component.noarch 1:4.1.0-5.el7              python-zope-event.noarch 0:4.0.3-2.el7                   python-zope-interface.x86_64 0:4.0.5-4.el7                
  python2-acme.noarch 0:1.11.0-1.el7                      python2-certbot.noarch 0:1.11.0-2.el7                    python2-configargparse.noarch 0:0.11.0-2.el7              
  python2-cryptography.x86_64 0:1.7.2-2.el7               python2-distro.noarch 0:1.5.0-1.el7                      python2-future.noarch 0:0.18.2-2.el7                      
  python2-josepy.noarch 0:1.3.0-2.el7                     python2-mock.noarch 0:1.0.1-10.el7                       python2-parsedatetime.noarch 0:2.4-6.el7                  
  python2-pyasn1.noarch 0:0.1.9-7.el7                     python2-pyrfc3339.noarch 0:1.1-3.el7                     python2-six.noarch 0:1.9.0-0.el7                          
  pytz.noarch 0:2016.10-2.el7                            

失败:
  python-urllib3.noarch 0:1.10.2-7.el7 

出现这个urllib3安装失败可能导致使用certbot时出现ImportError: cannot import name UnrewindableBodyError错误,处理方式如下:
手动删除相关依赖

1
2
3
4
sudo pip uninstall requests
sudo pip uninstall urllib3
sudo yum remove python-urllib3
sudo yum remove python-requests

进行检查

1
2
rpm -qa | grep requests 
pip freeze | grep requests

通过yum安装相关依赖

1
2
sudo yum install python-urllib3
sudo yum install python-requests
1
2
certbot --version
# certbot 1.11.0

申请证书参数说明

1
2
3
4
5
6
7
8
9
certbot certonly  -d *.xxx.xxx --email yourEmail@qq.com --manual --preferred-challenges dns-01  --server https://acme-v02.api.letsencrypt.org/directory
 
参数说明:
 
-certonly,表示安装模式,Certbot 有安装模式和验证模式两种类型的插件。
-manual,表示手动安装插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择。
-d,为哪些主机申请证书,如果是通配符,输入 *.hubinqiang.com(替换为自己的域名)。
-preferred-challenges,使用 DNS 方式校验域名所有权。
-server,Let’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。

申请过程

以我的博客为例子,假如我想要适配顶级域名iamky.cn以及通配www.iamky.cn的二级域名证书,需要两个-d

1
certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns --email you@gmail.com --agree-tos -d *.iamky.cn -d iamky.cn

/images/20240913/img.png /images/20240913/img4.png

添加域名解析记录用于验证

/images/20240913/img1.png

替换原有的证书

编辑nginx.conf,将原有的ssl证书路径替换为用Let’s Encrypt生成的证书,切记ssl_certificate用的是fullchain.pem

1
2
ssl_certificate /etc/letsencrypt/live/iamky.cn/fullchain.pem;  # 指定证书的位置,绝对路径
ssl_certificate_key /etc/letsencrypt/live/iamky.cn/privkey.pem;  # 绝对路径,同上

确认证书是否生效

以chrome浏览器为例子,访问对应的网址,打开开发者工具,可以看到不同域名之间对应的证书有生效。 /images/20240913/img2.png /images/20240913/img3.png

定时自动续期

LetsEncrypt的有效期是3个月,但它支持自动获取证书的,也就是说你可以设置在证书失效前,例如每隔2个月自动再请求新的证书,这样我们以后就不用担心证书失效了。以CentOS系统为例子,可以用Crontab来实现它的自动续期

1
2
0 2 * */2 * certbot renew >> /var/log/le-renew.log
30 2 * */2 * /usr/bin/systemctl reload nginx

参考文章一:阿里云搭建Let’s encrypt通配符证书
参考文章二:Linux之免费证书工具certbot安装和使用
参考文章三:ImportError: cannot import name UnrewindableBodyError #603