【运维、HTTPS、SSL】使用Certbot的standalone 模式在Nginx下安装免费SSL 证书,完美实现证书自由

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

完成文件创建后,根据提示回车即可完成证书申请。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值