如何配置LetsEncrypt并且自动更新证书

在使用服务器搭建网站时,需要给网站域名设置安全证书,来进行https加密传输,保证网站安全

但是我们获取证书一般是在买域名的地方去获取,像我的域名是在阿里云买的,但是他提供的域名证书只有三个月的有效期,需要下载到主机然后手动部署,非常麻烦,我目前的解决方案是通过 Let's Encrypt 定期自动生成和更新证书,然后实现自动部署

首先回到机器,下载完成这些动作的客户端,网页在这

letsencrypt home

Let's Encrypt 推荐的是Cerbot 客户端,他还推荐了许多其他的

acme client

我用的比较多的是Bash 下的 acme.sh 脚本,脚本使用说明见这里 ,总共分三步:

1. 安装客户端

1
2
3
4
5
6
7
#1. 下载自动安装客户端
curl https://get.acme.sh | sh -s email=my@example.com(填你自己的邮箱就行)

#2. 下载下来的是acme.sh脚本和一些文件
# 添加一个alias,可以设定命令别名,不设置的话运行脚本需要带上acme.sh的所在路径
# 在 ~/.bashrc文件中添加下面这一句即可,然后执行 source ~./bashrc
alias acme.sh=~/.acme.sh/acme.sh

2. 生成证书

生成证书需要先验证来验证你的域名所有权,方法有很多

  • DNS记录验证

    添加特定的TXT记录到域名的DNS解析中,有时也要求添加CNAME记录或者A记录。验证时,系统会查询域名的DNS记录,确认是否存在指定的值。

    优点:不需要访问服务器,只需要域名管理权限

    缺点:DNS生效时间可能较长(通常几分钟到48小时)

  • 文件验证

    在域名关联的网站的根目录下上传一个指定名称的文件,文件内容由验证服务提供。验证时,系统访问文件的URL(例如http://example.com/.well-known/acme-challenge/)并检查内容。

    优点:简单快速,适合拥有服务器文件访问权限的用户。
    缺点:需要对域名对应的网站具有管理权限。

  • 邮箱验证

    向域名注册人邮箱发送一封验证邮件,要求点击其中的链接确认。

    通常使用的邮箱包括admin@domain.comhostmaster@domain.com等。

    优点:适用于无法修改DNS或服务器配置的情况。
    缺点:需要有权访问特定邮箱。

这里我选择的是,DNS记录验证acme.sh 首选的是文件验证,但是总会出先一些失败,所以干脆就用过程相对透明可控的 DNS记录验证,dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.

我在阿里云买的域名,这个是如何添加阿里云的API的方法

1
2
3
4
export Ali_Key="<key>"
export Ali_Secret="<secret>"

acme.sh --issue --dns dns_ali -d example.com -d *.example.com

3. 拷贝证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

Nginx example :

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

4. 其他

其他更多操作见 https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E