收起左侧

飞牛fnos使用acme.sh自动部署并自动更新ssl证书

3
回复
130
查看
[ 复制链接 ]

0

主题

2

回帖

0

牛值

江湖小虾

为飞牛OS部署ssl证书,第一步当然需要自己的域名,我使用的是腾讯云的dns服务,因此脚本也是在dnspod的基础上制作。域名的注册及API秘钥的获取网上资料比较多,这里略过。证书服务商我使用的是letsencrypt,因为相比zerossl省了注册这一步。

脚本实现全自动部署,无需在飞牛OS界面先新增域名,所有操作将在脚本里完成,因此也适用于全新的飞牛OS系统。

第一步:打开飞牛OS的SSH功能

登陆飞牛OS,在 “系统设置”-->“SSH” 界面,把SSH功能打开。

第二步:使用终端工具SSH登陆到飞牛OS

终端工具网上很容易找到,这里也略过。SSH的账号密码是飞牛OS界面的账号密码,并通过 sudo -i 切换到 root ,切换时输入飞牛OS界面账号的密码。

第三步:下载及安装 acme.sh

在 /opt 下创建 acme 目录,并在该目录下载并安装 acme.sh

mkdir -p /opt/acme && cd /opt/acme && git clone https://gitee.com/neilpang/acme.sh.git && cd acme.sh && ./acme.sh --install -m my@server.com

第四步:将脚本复制保存,脚本命名为 acmedeploy.sh ,上传到 /tmp

脚本在本贴二楼,或可到我的CSDN获得最新的脚本:https://blog.csdn.net/jummewu/article/details/149403442

脚本里有几个必须修改的变量,如果变量不正确将影响脚本的正常运行

一是 DOMAIN ,修改为自己的域名,域名不包含二级域名,如 abc.com

二是 DNS,修改为自己使用的DNS服务商,如腾讯云dnspod是 dns_pd

三是 DP_Id 和 DP_Key,即dnspod的API秘钥信息

第五步:移动并检查上传的脚本

将传到 /tmp 的脚本移到 /opt/acme,并删除换行符

cd /opt/acme/
mv /tmp/acmedeploy.sh .
sed -i "s/\r//" acmedeploy.sh

第六步:执行脚本,直至脚本执行完毕

第七步:重新登陆飞牛OS,已不再提示网站不安全

点击URL左侧的锁可以查看证书的相关信息,在 系统设置 --> 安全性 --> 证书 界面也可查到对应域名的证书及相关信息

第八步:根据自己的习惯配置定时任务

在SSH终端界面输入

crontab -e

建议把acme.sh默认的定时任务注释掉,新增一条

0 0 * * 1 bash /opt/acme/acmedeploy.sh >> /opt/acme/acmedeploy.log 2>&1

即每周一凌晨零点执行一次生成证书操作,因为证书有效期有90天,所以调整为每个月执行一次也是没问题的

至此飞牛fnos使用acme.sh自动部署并自动更新ssl证书的所有操作完成。

收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

2

回帖

0

牛值

江湖小虾

昨天 16:54 楼主 显示全部楼层
#!/bin/bash

# 转载内容时需注明出处 https://blog.csdn.net/jummewu 蜈蚣出品

# 获取脚本开始运行时间戳
TT=$(date +%s%3N)

# 下载并安装 acme.sh
#mkdir -p /opt/acme && cd /opt/acme && git clone https://gitee.com/neilpang/acme.sh.git && cd acme.sh && ./acme.sh --install -m my@server.com

# acme.sh 脚本路径
ACME_DIR="/opt/acme/acme.sh"

# SSL证书域名
export DOMAIN="mydomain.com"

# DNS类型,dns_ali dns_dp dns_gd dns_aws dns_cf 等,具体支持列表详见 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
export DNS="dns_dp"

# 腾讯云dnspod的API秘钥,其他DNS请自行修改变量名及替换脚本
export DP_Id="123456"
export DP_Key="abcdefghijklmnopqrstuvwxyz123456"

# DNS API 生效等待时间 值(单位:秒),一般120即可
# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)
DNS_SLEEP="120"

# 证书服务商,zerossl 和 letsencrypt,我使用letsencrypt,使用zerossl还需要注册
CERT_SERVER="letsencrypt"

# zerossl注册邮箱及EAB,访问 https://app.zerossl.com/developer 获取账号 EAB_kid & EAB_hmac_key
#Email= 
#EAB_kid= 
#EAB_hmac_key= 

# 飞牛OS SSL证书路径
SSLS_DIR="/usr/trim/var/trim_connect/ssls"

# 飞牛OS重启服务命令行
ReloadCMD="systemctl restart webdav.service smbftpd.service trim_nginx.service"

# 制作证书
if [[ "${CERT_SERVER}" == "letsencrypt" ]] ; then
	${ACME_DIR}/acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}" -d "*.${DOMAIN}"
	if [ $? -ne 0 ] ; then
		echo -e  "制作证书失败,脚本退出. . ."
		exit
	fi
fi

if [[ "${CERT_SERVER}" == "zerossl" ]] ; then
	${ACME_DIR}/acme.sh --register-account -m ${Email} --server ${CERT_SERVER} --eab-kid ${EAB_kid} --eab-hmac-key ${EAB_hmac_key} --issue --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}" -d "*.${DOMAIN}"
	if [ $? -ne 0 ] ; then
		echo -e  "制作证书失败,脚本退出. . ."
		exit
	fi
fi

# 获取证书详细时间戳并创建目录
CERT_CREATE=$(${ACME_DIR}/acme.sh --info -d "${DOMAIN}" | grep Le_CertCreateTime= | awk -F= '{print $2}')
CERT_CREATE_TT=$(date -d "$(${ACME_DIR}/acme.sh --info -d "${DOMAIN}" | grep Le_CertCreateTimeStr= | awk -F= '{print $2}')" +%s%3N)
CERT_RENEW=$(${ACME_DIR}/acme.sh --info -d "${DOMAIN}" | grep Le_NextRenewTime= | awk -F= '{print $2}')
CERT_RENEW_TT=$(date -d "$(${ACME_DIR}/acme.sh --info -d "${DOMAIN}" | grep Le_NextRenewTimeStr= | awk -F= '{print $2}')" +%s%3N)
mkdir -p ${SSLS_DIR}/"${DOMAIN}"/${CERT_CREATE}
DOMAIN_SSL_DIR=${SSLS_DIR}/"${DOMAIN}"/${CERT_CREATE}

# 安装证书到域名证书目录,acme.sh部署API暂未支持飞牛,详见 https://github.com/acmesh-official/acme.sh/wiki/deployhooks
${ACME_DIR}/acme.sh --install-cert -d "${DOMAIN}" --cert-file ${DOMAIN_SSL_DIR}/"${DOMAIN}".crt --key-file ${DOMAIN_SSL_DIR}/"${DOMAIN}".key --fullchain-file ${DOMAIN_SSL_DIR}/fullchain.crt --ca-file ${DOMAIN_SSL_DIR}/issuer_certificate.crt --reloadcmd "${ReloadCMD}"

# 配置证书文件权限
chmod 755 ${DOMAIN_SSL_DIR}/"${DOMAIN}".crt
chmod 755 ${DOMAIN_SSL_DIR}/"${DOMAIN}".key
chmod 755 ${DOMAIN_SSL_DIR}/fullchain.crt
chmod 755 ${DOMAIN_SSL_DIR}/issuer_certificate.crt

# 获取证书颁发者信息
CERT_ISSUED_BY=$(openssl x509 -in ${DOMAIN_SSL_DIR}/"${DOMAIN}".crt -noout -issuer | awk -F' = ' '{print $4}')

# 获取证书加密类型信息
SIG_ALGO=$(openssl x509 -in ${DOMAIN_SSL_DIR}/"${DOMAIN}".crt -noout -text | awk '/Signature Algorithm/ {print $3}' | awk 'END {print}')
shopt -s nocasematch
case $SIG_ALGO in
	*RSA*)
		ALGO_TYPE="RSA"
		;;
	*ECDSA*)
		ALGO_TYPE="ECDSA"
		;;
	*ECC*)
		ALGO_TYPE="ECC"
		;;
	*SM2*)
		ALGO_TYPE="SM2"
		;;
	*)
		ALGO_TYPE="UNKNOW"
		;;
esac

# 新增或更新飞牛OS证书数据库信息
if [ ! -z $(psql -t -A -U postgres -d trim_connect -c "SELECT domain FROM cert WHERE domain = '"${DOMAIN}"';" | sed  '/^\s*$/d') ] ; then
	# 飞牛OS更新数据库证书信息
	psql -U postgres -d trim_connect -c "UPDATE cert SET valid_from = ${CERT_CREATE_TT}, valid_to = ${CERT_RENEW_TT}, encrypt_type = '${ALGO_TYPE}', issued_by = '${CERT_ISSUED_BY}', last_renew_time =  ${TT}, des = '由acme.sh自动生成的证书', private_key = '${DOMAIN_SSL_DIR}/"${DOMAIN}".key', certificate = '${DOMAIN_SSL_DIR}/"${DOMAIN}".crt', issuer_certificate = '${DOMAIN_SSL_DIR}/issuer_certificate.crt', status = 'suc', created_time =  ${TT}, updated_time =  ${TT} WHERE domain = '"${DOMAIN}"';"
	if [ $? -ne 0 ] ; then
		echo -e  "更新数据库证书信息失败,脚本退出. . ."
		exit
	fi
else
	DOMAIN_ID=$[$(psql -t -A -U postgres -d trim_connect -c "SELECT id FROM cert ORDER BY id ASC;" | awk 'END {print}')+1]
	psql -U postgres -d trim_connect -c "INSERT INTO cert VALUES ("${DOMAIN_ID}", '"${DOMAIN}"', '*."${DOMAIN}","${DOMAIN}"', ${CERT_CREATE_TT}, ${CERT_RENEW_TT}, '${ALGO_TYPE}', '${CERT_ISSUED_BY}', ${TT}, '由acme.sh自动生成的证书', 0, null, 'upload', null, '${DOMAIN_SSL_DIR}/"${DOMAIN}".key', '${DOMAIN_SSL_DIR}/"${DOMAIN}".crt', '${DOMAIN_SSL_DIR}/issuer_certificate.crt', 'suc', ${TT}, ${TT});"
	if [ $? -ne 0 ] ; then
		echo -e  "更新数据库证书信息失败,脚本退出. . ."
		exit
	fi
fi

# 更新飞牛OS NGINX 配置文件
\cp -rfL /usr/trim/etc/network_gateway_cert.conf /usr/trim/etc/network_gateway_cert.conf.${TT}.bak
NETWORK_GATEWAY_CERT="{\"host\":\""${DOMAIN}"\",\"cert\":\"${DOMAIN_SSL_DIR}/fullchain.crt\",\"key\":\"${DOMAIN_SSL_DIR}/"${DOMAIN}".key\"},"
grep -E ""${DOMAIN}"" /usr/trim/etc/network_gateway_cert.conf >/dev/null 2>&1
if [ $? -eq 0 ] ; then
	sed -i "s|{\"host\":.*\/usr\/.*"${DOMAIN}".*},|${NETWORK_GATEWAY_CERT}|g" /usr/trim/etc/network_gateway_cert.conf
else
	awk '{gsub(/^./,""); print}' /usr/trim/etc/network_gateway_cert.conf > /tmp/fn1
	sed -i "1i[${NETWORK_GATEWAY_CERT}" /tmp/fn1
	sed -i ':a;N;$!ba;s/\n//g' /tmp/fn1
	\cp -rfL /tmp/fn1 /usr/trim/etc/network_gateway_cert.conf
	rm -rf /tmp/fn1
fi

# 飞牛OS删除无效证书
find ${SSLS_DIR}/"${DOMAIN}"/ -mtime +90 -type d -exec rm -rf {} \; > /dev/null 2>&1
${ReloadCMD}

1

主题

5

回帖

0

牛值

江湖小虾

赞,这样挺简单的,跟系统自带的 DDNS 一样,基本不用设置

0

主题

2

回帖

0

牛值

江湖小虾

10 小时前 楼主 显示全部楼层

2025/07/18

更新了 # 更新飞牛OS NGINX 配置文件 部分的逻辑及替换方式

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则