TrueNas 25.04 ACME设置阿里DNS

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}" ]; then
        touch "${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 添加

  1. Name -> 随便填写
  2. Authenticator -> shell
  3. Script -> 指向脚本的绝对路径,如:/mnt/data/acme/acmeShellAuth.sh
  4. User -> 设置执行脚本的用户,确保以该用户运行脚本无问题
  5. Timeout -> 60
  6. Delay -> 60

4. 创建CSR,并用上面创建的DNS-Authenticator验证

image

先Add,填写相关信息。然后点击扳手设置dns验证并进行验证。

阿里云RAM权限设置

新增带AccessKey的用户

想要获得阿里云的Accesskey,需要新增用户,选中`使用永久AccessKey。

image

设置用户权限

如果没有特殊需求可以为账户设置所有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": "*"
    }
  ]
}
posted @ 2025-08-10 23:12  Kyanch  阅读(61)  评论(0)    收藏  举报