[GH-ISSUE #878] 请问申请完证书后的动作可以配置吗? #465

Closed
opened 2026-02-26 12:08:26 +03:00 by kerem · 4 comments
Owner

Originally created by @easonjim on GitHub (Feb 20, 2025).
Original GitHub issue: https://github.com/0xJacky/nginx-ui/issues/878

使用 acme.sh 命令申请完证书后会有重新的 shell 命令可以自定义的,比如上传到 nginx,以及更新 aliyun 的动作,请问 nginx-ui 证书管理里可以配置自定义 shell 吗?

Originally created by @easonjim on GitHub (Feb 20, 2025). Original GitHub issue: https://github.com/0xJacky/nginx-ui/issues/878 使用 acme.sh 命令申请完证书后会有重新的 shell 命令可以自定义的,比如上传到 nginx,以及更新 aliyun 的动作,请问 nginx-ui 证书管理里可以配置自定义 shell 吗?
kerem closed this issue 2026-02-26 12:08:26 +03:00
Author
Owner

@0xJacky commented on GitHub (Feb 20, 2025):

你好,出于安全考虑,不会支持自定义 shell 执行,但是上传至 aliyun 可以使用这个项目:https://github.com/0xJacky/cdn_cert

<!-- gh-comment-id:2670433829 --> @0xJacky commented on GitHub (Feb 20, 2025): 你好,出于安全考虑,不会支持自定义 shell 执行,但是上传至 aliyun 可以使用这个项目:https://github.com/0xJacky/cdn_cert
Author
Owner

@easonjim commented on GitHub (Feb 20, 2025):

太棒了

<!-- gh-comment-id:2670444026 --> @easonjim commented on GitHub (Feb 20, 2025): 太棒了
Author
Owner

@easonjim commented on GitHub (Feb 26, 2025):

@0xJacky 我用脚本完美解决了 alicdn 的变动更新,后续我在这里分享实现脚本

<!-- gh-comment-id:2683740157 --> @easonjim commented on GitHub (Feb 26, 2025): @0xJacky 我用脚本完美解决了 alicdn 的变动更新,后续我在这里分享实现脚本
Author
Owner

@easonjim commented on GitHub (Feb 27, 2025):

实现方式:
1、通过使用 inotify-tools 监控文件变化
2、通过 aliyuncli 提交证书并替换

安装 inotify-tools:
shell yum -y install inotify-tools

安装 aliyuncli:
https://help.aliyun.com/zh/cli/install-cli-on-linux

执行脚本:
1、ssl_alicdn_xxx.domain.com.sh:

#!/usr/bin/env bash

# aliyuncli token
AccessKeyId=abc
AccessKeySecret=def
RegionId=hij

# 证书文件
CERT_KEY_PATH=/etc/nginx/ssl/*.xxx.domain.com_xxx.domain.com_2048/private.key
CERT_FULLCHAIN_PATH=/etc/nginx/ssl/*.xxx.domain.com_xxx.domain.com_2048/fullchain.cer

# 获取证书自定义函数
get_cert() {
    # 使用 sed 删除掉证书文件的空行
    sed -e "/^$/d" "$CERT_FULLCHAIN_PATH"
}

# 获取密钥自定义函数
get_key() {
    cat "$CERT_KEY_PATH"
}

# 需要更新证书的 CDN 域名列表
DOMAIN_LIST=(
    "xxx.domain.com"
    "test.xxx.domain.com"
)

# 设置 CDN 域名列表使用新的证书
for _domain in "${DOMAIN_LIST[@]}"; do
    _cert_name="cert--${_domain//./_}--$(date +%Y%m%d%s)"
    # log
    echo aliyun cdn SetCdnDomainSSLCertificate --region \"${RegionId}\" --access-key-id \"${AccessKeyId}\" --access-key-secret \"\" --CertName \"${_cert_name}\" --DomainName \"$_domain\" --SSLPub=\"$(get_cert)\" --SSLPri=\"$(get_key)\"  --CertType upload --SSLProtocol on
    # shell
    aliyun cdn SetCdnDomainSSLCertificate --region "${RegionId}" --access-key-id "${AccessKeyId}" --access-key-secret "${AccessKeySecret}" --CertName "${_cert_name}" --DomainName "$_domain" --SSLPub="$(get_cert)" --SSLPri="$(get_key)"  --CertType upload --SSLProtocol on || exit 103
    sleep .5
done

2、ssl_watchdog.sh

#!/bin/sh

# 监视的文件或目录
filename=$1

# 监视发现有增、删、改时执行的脚本
script=$2

inotifywait -mrq --format '%e' --event create,delete,modify  $filename | while read event
  do
      case $event in
          MODIFY|CREATE)
              echo `date "+%Y%m%d%s"`-$event && bash $script
          ;;
          DELETE)
              echo `date "+%Y%m%d%s"`-$event
          ;;
      esac
  done

3、监控文件变化并执行:

nohup bash /path/ssl_watchdog.sh /etc/nginx/ssl/*.xxx.domain.com_xxx.domain.com_2048/fullchain.cer /path/ssl_alicdn_xxx.domain.com.sh >> /path/ssl_watchdog.sh.log 2>&1 &
<!-- gh-comment-id:2686612217 --> @easonjim commented on GitHub (Feb 27, 2025): 实现方式: 1、通过使用 inotify-tools 监控文件变化 2、通过 aliyuncli 提交证书并替换 安装 inotify-tools: `shell yum -y install inotify-tools ` 安装 aliyuncli: [https://help.aliyun.com/zh/cli/install-cli-on-linux](url) 执行脚本: 1、ssl_alicdn_xxx.domain.com.sh: ```shell #!/usr/bin/env bash # aliyuncli token AccessKeyId=abc AccessKeySecret=def RegionId=hij # 证书文件 CERT_KEY_PATH=/etc/nginx/ssl/*.xxx.domain.com_xxx.domain.com_2048/private.key CERT_FULLCHAIN_PATH=/etc/nginx/ssl/*.xxx.domain.com_xxx.domain.com_2048/fullchain.cer # 获取证书自定义函数 get_cert() { # 使用 sed 删除掉证书文件的空行 sed -e "/^$/d" "$CERT_FULLCHAIN_PATH" } # 获取密钥自定义函数 get_key() { cat "$CERT_KEY_PATH" } # 需要更新证书的 CDN 域名列表 DOMAIN_LIST=( "xxx.domain.com" "test.xxx.domain.com" ) # 设置 CDN 域名列表使用新的证书 for _domain in "${DOMAIN_LIST[@]}"; do _cert_name="cert--${_domain//./_}--$(date +%Y%m%d%s)" # log echo aliyun cdn SetCdnDomainSSLCertificate --region \"${RegionId}\" --access-key-id \"${AccessKeyId}\" --access-key-secret \"\" --CertName \"${_cert_name}\" --DomainName \"$_domain\" --SSLPub=\"$(get_cert)\" --SSLPri=\"$(get_key)\" --CertType upload --SSLProtocol on # shell aliyun cdn SetCdnDomainSSLCertificate --region "${RegionId}" --access-key-id "${AccessKeyId}" --access-key-secret "${AccessKeySecret}" --CertName "${_cert_name}" --DomainName "$_domain" --SSLPub="$(get_cert)" --SSLPri="$(get_key)" --CertType upload --SSLProtocol on || exit 103 sleep .5 done ``` 2、ssl_watchdog.sh ```shell #!/bin/sh # 监视的文件或目录 filename=$1 # 监视发现有增、删、改时执行的脚本 script=$2 inotifywait -mrq --format '%e' --event create,delete,modify $filename | while read event do case $event in MODIFY|CREATE) echo `date "+%Y%m%d%s"`-$event && bash $script ;; DELETE) echo `date "+%Y%m%d%s"`-$event ;; esac done ``` 3、监控文件变化并执行: ```shell nohup bash /path/ssl_watchdog.sh /etc/nginx/ssl/*.xxx.domain.com_xxx.domain.com_2048/fullchain.cer /path/ssl_alicdn_xxx.domain.com.sh >> /path/ssl_watchdog.sh.log 2>&1 & ```
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/nginx-ui#465
No description provided.