TrueNas 25.04 ACME设置阿里DNS
原帖在这里:Howto: ACME DNS-Authenticator shell script using acmesh project
但是原帖的脚本好像有些问题,此处进行更正,并提供测试方法
SSL证书有网站验证和DNS验证两种。对于没有公网条件Nas设备,DNS验证是很好的方法。
但TrueNas 25.04默认的ACME DNS只有cloudflare/digitalocean/route53/OVH这四个DNS提供商,其他的想用DNS验证就只能自己写shell。这里用阿里云dns举例
设置Shell ACME DNS-Authenticators
1. 为脚本找一个存放的位置
无论是创建dataset还是直接放到系统里,选择一个目录存放之后的脚本。这个地址会存放明文密码,注意权限。
2. 创建Shell
cd <dir>
mkdir config # acme.sh需要一个保存用户配置的目录,会明文保存密码,注意权限
git clone https://github.com/acmesh-official/acme.sh.git
vim acmeShellAuth.sh
chmod 700 config acmeShellAuth.sh
#!/bin/bash### VARIABLES
# Logfile
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
LOGFILE="${SCRIPT_DIR}/acmeShellAuth.log"# Source acmesh scripts
export ACME_FOLDER="${SCRIPT_DIR}/acme.sh" # Change this path to reflect yourf environment
export ACME_DNSAPI="${ACME_FOLDER}/dnsapi"
export PROVIDER="dns_ali" # Find provider script in 'dnsapi' folder
source "${ACME_FOLDER}/acme.sh" --config-home "${SCRIPT_DIR}/config" > /dev/null 2>&1
source "${ACME_DNSAPI}/${PROVIDER}.sh" > /dev/null 2>&1# Dns API authentication. See details for your provider https://github.com/acmesh-official/acme.sh/wiki/dnsapi
export Ali_Key=""
export Ali_Secret=""### FUNCTIONS
_log_output() {echo `date "+[%a %b %d %H:%M:%S %Z %Y]"`" $*" >> ${LOGFILE}
}### MAIN
_log_output "INFO Script started."
# File/folder validation
if [ ! -d "${ACME_FOLDER}" ]; then_log_output "ERROR Invalid acme folder: ${ACME_FOLDER}"return 1
fi
if [ ! -f "${LOGFILE}" ]; thentouch "${LOGFILE}"chmod 500 "${LOGFILE}"
fi
# Main
#_log_output "$0" "$@" #only for debug
_log_output "$1" "$2"
if [ "${1}" == "set" ]; then${PROVIDER}_add "${3}" "${4}" >> ${LOGFILE} 2>/dev/null#_log_output "${PROVIDER}_add" "${3}" "${4}" # only for debug
elif [ "${1}" == "unset" ]; then${PROVIDER}_rm "${3}" "${4}" >> ${LOGFILE} 2>/dev/null#_log_output "${PROVIDER}_rm" "${3}" "${4}" # only for debug
fi
#_log_output "$0" "$@" # only for debug
_log_output "INFO Script finished."
测试一下你的脚本:
./acmeShellAuth.sh set nas.your.domain _acme-challenge.nas.your.domain ABCDEFG
./acmeShellAuth.sh unset nas.your.domain _acme-challenge.nas.your.domain ABCDEFG
如果确定是acme dns的问题,可以source这个脚本
source acmeShellAuth.sh
dns_ali_add _acme-challenge.nas.your.domain ABCDEFG
dns_ali_rm _acme-challenge.nas.your.domain ABCDEFG
3. 添加Shell DNS-Authenticators
在 Credentials-> certificates -> ACME DNS-Authenticators -> Add 添加
- Name -> 随便填写
- Authenticator -> shell
- Script -> 指向脚本的绝对路径,如:/mnt/data/acme/acmeShellAuth.sh
- User -> 设置执行脚本的用户,确保以该用户运行脚本无问题
- Timeout -> 60
- Delay -> 60
4. 创建CSR,并用上面创建的DNS-Authenticator验证
先Add,填写相关信息。然后点击扳手设置dns验证并进行验证。
阿里云RAM权限设置
新增带AccessKey的用户
想要获得阿里云的Accesskey,需要新增用户,选中`使用永久AccessKey。
设置用户权限
如果没有特殊需求可以为账户设置所有DNS权限AliyunDNSFullAccess
,如果AccessKey泄漏,可以访问该用户名下所有域名的解析。
或者,需要新增一个权限策略,限制AccessKey访问某个特定的域名。
理论上应该还可以设置只允许TXT记录,没有深入研究了,限定域名对我来说已经足够。
{"Version": "1","Statement": [{"Effect": "Allow","Action": ["alidns:DescribeDomainRecords","alidns:DeleteDomainRecord","alidns:AddDomainRecord"],"Resource": "acs:alidns:*:*:domain/your.domain"},{"Effect": "Allow","Action": "alidns:DescribeDomains","Resource": "*"}]
}