Published 2 years ago
Published 2 years ago
dominicx
Updated 2 years ago
0
可以直接使用acme.sh脚本,也可以使用容器,我使用了容器。
先拉取容器:docker pull neilpang/acme.sh
再初始生成证书:docker run --rm -it -v "/data/acme":/acme.sh neilpang/acme.sh --issue --dns dns_tencent -d *.987654321.xyz -d 987654321.xyz --yes-I-know-dns-manual-mode-enough-go-ahead-please
这里我使用的是腾讯云的域名服务,如果是其他DNS注册商,请更改dns_tencent ,具体参考acme.sh文档。987654321.xyz 为需要使用的域名。
具体acme.sh过程不赘述,需要提供各DNS注册商的SecretId、SecretKey。初次申请SSL证书运行成功之后可以补充到/data/acme/account.conf文件中。
把上一步的SSL下载到本地之后,在雷池WAF中“防护站点”->"证书管理" 中添加证书或者更新证书。这里获取证书在雷池WAF中的id。一般第一个是1 第二个是2,具体ID请自行获取(友情提示:按F12再编辑证书可见ID)
建立脚本目录:mkdir /data/acme/scripts
建立证书归档目录:mkdir /data/acme/archived/
编辑脚本:vi /data/acme/scripts/renew.sh
进入编辑模式之后输入一下内容
#!/bin/bash
#auto renew ssl for safeline waf
#by dominicx
#cert id in safeline for this ssl
CERTID=2
DOMAIN="987654321.xyz"
ARCHIVEDDIR="/data/acme/archived/"
#step 1 renew ssl cert
docker run --rm -it -v "/data/acme":/acme.sh neilpang/acme.sh --issue --dns dns_tencent -d "*.$DOMAIN" -d "$DOMAIN"
newfile="/data/acme/*.$DOMAIN\_ecc/*.$DOMAIN.cer"
oldfile="/data/safeline/resources/nginx/certs/cert_$CERTID.crt"
newkey="/data/acme/*.$DOMAIN\_ecc/*.$DOMAIN.key"
oldkey="/data/safeline/resources/nginx/certs/cert_$CERTID.key"
if [ ! -e $newfile ] || [ ! -e $newkey ] ; then
echo "至少有一个文件不存在,请检查文件路径。"
echo $newfile
echo $newkey
exit 1
fi
newfile_ts=$(stat -c %Y $newfile)
oldfile_ts=$(stat -c %Y $oldfile)
if [ $[$newfile_ts - $oldfile_ts] -ge 300 ]; then #5 minutes
echo "Move old SSL cert files to $ARCHIVEDDIR ."
mv $oldfile $ARCHIVEDDIR
mv $oldkey $ARCHIVEDDIR
echo "Copy new SSL cert files."
cp $newfile $oldfile
cp $newkey $oldkey
keystr="$(<$newkey)"
certstr="$(<$newfile)"
sql="update mgt_ssl_cert set updated_at=to_timestamp($newfile_ts),valid_before=CAST(concat(to_timestamp($newfile_ts+90*24*3600)::date+1,' 07:59:59+08') AS TIMESTAMPTZ ),cert_content='$certstr',key_content='$keystr' where id=$CERTID;"
#update safeline pg
docker exec -it safeline-pg psql -U safeline-ce safeline-ce -c "$sql"
#nginx reload ssl cert
docker exec -it safeline-tengine nginx -s reload
echo "updating site $CERTID SSL cert file Done."
fi
脚本说明:
crontab -e 添加定时任务
15 1 1,15 * * /data/acme/scripts/renew.sh >/dev/null
在1号15号1点15分调度任务执行,可以根据需要修改。
dominicx
Updated 2 years ago
0
腾讯云的Tencent_SecretId和Tencent_SecretKey
可以直接放到account.conf文件
Tencent_SecretId='AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Tencent_SecretKey='XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
运行成功后会变成下面样子,不用担心。
SAVED_Tencent_SecretId='AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxx'
SAVED_Tencent_SecretKey='XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
dominicx
Updated 2 years ago
0
其实也可以让acme.sh在docker之外运行用reload cmd来完成优化。
期待 雷池waf 整合一下。
zpxzgh
Updated a year ago
0
非常感谢大佬提出的解决方案!同期待雷池官方整合证书DNS更新。
顺便提供一点我实际使用时遇到的问题和解决方案。
直接按照大佬的方案操作,大部分情况是没问题的,PC网页也都正常,唯独bitwarden的安卓客户端会有证书问题。
后来我排查发现,导入证书的时候,不能导入*.$DOMAIN.cer,而是要导入fullchain.cer。貌似是因为bitwarden客户端的验证要求比较严格。
另外我发现,开启了BOT防护中的人机验证后,bitwarden的安卓客户端也会连不上,其它防护暂时没问题。
希望能帮到遇到同样问题的人 。