惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News | PayPal Newsroom
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
NISL@THU
NISL@THU
WordPress大学
WordPress大学
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
L
LINUX DO - 热门话题
Hacker News: Ask HN
Hacker News: Ask HN
V
V2EX
G
GRAHAM CLULEY
TaoSecurity Blog
TaoSecurity Blog
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Latest news
Latest news
The Hacker News
The Hacker News
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
S
Schneier on Security
I
Intezer
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
爱范儿
爱范儿
The Register - Security
The Register - Security
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
美团技术团队
B
Blog RSS Feed

阿尔的代码屋 | 全栈技术笔记

在 Android Termux 环境下安装 Hermes Agent 的踩坑与完美解决实践 开发日志| 阿尔的代码屋 VS Code 连接 WSL 精确每 10 分钟掉线 排坑笔记 | 阿尔的代码屋 Android 模拟器代理联网与 No Internet WiFi 锁死排坑笔记 | 阿尔的代码屋 [object Object] typing_extensions 有用(四):使用 TypeIs 替代危险的 cast,做最严谨的类型收窄 | 阿尔的代码屋 GoRouter 结合 Isar 运行 Widget 测试并发/粘性线程死锁卡死排坑笔记 | 阿尔的代码屋 typing_extensions 有用(三):使用 Unpack 结合 TypedDict 给 **kwargs 装上透视眼 | 阿尔的代码屋 typing_extensions 有用(二):使用 @override 打造重构代码时的“防呆神器” | 阿尔的代码屋 Flutter 并发测试踩坑实录 - IsarCore 动态库下载冲突与 Widget 测试 HTTP 拦截全链路解决 | 阿尔的代码屋 typing_extensions 有用(一):使用 Self 终结继承时的类型推断灾难 | 阿尔的代码屋 基于 Cloudflare Pages 的纯前端 WebAssembly 应用自动化部署实践 | 开发日志 | 阿尔的代码屋 基于 VS Code 远程开发的 GPU Docker 容器自动清理方案实践 开发日志| 阿尔的代码屋 Patrol iOS 集成测试排坑实录 - xcodebuild exit code 70 全链路解决 | 阿尔的代码屋 Flutter E2E 测试从 integration_test 迁移到 Patrol - 实践笔记 | 阿尔的代码屋 Linux/macOS 下 micromamba 报错 Shard Index not available 与极度卡顿 排坑笔记 | 阿尔的代码屋 critical libmamba Shell not initialized micromamba报错 subprocess 无法修改父 Shell - 排坑笔记 | 阿尔的代码屋 VS Code Remote-SSH: 彻底告别重复输入密码 - 排坑笔记 | 阿尔的代码屋 Git 报警: inexact rename detection was skipped - 排坑笔记 | 阿尔的代码屋 Windows 下 Git error: fatal: refusing to work with credential missing host field - 排坑笔记 | 阿尔的代码屋 VS Code 调试 Python 第三方库源码的配置 - 开发技巧| 阿尔的代码屋 VS Code Remote Tunnels本地连接调试Kaggle GPU - 开发技巧| 阿尔的代码屋 Windows下Git error: open(xxxx) Filename too long - 排坑笔记 | 阿尔的代码屋 记录2026年零预约港卡开户实录避坑 告别孤岛:拥抱 MCP 协议,为大模型打造标准“USB 接口” - 大模型实战 08 完结篇 | 阿尔的代码屋 从 ReAct 到 Workflow:基于云端 API 构建事件驱动的智能体 - 大模型实战 07 额外篇 | 阿尔的代码屋 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent - 大模型实战 07 | 阿尔的代码屋 在 Kaggle 上用 Unsloth 极速微调 Qwen3 - 大模型实战 06 | 阿尔的代码屋 大模型微调实战详解 - 大模型实战 05 | 阿尔的代码屋 基于 ChromaDB 打造工程级 RAG 系统 - 大模型实战 04 | 阿尔的代码屋 拆解 Transformers 原理与图解 - 大模型实战 03 | 阿尔的代码屋 云端炼丹房 2:Kaggle 上手指南 - 大模型实战 03预备 | 阿尔的代码屋 云端炼丹房:Google Colab 免费 GPU 上手指南 - 大模型实战 03预备 | 阿尔的代码屋 Open WebUI 部署与 RAG 实战 - 大模型实战 02 | 阿尔的代码屋
解决群晖 NAS SSL 证书自动部署难题 | 阿尔的代码屋
Algieba · 2026-05-01 · via 阿尔的代码屋 | 全栈技术笔记

核心摘要 (TL;DR)

  • 痛点:家宽封禁 80/443 端口,无法使用常规 HTTP 验证申请证书;群晖面板自带 Let’s Encrypt 时常抽风;Cloudflare Origin CA 必须开小黄云且不支持部分非标准端口。
  • 方案:利用 acme.sh 脚本配合 Cloudflare API,走纯正的 DNS-01 验证 获取 Let’s Encrypt 泛域名证书。
  • 技巧:在群晖中创建一个无双重验证 (2FA) 的专用账号,利用脚本原生 Hook 绕过二次验证拦截,实现自动推送。
  • 目标:打造一套“一次配置,终身不管”的 NAS 全自动 HTTPS 证书续签与部署流水线。

前言

在家庭宽带环境下托管群晖 NAS 时,直接通过公网访问经常会遇到浏览器提示“不安全”的红色警告。解决此问题的核心在于配置受信任的 SSL 证书。

本文直接切入正题,介绍核心工具:acme.sh。由于国内家庭宽带普遍封锁了 80 端口,无法使用常规手段验证域名所有权。利用 acme.sh 调用 Cloudflare API 自动添加 TXT 记录(DNS-01 验证)是最稳妥的解决方案。

1. 核心思路与准备条件

采用 DNS-01 验证,通过调用域名解析服务商的 API,自动添加一条 TXT 记录证明域名所有权,验证完成后自动删除。

准备条件:

  1. 目标域名(例如 nas.yourdomain.com)已托管在 Cloudflare。
  2. 开启群晖(或局域网内其他 Linux 机器)的 SSH 终端服务。
  3. 关键准备:在群晖控制面板新建一个具有管理员权限,但绝对不开启双重验证 (2FA) 的专用本地账号(例如命名为 ssl_updater),专门用于脚本后台静默登录和部署证书。

2. 获取 Cloudflare API Token

为了让脚本能够自动修改 DNS 记录,需要授予其特定权限。

  1. 登录 Cloudflare 控制台。
  2. 进入右上角头像 -> 我的个人资料 -> API 令牌
  3. 点击 创建令牌,选择 编辑区域 DNS 模板。
  4. 确保包含以下两项权限:
    • 区域 - DNS - 编辑
    • 区域 - 区域 - 读取
  5. 资源范围选择目标域名。
  6. 生成后妥善保存此 Token(仅显示一次)。

3. 环境配置:安装 acme.sh 与避坑

通过 SSH 登录目标机器,使用官方一键命令安装。

3.1 一键安装脚本

1
2
curl [https://get.acme.sh](https://get.acme.sh) | sh -s [email protected]
source ~/.bashrc

3.2 切换默认 CA 机构 (绕过 Error Code 7)

acme.sh 默认使用 ZeroSSL 作为发证机构。由于网络环境限制,连接其 API 易出现 curl error code: 7(连接超时)。建议切换为连通性更好的 Let’s Encrypt,并手动注册账户:

1
2
acme.sh --set-default-ca --server letsencrypt
acme.sh --register-account -m [email protected]

3.3 避坑:跨平台换行符报错 (\r not found)

如果曾通过 Windows 环境下载并上传过脚本文件,可能会遇到 /usr/bin/env: ‘sh\r’: No such file or directory 报错。这是因为 Linux 无法识别 Windows 的换行符 (CRLF)。执行以下命令批量修复格式:

1
find ~/.acme.sh -type f -exec sed -i 's/\r$//' {} +

4. 实战:申请泛域名证书

环境配置完成后,导入获取的 Cloudflare API 信息。脚本会自动记录这些变量,用于后续的全自动续期。

1
2
3
4
5
6

export CF_Token="你的Cloudflare_API_Token"
export CF_Account_ID="你的账户ID"


acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com

执行后,脚本会自动调用 API 添加 TXT 记录。等待 Let’s Encrypt 验证通过后下载证书,最后清理临时 TXT 记录。输出 Cert success 即代表申请成功。

5. 进阶:全自动推送至群晖 (Deploy Hook)

确保证书能自动更新并应用到群晖系统,需要使用 acme.sh 的 Deploy Hook 功能。

关键步骤:绕过 2FA 验证缓存死锁

如果当前操作的 NAS 账号开启了双重验证,部署时会触发拦截要求输入 OTP 验证码。未来自动续期时无法人工输入,因此必须使用前文创建的无 2FA 账号 ssl_updater

为防止脚本读取旧账号配置缓存,请在终端内强制声明变量并执行部署:

1
2
3
4
5
6
7
8
9
10
11

export SYNO_Username="ssl_updater"
export SYNO_Password="设定的复杂密码"


export SYNO_Hostname="192.168.1.100"
export SYNO_Port="5000"
export SYNO_Scheme="http"


acme.sh --deploy -d yourdomain.com --deploy-hook synology_dsm

终端输出 Success 代表 API 调用成功。前往群晖“控制面板 > 安全性 > 证书”即可确认最新证书,系统会自动重启 Nginx 服务使其生效。

6. 常见问题 (Q&A)

Q: 运行 deploy 命令时提示 Unable to authenticate 或依然要求输入 OTP 验证码?
A: acme.sh 已经在该域名的配置文件中缓存了旧账号信息。按照第 5 节的方法,在终端重新 export 新的账号变量并运行部署命令,脚本会自动用新配置覆写旧缓存。

Q: 需要在群晖的“任务计划”里设置定时任务吗?
A: 如果 acme.sh 安装在群晖本机,由于系统更新可能重置底层 crontab,建议在群晖面板的“任务计划”中添加一条每月执行一次的自定义脚本:/root/.acme.sh/acme.sh --cron --home /root/.acme.sh。如果是安装在局域网另一台 Linux 设备上进行远程推送,则不需要此操作,该设备底层的 crontab 会自动处理。

Q: 证书的有效期及续签逻辑是什么?
A: Let’s Encrypt 证书有效期为 90 天。完成上述部署后,脚本会在证书剩余约 30 天时自动触发,执行“重新申请 -> 替换群晖旧证书 -> 重启 Web 服务”的完整流程,无需人工干预。