在GitHub上看了acme的使用说明,折腾了很久,由于对Linux命令不熟悉,到时遇到了好多问题,以后有机会再总结下问题。最后在飞牛的论坛找到了大神的脚本,读了下基本步骤都走过了,所以一下就部署成功,来做个笔记进行记录。
*脚本来源结尾标注
- 一、部署前准备工作:
- 1、已经配置好域名并可以正常解析访问(具体操作不在这里记录,待补充笔记链接)
- 2、开启飞牛OS的SSH功能

- 二、开始部署
- 1、打开电脑终端,以Windows为例win+R,输入CMD,回车;
- 2、终端窗口输出ssh {account}@{IP},回车,账号密码就是飞牛OS的账号密码,并通过 sudo -i 切换到 root ,切换时输入飞牛OS界面账号的密码。

- 3、在 /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 anyway@emailserver.com

- 4、在/opt/acme目录下创建acmedeploy.sh文件
cd /opt/acme
touch acmedeploy.sh
- 5、编辑acmedeploy.sh文件【脚本出处 https://blog.csdn.net/jummewu 蜈蚣出品进行阿里云域名的修改】
vi acmedeploy.sh
- 6、键盘i进行输出,粘贴以下代码
#!/bin/bash
# 获取脚本开始运行时间戳
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 anyway@emailserver.com1
# acme.sh 脚本路径
ACME_DIR="/opt/acme/acme.sh"
# SSL证书域名
export DOMAIN="mydomain.com2"
# DNS类型,dns_ali dns_dp dns_gd dns_aws dns_cf 等,具体支持列表详见 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
export DNS="dns_ali"
# 阿里云的AccessKey,其他DNS请自行修改变量名及替换脚本
export Ali_Key3="1234564"
export Ali_Secret="abcdefghijklmnopqrstuvwxyz1234565"
# 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
# 获取证书详细时间戳并创建目录
CertCreateTime="$(${ACME_DIR}/acme.sh --info -d "${DOMAIN}" | grep CertCreateTimeStr= | awk -F= '{print $2}' | sed 's|T| |g' | sed 's|Z||g')"
NextRenewTime="$(${ACME_DIR}/acme.sh --info -d "${DOMAIN}" | grep Le_NextRenewTimeStr= | awk -F= '{print $2}' | sed 's|T| |g' | sed 's|Z||g')"
CERT_CREATE=$(date -d "${CertCreateTime} 7 hour" +%s)
CERT_CREATE_TT=$(date -d "${CertCreateTime} 7 hour" +%s%3N)
CERT_RENEW=$(date -d "${NextRenewTime} 1 month 7 hour" +%s)
CERT_RENEW_TT=$(date -d "${NextRenewTime} 1 month 7 hour" +%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}
7、修改以下对应的变量参数
- 任意的邮箱地址,如10000@qq.com ↩︎
- 你的域名地址,如abc.com ↩︎
- 注意这里的变量名需要根据域名提供商进行修改,这里阿里云是Ali_Key和Ali_Secret,原作者用的腾讯云dnspod就是DP_Id和DP_Key, ↩︎
- 修改成你阿里云的AccessKey_ID ↩︎
- 修改成你阿里云的AccessKey_Secret,获取方法到需要到阿里云账号管理处生成 ↩︎
- 8、保持退出
:wq
- 9、删除换行符,我理解是清洗格式,减少报错
sed -i "s/\r//" acmedeploy.sh
- 10、执行脚本,直至脚本执行完毕

- 11、新增一条定时任务替换acme的默认定时任务
crontab -e
#新增下面的定时任务,每月一号执行任务
0 0 1 * * bash /opt/acme/acmedeploy.sh >> /opt/acme/acmedeploy.log 2>&1
简单说明下crontab的用法,以下是时间循环的定义,其中*为不限制
minute(m) : 代表一小时内的第几分,范围 0-59。
hour (h) : 代表一天中的第几小时,范围 0-23。
mday (dom) : 代表一个月中的第几天,范围 1-31。
month(mon) : 代表一年中第几个月,范围 1-12。
wday (dow) : 代表星期几,范围 0-7 (0及7都是星期天)。
who : 要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。
command(command):所要执行的指令。
#Ctrl+O为保持,Ctrl+X为退出
- 12、修改配置项,重定向到https访问,强制要求所有HTTP请求通过HTTPS协议传输
#编辑文件
vi /usr/trim/etc/network_gateway_setting.conf
#把force_https的false值改成true并保存
#重启nginx
systemctl restart trim_nginx
发表回复