最近有想法申请一个SSL证书,阿里每年可以免费申请20个单域名证书,虽然够用但不是泛域名的证书,遂盯上了Let’s Encrypt

Arch在安装上安装acme.sh

1
pacman -S acme.sh

注册账号

1
acme.sh --register-account --email  XXX@XX.com

注册账号时可以指定邮箱,当有重要事项发生时,Let’s Encrypt会发送邮件进行通知

续期证书没有限制,需要注意的是如果证书的有效期大于30天续期操作没有任何作用,证书的有效期是90天,一旦证书的剩余有效期小于30天Let’s Encrypt会发送邮件提醒用户续期证书

方法一 : 手动申请证书

申请证书的方式有多种,此处只介绍最方便的一种

1
acme.sh --issue -d '*.codexvn.top' --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[2021年 03月 24日 星期三 17:39:39 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2021年 03月 24日 星期三 17:39:39 CST] Create account key ok.
[2021年 03月 24日 星期三 17:39:39 CST] Registering account: https://acme-v02.api.letsencrypt.org/directory
[2021年 03月 24日 星期三 17:39:41 CST] Registered
[2021年 03月 24日 星期三 17:39:41 CST] ACCOUNT_THUMBPRINT='g2vqhg1sA6z1LaBwGUjs4ao0nDxHwjF2Lw_EkGW6Bjc'
[2021年 03月 24日 星期三 17:39:41 CST] Creating domain key
[2021年 03月 24日 星期三 17:39:41 CST] The domain key is here: /home/xvn/.acme.sh/*.codexvn.top/*.codexvn.top.key
[2021年 03月 24日 星期三 17:39:41 CST] Single domain='*.codexvn.top'
[2021年 03月 24日 星期三 17:39:41 CST] Getting domain auth token for each domain
[2021年 03月 24日 星期三 17:39:43 CST] Getting webroot for domain='*.codexvn.top'
[2021年 03月 24日 星期三 17:39:43 CST] Add the following TXT record:
[2021年 03月 24日 星期三 17:39:43 CST] Domain: '_acme-challenge.codexvn.top'
[2021年 03月 24日 星期三 17:39:43 CST] TXT value: 'nxAV26sqYlkB_hJyA6tC6suu7iPcVLuLVq9-AmnWX6E'
[2021年 03月 24日 星期三 17:39:43 CST] Please be aware that you prepend _acme-challenge. before your domain
[2021年 03月 24日 星期三 17:39:43 CST] so the resulting subdomain will be: _acme-challenge.codexvn.top
[2021年 03月 24日 星期三 17:39:43 CST] Please add the TXT records to the domains, and re-run with --renew.
[2021年 03月 24日 星期三 17:39:43 CST] Please add '--debug' or '--log' to check more details.
[2021年 03月 24日 星期三 17:39:43 CST] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

找到输出中的DomainTXT value,然后去阿里云的控制台的域名解析中手动添加TXT记录,用于判断你是否拥有域名使用权

注意!记录不是填整个Domain

重新生成证书

1
acme.sh --renew -d '*.codexvn.top' --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please 

结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[2021年 03月 24日 星期三 17:42:55 CST] Renew: '*.codexvn.top'
[2021年 03月 24日 星期三 17:42:57 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2021年 03月 24日 星期三 17:42:57 CST] Single domain='*.codexvn.top'
[2021年 03月 24日 星期三 17:42:57 CST] Getting domain auth token for each domain
[2021年 03月 24日 星期三 17:42:57 CST] Verifying: *.codexvn.top
[2021年 03月 24日 星期三 17:43:02 CST] Success
[2021年 03月 24日 星期三 17:43:02 CST] Verify finished, start to sign.
[2021年 03月 24日 星期三 17:43:02 CST] Lets finalize the order.
[2021年 03月 24日 星期三 17:43:02 CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/116783946/8637907807'
[2021年 03月 24日 星期三 17:43:03 CST] Downloading cert.
[2021年 03月 24日 星期三 17:43:03 CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03ad7155ad624f6efa5d19139ddb795e2c6b'
[2021年 03月 24日 星期三 17:43:04 CST] Cert success.
-----BEGIN CERTIFICATE-----
----- 省略 -----
-----END CERTIFICATE-----
[2021年 03月 24日 星期三 17:43:04 CST] Your cert is in /home/xvn/.acme.sh/*.codexvn.top/*.codexvn.top.cer
[2021年 03月 24日 星期三 17:43:04 CST] Your cert key is in /home/xvn/.acme.sh/*.codexvn.top/*.codexvn.top.key
[2021年 03月 24日 星期三 17:43:04 CST] The intermediate CA cert is in /home/xvn/.acme.sh/*.codexvn.top/ca.cer
[2021年 03月 24日 星期三 17:43:04 CST] And the full chain certs is there: /home/xvn/.acme.sh/*.codexvn.top/fullchain.cer

这样我们就申请到一个有效期为90天的泛域名ssl证书

方法二 : 通过DNS API自动申请证书

此处以阿里云为例,首先要做的就是获取阿里云的操作API的AccessKey IDAccessKey Secret

然后执行

1
2
3
4
export Ali_Key="AccessKey ID的值"
export Ali_Secret="AccessKey Secret的值"

acme.sh --issue --dns dns_ali -d "*.codexvn.top" --force

执行一次之后Ali_KeyAli_Secret会被记录,后续不需要重新设置环境变量

如果无法正常执行可以通过代理试试

结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[2021年 03月 24日 星期三 17:54:17 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2021年 03月 24日 星期三 17:54:17 CST] Create account key ok.
[2021年 03月 24日 星期三 17:54:17 CST] Registering account: https://acme-v02.api.letsencrypt.org/directory
[2021年 03月 24日 星期三 17:54:19 CST] Registered
[2021年 03月 24日 星期三 17:54:19 CST] ACCOUNT_THUMBPRINT='3URstzWeVJMTV4j_F_dR5rRe2hr4G27HbQtdfz4MWWo'
[2021年 03月 24日 星期三 17:54:19 CST] Creating domain key
[2021年 03月 24日 星期三 17:54:19 CST] The domain key is here: /home/xvn/.acme.sh/*.codexvn.top/*.codexvn.top.key
[2021年 03月 24日 星期三 17:54:19 CST] Single domain='*.codexvn.top'
[2021年 03月 24日 星期三 17:54:19 CST] Getting domain auth token for each domain
[2021年 03月 24日 星期三 17:54:21 CST] Getting webroot for domain='*.codexvn.top'
[2021年 03月 24日 星期三 17:54:21 CST] Adding txt value: SBh1PMW1N5XksebSeXfQfLLPP0BCn1NmhfgMi19AjWQ for domain: _acme-challenge.codexvn.top
[2021年 03月 24日 星期三 17:54:23 CST] The txt record is added: Success.
[2021年 03月 24日 星期三 17:54:23 CST] Let's check each DNS record now. Sleep 20 seconds first.
[2021年 03月 24日 星期三 17:54:44 CST] Checking codexvn.top for _acme-challenge.codexvn.top
[2021年 03月 24日 星期三 17:54:46 CST] Domain codexvn.top '_acme-challenge.codexvn.top' success.
[2021年 03月 24日 星期三 17:54:46 CST] All success, let's return
[2021年 03月 24日 星期三 17:54:46 CST] Verifying: *.codexvn.top
[2021年 03月 24日 星期三 17:54:50 CST] Success
[2021年 03月 24日 星期三 17:54:50 CST] Removing DNS records.
[2021年 03月 24日 星期三 17:54:50 CST] Removing txt: SBh1PMW1N5XksebSeXfQfLLPP0BCn1NmhfgMi19AjWQ for domain: _acme-challenge.codexvn.top
[2021年 03月 24日 星期三 17:54:52 CST] Removed: Success
[2021年 03月 24日 星期三 17:54:52 CST] Verify finished, start to sign.
[2021年 03月 24日 星期三 17:54:52 CST] Lets finalize the order.
[2021年 03月 24日 星期三 17:54:52 CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/116785152/8638103911'
[2021年 03月 24日 星期三 17:54:54 CST] Downloading cert.
[2021年 03月 24日 星期三 17:54:54 CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/041c7e59e2a58d7548806e4f7ca10e678a27'
[2021年 03月 24日 星期三 17:54:54 CST] Cert success.
-----BEGIN CERTIFICATE-----
----- 省略 -----
-----END CERTIFICATE-----
[2021年 03月 24日 星期三 17:54:54 CST] Your cert is in /home/xvn/.acme.sh/*.codexvn.top/*.codexvn.top.cer
[2021年 03月 24日 星期三 17:54:54 CST] Your cert key is in /home/xvn/.acme.sh/*.codexvn.top/*.codexvn.top.key
[2021年 03月 24日 星期三 17:54:54 CST] The intermediate CA cert is in /home/xvn/.acme.sh/*.codexvn.top/ca.cer
[2021年 03月 24日 星期三 17:54:54 CST] And the full chain certs is there: /home/xvn/.acme.sh/*.codexvn.top/fullchain.cer

在SpringBoot中使用证书

PKCS#12格式的证书是微软发布的一种格式,文件后缀一般是.pkcs12、.pfx、.p12,PKCS#12定义了一种存档文件格式,能够将证书和密钥对打包成一个文件,方便进行管理。

  1. 通过openssl导出证书为PKCS#12格式
    1
    openssl pkcs12 -export -in .acme.sh/\*.codexvn.top/\*.codexvn.top.cer -inkey .acme.sh/\*.codexvn.top/\*.codexvn.top.key -certfile .acme.sh/\*.codexvn.top/ca.cer -out codexvn.top.pfx

设定密码之后就可以在当前目录得到codexvn.top.pfx证书文件

如果需要别名可以添加 -name 参数指定别名

  1. 通过acme.sh导出证书为PKCS#12格式
1
acme.sh --toPkcs -d "*.codexvn.top"

这种方法更为简单,推荐使用这种

配置application.properties

1
2
3
4
5
server.port=8443
server.ssl.key-store=classpath:codexvn.top.pfx
server.ssl.key-store-password=xxx
server.ssl.key-store-type=PKCS12
server.ssl.enabled=true

下面是证书信息