standalone 模式,这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。
1、准备
使用sudo权限的用户身份SSH进入运行HTTP网站的服务器
必须关闭你的nginx服务
2、安装snapd
yum -y install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap#注意,安装完后,需要重启服务器
reboot
3、安装certbot
执行以下这条命令时,他可能会提示error: too early for operation, device not yet seeded or device model not acknowledged,这是因为snapd服务还没启动完成,你可以过个半分钟再开始以下命令
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
snap set certbot trust-plugin-with-root=ok
4、安装正确的DNS插件
运行以下命令,将<PLUGIN>替换为您的DNS提供商的名称。
snap install certbot-dns-<PLUGIN>
我这边以阿里云作演示
snap install certbot-dns-aliyun
如果你不确定自己是哪个提供商,可以用以下命令去搜索一下结果
snap search certbot-dns-
5、获取证书
5.1、一般域名证书申请
生成nginx证书
certbot --nginx
注意,如果你使用的是宝塔(其实宝塔自带证书工具也可以实现证书无限续签,前提是你必须要用宝塔创建的站点,不然老老实实用现在这个方式去申请证书吧),请使用以下命令,不然certbot可能找不到你的配置文件导致执行失败
certbot --nginx --nginx-server-root=/www/server/nginx/conf/
或
certbot certonly --nginx --nginx-server-root=/www/server/nginx/conf/ -d 域名 --non-interactive --agree-tos
下面的就按提示输入,第一个是邮箱,有可能是作通知用的,第二第三个问题是让你同意一些协议,第四个问题看不同情况,有些人在nginx的配置里面已经有设置站点域名,那他会让你选,给第几个域名生成证书,你输入第几个的数字回车即可,如果你不想生成列表中的域名证书,貌似是按空格再回车即可,如果你按空格回车,那么他可能会让你输入一个域名。你如果你本身在nginx配置文件中没有配置域名,他依然是让你输入一个要生成证书的域名。你选择域名和手动输入域名的最终区别在于,选择的域名他会自动帮你改写nginx的配置文件,配置好ssl证书路径这些,但如果是手动的,那么可能需要你自己去配置nginx的ssl证书路径了。
参数说明:
certonly 表示只申请证书,反之,renew 表示自动续订。
--no-bootstrap 需要用户同意的系统级操作直接选N。
--manual 表示交互式申请。
-d 为那些主机申请证书如 *.xxx.cn(此处为泛域名)
--preferred-challenges dns,使用 DNS 方式校验域名所有权,可以配置多个
--server Let's Encrypt ACME v2 版本使用的服务器不同于 v1 版本(V2版本才支持泛域名解析),需要显示指定。
证书签发成功后去Nginx或Apache配置新生成的证书文件即可。
最终结果如下,他将证书放在了 /etc/letsencrypt/live/域名/ 目录下面
5.2、泛域名证书申请
泛域名证书申请方式内容参考文章:https://www.cnblogs.com/oboth-zl/p/14330854.html
生成证书(注意:此方式不会对nginx进行配置,需手动进行nginx的SSL设置)
certbot certonly --preferred-challenges dns --manual -d *.xx.cn --server https://acme-v02.api.letsencrypt.org/directory
# 上面这句命令不行的时候,可以尝试用 certbot certonly --manual -d *.xx.cn
执行以上语句后,如一切正常,他会有如下提示
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.xx.cn- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:_acme-challenge.xx.cn.
with the following value:
THsSlTweQnY2g5xex6xfps38z3jxeJxusojFxx65xpx
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.jsyxli.cn.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
上一句提示语中,是让你以记录类型为TXT的方式将_acme-challenge.xx.cn这个域名解析到THsSlTweQnY2g5xex6xfps38z3jxeJxusojFxx65xpx。解析提交完后,一般等个半分钟,再在shell命令下根据上面的提示按Enter即可继续进行,完成后会出现如下提示:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/xx.cn/fullchain.pem
Key is saved at: /etc/letsencrypt/live/xx.cn/privkey.pem
This certificate expires on 2024-10-22.
These files will be updated when the certificate renews.
此时,SSL证书已生成,你只要在你的nginx配置中,server_name设置成*.xx.cn,并且证书路径改成刚生成的证书路径即可。
6、测试自动续订证书
您系统上的Certbot软件包附带一个cron作业或systemd计时器,该计时器会在您的证书过期之前自动续订证书。除非您更改配置,否则不需要再次运行Certbot。您可以通过运行以下命令来测试证书的自动续订:
certbot renew --dry-run
# 有部分人运行下面会报命令不存在,可能是环境变量未配置成功导致,你也可以使用以下命令找到certbot,然后再执行
# which certbot
# 比如我的目录是在/usr/bin/certbot,就使用以下命令
# /usr/bin/certbot renew --dry-run
更新certbot的命令安装在以下位置之一:
/etc/crontab/
/etc/cron.*/*
systemctl list-timers
完成以上操作后,你可以开启你的nginx服务,然后验证一下你的域名访问是否正常。
其他说明
强制重新申请证书
# 非宝塔
certbot certonly --force-renewal -d www.xx.cn
# 宝塔
certbot certonly --force-renewal -d www.xx.cn --nginx --nginx-server-root=/www/server/nginx/conf/
设置自动提醒或定时任务
你可以编辑你的 crontab 文件来添加以下行,这将在每天午夜执行一个续签的干运行,并将输出重定向到 /dev/null
。你需要检查日志文件来确定是否需要手动续签
crontab -e
0 0 1 * * /usr/bin/certbot renew --dry-run > /dev/null
手动续签:
certbot renew
交互式手动续签:
进行非交互式续签时,可能会出现如下报错:
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
这时你需要进行交互式续签:
certbot certonly --manual -d 域名
他会问你是保留原证书还是更新证书,内容如下:
What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
既然你是要来续签,一般会选2,所以你需要输入2,并回车,此时他会给你一个新的证书。
如何卸载:
yum remove -y snapd
rm -rf /var/lib/snapd
rm -rf /etc/snapd
systemctl restart systemd-journald
吊销证书:
certbot revoke --cert-path /etc/letsencrypt/live/域名/fullchain.pem --agree-tos --non-interactive
参数说明
--agree-tos 同意后,后续无需再次确认
--non-interactive 非交互式运行,吊销不会再发起询问
查看自动续订列表:
certbot certificates
查看指定域名到期时间:
openssl x509 -in /etc/letsencrypt/live/<您的域名>/cert.pem -noout -text | grep "Not After"
域名所指向的服务器不是你certbot软件所在服务器该如何申请?
certbot certonly --manual -d 域名
此时,他会让你在域名所指向的服务器的web项目下创建一个文件,并在里面放入指定内容,提示如下:
Requesting a certificate for 域名
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:xxxxx_xxxx.xxxxxx
And make it available on your web server at this URL:
http://域名/.well-known/acme-challenge/xxxxx_xxxx
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
完成文件创建后,根据提示回车即可完成证书申请。