SSL安全证书生成&管理

最近SSL又经常面临更新,免费的阿里云,总是那么不方便。况且还不支持泛域名。考虑到SSL目前似乎已经是广泛的方法。查了查let’s还不错,但官方给的工具有点麻烦。考虑了下还是用acme.sh。默认server 支持的是zerossl,据说比let’s更自由。反正都差不多,记录一下设置过程。

安装

  • 直接安装

网络通畅,github访问流畅可以使用,毕竟shell中也是要抓取github的数据

1
curl  https://get.acme.sh | sh -s email=xxxx@xxx.com
  • 下载安装

直接clone代码,也可以找个release版本下了后安装。毕竟github时不时会有抽风的时候。

1
2
3
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m xxx@xxx.com

注册Zero SSL

不一定用这个,也可以用let’s,但较为偷懒,就用默认呗

注册后,在Developer中,生成 EAB Credentials,用生成的kid和hmac-key。

用生成的key进行登陆,完成与Zero SSL的对接

1
2
3
./acme.sh --register-account  --server zerossl \
--eab-kid xxxx \
--eab-hmac-key xxx

与域名供应商API接口对接,生成SSL

域名供应商需要对SSL,生成TXT解析。这个步骤可以通过acme.sh与域名厂商API对接,直接生成。
这就完成了,通过域名厂商生成TXT解析->Zero SSL生成证书的过程。

godaddy的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#设定godaddy的秘钥,秘钥通过godaddy厂商出生成
export GD_Key="xxxxx"
export GD_Secret="xxxxxx"

#指定SSL安全证书生成厂商和域名服务提供商,生成证书
~/.acme.sh/acme.sh --server zerossl --issue --dns dns_gd -d 域名 -d *.域名
#此时证书会在~/.acme.sh/域名/

#安装证书至某个特定位置,并设置重启命令
~/.acme.sh/acme.sh --install-cert -d 域名 -d *.域名 \
--cert-file /home/user/cert/域名/域名.crt \
--key-file /home/user/cert/域名/域名.key \
--fullchain-file /home/user/cert/域名/域名.pem \
--reloadcmd "sudo docker exec -it nginx /etc/init.d/nginx reload"

#生成dhparam
openssl dhparam -out dhparams.pem 2048

配置visudo(用普通用户账户时使用)

1
2
3
4
sudo vimsudo

#添加一行
ubuntu ALL=(ALL) NOPASSWD: /usr/bin/docker exec -it nginx /etc/init.d/nginx reload

配置Web服务

Apache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<VirtualHost *:443>
ServerName www.域名
ServerAlias 域名
ServerAdmin webmaster@localhost
DocumentRoot "/www/域名"
DirectoryIndex index.php index.html

#SSL部分
SSLEngine on

#这里的cert为--cert-file参数生成的文件
SSLCertificateFile /www/test_fosun_fam/acme/cert.pem
SSLCertificateKeyFile /www/test_fosun_fam/acme/key.pem
SSLCertificateChainFile /www/test_fosun_fam/acme/fullchain.pem

</VirtualHost>
Nginx

SSL检测 网址

ssl检测方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 443 ssl http2;

#支持ssl3
ssl_protocols SSLv3 TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security max-age=31536000;
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/ssl/certs/domain.pem;
ssl_prefer_server_ciphers on;
ssl_buffer_size 1400;

ssl_stapling on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
ssl_stapling_verify on;

#这里的cert为--fullchain-file参数生成的文件
ssl_certificate /etc/ssl/certs/domain.pem;
ssl_certificate_key /etc/ssl/certs/domain.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
}

更新

手动更新

1
acme.sh --renew -d 域名

自动更新

默认安装证书时会自动创建定时任务,也可以手工添加定时任务

1
2
3
4
5
6
#手工增加定时任务
acme.sh --cron -f


#用此命令查看
crontab -l

可以通过手工运行该命令进行测试

1
"/用户目录/.acme.sh"/acme.sh --cron --home "/用户目录/ubuntu/.acme.sh"

正常情况内容:

1
2
3
4
5
6
7
8
9
[Sat Feb  5 15:55:34 HKT 2022] ===Starting cron===
[Sat Feb 5 15:55:34 HKT 2022] Already uptodate!
[Sat Feb 5 15:55:34 HKT 2022] Upgrade success!
[Sat Feb 5 15:55:34 HKT 2022] Auto upgraded to: 3.0.2
[Sat Feb 5 15:55:34 HKT 2022] Renew: '域名'
[Sat Feb 5 15:55:34 HKT 2022] Skip, Next renewal time is: Fri Apr 1 16:20:50 UTC 2022
[Sat Feb 5 15:55:34 HKT 2022] Add '--force' to force to renew.
[Sat Feb 5 15:55:34 HKT 2022] Skipped 域名
[Sat Feb 5 15:55:34 HKT 2022] ===End cron===

增加CAA

在域名服务商dns解析中增加CAA解析

其中name为域名前缀,如果是泛解析用@,否则用自定义前缀
Flags 设置0
Tag设置 issue
Value 域名
TTL 时效

“issue”标签可用于非通配符域和通配符域,而“issuewild”标签仅影响通配符域
“issue”标签允许 CA 为非通配符域 (www.example.com) 和通配符域 (*.example.com) 颁发证书。您可以使用“issuewild”标签指示 CA 如何处理通配符域。下面的示例显示了为 *.example.com 请求证书时哪些 CAA 记录生效:

upload successful

官方推荐设置

Example #1:
Allow ZeroSSL certificates for site.com, including any subdomains as well as wildcards.

site.com. 3600 IN CAA 0 issue “sectigo.com”
site.com. 3600 IN CAA 0 issuewild “sectigo.com”

Example #2:
Allow ZeroSSL certificates for example.com, including any subdomains but not including wildcards.

site.com. 3600 IN CAA 0 issue “sectigo.com”
site.com. 3600 IN CAA 0 issuewild “;”
Example #3:
Allow ZeroSSL certificates for page.site.com only, not including the root domain, any subdomains as well as wildcards.

page.site.com. 3600 IN CAA 0 issue “sectigo.com”
site.com. 3600 IN CAA 0 issuewild “;”
site.com. 3600 IN CAA 0 issue “;”