申请Let’s Encrypt的免费SSL证书并在SpringBoot中使用
发表于|更新于
|阅读量:
最近有想法申请一个SSL证书,阿里每年可以免费申请20个单域名证书,虽然够用但不是泛域名的证书,遂盯上了Let’s Encrypt。
注册账号
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
|
找到输出中的Domain
和TXT 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 ID
和AccessKey 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_Key
和Ali_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定义了一种存档文件格式,能够将证书和密钥对打包成一个文件,方便进行管理。
- 通过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
参数指定别名
- 通过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
|
下面是证书信息