常规方法
Lucky是款优秀的应用,方便零基础的兄弟低成本用上免费SSL自动续签。
但是!我知道论坛里都是高手,更喜欢自己折腾,或者介意Lucky的全能版功能太杂乱,害怕Key泄漏,那么这篇不装新应用,全手搓的教程会适合你!
核心原理
一句话:使用Docker容器自动签发证书,并自动部署到FNOS。
关键是这几步:
- 安装Alpine Linux的Docker镜像
- 安装acme.sh
- 选择DNS认证方式,并初始化好Key
- 部署到FNOS
详细步骤
Docker
使用FNOS的Docker能力,安装alpine。
设置清华源
sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories
更新源并安装软件
apk update
apk add openssh # 用于部署证书产物
apk add acme.sh # 用于自动申请证书
ACME.sh
acme.sh 是一款开源ACME客户端,支持各种DNS认证插件,非常强大。
官网:https://github.com/acmesh-official/acme.sh
在 alpine 中直接用命令安装即可。
本文不会详细讲解它的用法,但会举两个常用DNS的例子。详细用法参见:https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
⚠️注意:建议指定 --server letsencrypt 使用 letsencrypt.org 的服务,默认的zerossl 有点拉
Cloudflare
- 创建api token https://dash.cloudflare.com/profile/api-tokens
- 申请证书
# For a single domain or multiple domains within the same Cloudflare account
export CF_Token="zfNp-Xm0VhSaCNun7dkLzwnw0UN7FNjaMurUZ8vf"
export CF_Account_ID="763eac4f1bcebd8b5c95e9fc50d010b4"
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com' --server letsencrypt
Tencent Cloud
- 创建api token https://console.cloud.tencent.com/cam/capi
- 申请证书
export Tencent_SecretId="<Your SecretId>"
export Tencent_SecretKey="<Your SecretKey>"
acme.sh --issue --dns dns_tencent -d example.com -d *.example.com --server letsencrypt
Aliyun
- 创建 api token https://ram.console.aliyun.com/users
- 申请证书
export Ali_Key="<key>"
export Ali_Secret="<secret>"
acme.sh --issue --dns dns_ali -d example.com -d *.example.com --server letsencrypt
证书部署
申请好的证书是存在Docker中的,需要通过ssh工具部署到FNOS中。
允许root登录
FNOS默认是不允许root登录ssh的,可以通过调整 /etc/ssh/sshd_config 配置来允许。
PermitRootLogin prohibit-password
调整配置后,使用 systemctl restart ssh 生效。
免密码登录
在root家目录中配置证书,把公钥放到 /root/.ssh/authorized_keys 即可。记得替换成你自己的公钥,如果还没有,可以在你的工作电脑上运行 ssh-keygen 生成。
echo `ssh-ed25519 AAAAC3NzaCXXX YourKey` >> /root/.ssh/authorized_keys
添加证书
下载ACME.sh生成好的证书,并在FNOS中新增证书,上传。
菜单路径:设置 - 安全性 - 证书 - 新增证书
定位证书路径
登录ssh,运行 cat /usr/trim/etc/network_gateway_cert.conf 确认证书路径,注意区分系统默认证书和刚手动添加的证书。
里面会有一段类似这样的:
{
"host": "example.com",
"cert": "/usr/trim/var/trim_connect/ssls/example.com/1766327981/example.com.crt",
"key": "/usr/trim/var/trim_connect/ssls/example.com/1766327981/example.com.key"
}
部署证书
修改 /root/.acme.sh/account.conf ,追加:
SAVED_DEPLOY_SSH_USER='root'
SAVED_DEPLOY_SSH_SERVER='10.10.1.3'
SAVED_DEPLOY_SSH_CMD='ssh -T'
SAVED_DEPLOY_SSH_BACKUP='yes'
SAVED_DEPLOY_SSH_BACKUP_PATH='.acme_ssh_deploy'
SAVED_DEPLOY_SSH_MULTI_CALL='no'
SAVED_DEPLOY_SSH_KEYFILE='/usr/trim/var/trim_connect/ssls/example.com/1766327981/example.com.key'
SAVED_DEPLOY_SSH_CAFILE=''
SAVED_DEPLOY_SSH_FULLCHAIN='/usr/trim/var/trim_connect/ssls/example.com/1766327981/example.com.crt'
SAVED_DEPLOY_SSH_REMOTE_CMD='/usr/trim/nginx/sbin/nginx -s reload'
SAVED_DEPLOY_SSH_USE_SCP='no'
SAVED_DEPLOY_SSH_SCP_CMD='scp -q'
其中,SAVED_DEPLOY_SSH_SERVER 改成你的FNOS的IP地址,里面两个证书路径替换成上面获得的证书路径。
执行命令,完成部署,未来自动续签证书时,也会自动部署。
acme.sh --deploy -d eaxi.com --deploy-hook ssh
疑难杂症
DNS认证方式优势是不挑来源IP,也不要求签发证书和部署证书在同一台机器,但它带来了比较多的复杂性,比较容易出问题。
可以在 acme.sh 命令后面追加 --debug 来显示完整的过程信息,准确定位问题原因。
常见的原因可能是:
- API Key出错:无权添加DNS TXT记录、过期、无效等
- 网络问题
- SSH无密码登录问题
可以问问LLM,一般都能得到比较好的回答。当然,也可以直接留言给我。