注意:在使用 SSL 证书时,如 *.example.com 证书,仅支持 a.example.com, a1.example.com, a2.example.com 以此类推域名,但是不支持 b.a.example.com(另一级), b1.a.example.com 类域名,如需支持,需另外再购买一张 *.a.example.com 证书。
原理
通过let's encrypt 与阿里云dns解析api结合,自动颁发证书。
获取阿里云AK(1)
推荐使用子用户授权 ,使用子账户的AK(AccessKey ID + Access Key Secret)
子账户授权 : 须给子账户授权如下图
获取腾讯云AK(2)
*秘钥获取地址:https://console.dnspod.cn/account/token (和腾讯云账号密码一致)
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
使用 acme.sh
acme.sh
是一个非常优秀的证书生成工具,其 官网 有详细的中文文档支持 。
- 安装 acme.sh 命令
curl https://get.acme.sh | sh
需要系统支持 socat 及 curl 模块
安装完成后将会在 home 目录下生成 .acme.sh 文件夹
为了使用方便,增加alias
alias acme.sh=~/.acme.sh/acme.sh
生成证书
- 首先将AK临时加入到环境变量中
export Ali_Key="xxxxxx"
export Ali_Secret="xxxxxxxxxxx"
- 注册账号设置邮箱
acme.sh --register-account -m my@example.com
- 执行命令
acme.sh --issue --dns dns_ali -d *.example.com
- 更新主目录不要重复
/home/zxb/ssl/ != /home/zxb/.acme.sh/
mkdir ssl
cp -r /home/zxb/.acme.sh/*.example.com/* /home/zxb/ssl/*.example.com/
- 加入定时更新
acme.sh --installcert -d *.example.com --key-file /home/zxb/ssl/*.example.com/*.example.com.key --fullchain-file /home/zxb/ssl/*.example.com/fullchain.cer --reloadcmd "sudo service nginx force-reload" --log
- archlinux =>
sudo service nginx force-reload
修改为:sudo systemctl reload nginx
如果更新的账号非root权限或sudo权限,sudo权限需要设置不需要输入密码
相关设置:https://www.jianshu.com/p/140c1a6e29a9
接下来你将看到一个120秒的倒计时
倒计时之后证书将会存储到 ~/.acme.sh/*.example.com中
nginx 配置
server {
#listen 80;
listen 443 ssl;
server_name *.[域名名].com;
#设置长连接
keepalive_timeout 70;
#HSTS策略
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
ssl_certificate /home/zxb/.acme.sh/*[域名名]/*.[域名名].cer;
ssl_certificate_key /home/zxb/.acme.sh/*.[域名名]/*.[域名名].key;
#优先采取服务器算法
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#减少点击劫持
add_header X-Frame-Options DENY;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻擊
add_header X-Xss-Protection 1;
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Via "nginx";
}
域名更新续期
#安装acme
curl https://get.acme.sh | sh
wget -O - https://get.acme.sh | sh
#查看acme版本
acme.sh --version
#请填写实际key&Secret
export Ali_Key="4xvxbCThnjerg955"
export Ali_Secret="fwyhkkp0"
#申请证书
acme.sh --issue --dns dns_ali -d *.peakchao.com
#更新证书
acme.sh --renew -d '*.peakchao.com' --force
# 查看证书列表
acme.sh --list
# 删除证书
acme.sh remove <SAN_Domains>
# 要停止更新证书,您可以执行以下操作从更新列表中删除证书
acme.sh --remove -d example.com [--ecc]
#升级 acme.sh 到最新版:
acme.sh --upgrade
#开启自动升级:
acme.sh --upgrade --auto-upgrade
#关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
#以下命令无需执行,据查看,acme会自动添加续期的定时任务
crontab -e
# 添加如下的任务:三个月执行一次
0 0 29 */3 * acme.sh --renew -d '*.peakchao.com' --force
#最后请不要忘记修改nginx配置以及重启
问题一
- curl: (35) Network file descriptor is not connected
$ curl https://get.acme.sh | sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0curl: (6) Could not resolve host: get.acme.sh; Unknown error
原因:无法访问github.com,解决方式:GitHub 解决访问错误的问题 https://www.jianshu.com/p/ccb63a379575
问题二
...
[Mon Mar 7 22:12:23 CST 2022] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 7
[Mon Mar 7 22:12:23 CST 2022] Not valid yet, let's wait 10 seconds and check next one.
[Mon Mar 7 22:12:24 CST 2022] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35
...
- 解决办法,修改host对Github的域名IP映射
sudo vi /etc/hosts
添加一下解析
140.82.114.4 github.com
185.199.108.153 github.github.io
199.232.69.194 github.global.ssl.fastly.net
199.232.28.133 raw.githubusercontent.com
- 更新证书
acme.sh --renew -d *.domain.com --force
...
[Mon Mar 7 22:34:09 CST 2022] The DNS record already exists.
[Mon Mar 7 22:34:09 CST 2022] Error add txt for domain:_acme-challenge.wc.domain.com
[Mon Mar 7 22:34:09 CST 2022] Please check log file for more details: /home/zxb/.acme.sh/acme.sh.log
...
有时候一次不能成功,多尝试几次
acme.sh --renew -d *.domain.com --force