Certbot生成Let's Encrypt免费证书并配置到Spring Boot

2,987 阅读6分钟

Let's Encrypt是知名的免费SSL证书之一。这里分享一下今天研究的使用certbot工具生成免费ssl证书。

1,连接服务器并安装certbot

连接服务器,按照以下步骤安装certbot

(1) 删除旧的certbot软件包:

sudo apt purge certbot
sudo apt autoremove

(2) 安装相关python环境

sudo apt update
sudo apt install python3 python3-venv libaugeas0

(3) 为certbot创建虚拟python环境

sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip

(4) 安装certbot

sudo /opt/certbot/bin/pip install certbot

(5) 将certbot命令软链接到/usr/bin目录下

sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

至此,certbot就安装配置完成了!输入certbot --help试试会输出帮助信息。

2,开始手动生成证书

说在前面的是,生成证书需要验证域名(一般是让你在域名解析商添加TXT记录),这里介绍两种域名验证方式:

  1. 手动创建TXT记录验证(如果你直接使用的阿里云等等域名商的域名解析服务的话)
  2. 【推荐】使用Cloudflare API的方式进行验证(如果你的域名是使用的cloudflare进行解析的话)

下面我来一一说明这两种方式,大家根据实际情况选择任意一种即可

(1) 手动验证

执行以下命令:

sudo certbot certonly -d "你的域名" --manual --preferred-challenges dns

-d参数表示域名,可以添加多个域名。

还可以使用泛域名:

sudo certbot certonly -d "你的域名" -d "*.你的域名" --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

注意,使用泛域名的话,命令后面就多了--server https://acme-v02.api.letsencrypt.org/directory这个参数。

如果要使用泛域名,建议看第二种使用cloudflare的验证方式,否则证书续期会发生错误

例如我的域名是swsk33-web.link,那么生成证书的命令如下:

sudo certbot certonly -d "swsk33-web.link" -d "*.swsk33-web.link" --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

那么这个证书将会支持swsk33-web.link的访问,也支持xxx.swsk33-web.link的访问(xxx换成任意值)。

然后提示你输入邮箱:

image.png

输入你的邮箱,回车。

然后提示你是否同意协议:

image.png

输入y,回车。

然后问你是否想收到其订阅邮件:

image.png

这个随意,我这里选否,输入n回车。

然后问你是否记录ip,这个必须选是,否则不会生成证书:

image.png

输入y,回车。

然后会让你给域名添加txt记录:

image.png

去域名商登录并在域名解析里面按照要求添加TXT记录,然后稍等片刻按回车。

最后,出现下图则成功:

image.png

添加记录后,可能又会弹出一个让你添加TXT记录的消息,但这个记录名字和值不同,因此再添加这个记录到域名解析即可(也就是说,有时候你可能要添加两次TXT记录)

证书生成在/etc/letsencrypt/live/你的域名目录下。

image.png

这样,就完成了证书生成。

(2) 使用Cloudflare API的验证方式

由于我是在Dynadot上买的域名并且交给了Cloudflare进行解析,因此我采用第二种方式,使用Cloudflare API的验证非常方便,不需要手动添加TXT记录即可完成验证,并且很好地支持泛域名证书续期,推荐大家可以把域名放在Cloudflare进行解析然后使用这种方式。

使用Cloudflare API方式验证,首先必须保证在Cloudflare上,域名已经解析到了你的服务器的ip地址上,否则会失败。第一次在服务器上生成证书时也会像上面第一种方式一样提示你输入邮箱、同意协议。

首先,我们需要安装certbot-dns-cloudflare插件:

sudo /opt/certbot/bin/pip install certbot-dns-cloudflare

然后我们需要创建一个cloudflare配置文件,先在自己的Cloudflare账户中查看自己的Global API Key:

image.png

image.png

将你自己的API Key复制下来保存。

然后在服务器中新建一个配置文件cloudflare.ini,里面写入:

dns_cloudflare_email = 你的cloudflare账户邮箱
dns_cloudflare_api_key = 你的API Key

配置文件名和位置都可以自定义。

然后开始生成证书:

sudo certbot certonly -d "你的域名" --dns-cloudflare --dns-cloudflare-credentials "cloudflare配置文件路径" --dns-cloudflare-propagation-seconds 10

如果要生成通配符证书,就如下:

sudo certbot certonly -d "你的域名" -d "*.你的域名" --dns-cloudflare --dns-cloudflare-credentials "cloudflare配置文件路径" --dns-cloudflare-propagation-seconds 10 --server https://acme-v02.api.letsencrypt.org/directory

上述--dns-cloudflare-propagation-seconds参数表示等待多少秒后开始验证,这里写10s即可。

然后,你就发现证书直接成功生成了!

image.png

证书同样生成在/etc/letsencrypt/live/你的域名目录下。

3,将PEM证书转换为p12以配置进Spring Boot

先通过下列命令转换证书:

sudo openssl pkcs12 -export -in "你的证书文件路径" -inkey "你的私钥文件路径" -out "指定生成的p12证书文件路径"

例如我这边:

sudo openssl pkcs12 -export -in "/etc/letsencrypt/live/swsk33-web.link/cert.pem" -inkey "/etc/letsencrypt/live/swsk33-web.link/privkey.pem" -out "/etc/letsencrypt/live/swsk33-web.link/key.p12"

执行命令会让你设定p12证书的密码,自行设定并记住,待会配置需要用。

这样就生成了!

image.png

然后打开你的Spring Boot项目的配置文件application.properties,添加如下配置:

#SSL证书设置
server.ssl.key-store=file:刚刚生成的p12证书路径
server.ssl.key-store-password=刚刚生成p12证书时设定的p12证书密码
server.ssl.keyStoreType=PKCS12

例如我的配置:

#SSL证书设置
server.ssl.key-store=file:/etc/letsencrypt/live/swsk33-web.link/key.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12

启动项目,即可发现你的网站变成https了!

4,续期,吊销

但是这个证书只有三个月有效期,我们需要大致在2个月后进行续期。通过以下命令续期,并重新转换PEM到P12证书:

sudo certbot renew
sudo openssl pkcs12 -export -in "你的证书文件路径" -inkey "你的私钥文件路径" -out "指定生成的p12证书文件路径"

这里需要说明的是,续期后进行转换时,指定的p12文件路径和密码最好是和第一次生成的路径和密码一致,这样省的我们再去改Spring Boot配置。

如果说证书不需要了,我们可以进行吊销。

注意吊销不是删除证书就行了

sudo certbot revoke --cert-path "/etc/letsencrypt/live/你的证书名(一般就是域名)/cert.pem"

可以通过certbot certificates命令查看自己的证书:

image.png

例如我吊销证书swsk33-web.link

sudo certbot revoke --cert-path "/etc/letsencrypt/live/swsk33-web.link/cert.pem"

按照提示输入y同意即可吊销。

这个时候,/etc/letsencrypt/live/你的域名目录应该会被删除,如果发现没有删除建议手动删除它。

后续出现问题可以手动删除/etc/letsencrypt再试。