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

推荐订阅源

N
News | PayPal Newsroom
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Register - Security
The Register - Security
L
LangChain Blog
A
About on SuperTechFans
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
Stack Overflow Blog
Stack Overflow Blog
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
博客园 - 司徒正美
Scott Helme
Scott Helme
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
T
Tenable Blog
腾讯CDC
Recorded Future
Recorded Future
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
G
GRAHAM CLULEY
Security Latest
Security Latest
S
Securelist
D
Darknet – Hacking Tools, Hacker News & Cyber Security
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX
T
The Blog of Author Tim Ferriss
D
Docker
S
Security Affairs
F
Full Disclosure
Know Your Adversary
Know Your Adversary
N
News and Events Feed by Topic
N
News and Events Feed by Topic
T
Tor Project blog
Hugging Face - Blog
Hugging Face - Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Microsoft Security Blog
Microsoft Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
Recent Announcements
Recent Announcements
博客园_首页
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Security @ Cisco Blogs

中文博客 on 范叶亮 | Leo Van

多智能体系统 (Multi-Agent System) 确定性和掌控欲 - 你的 AI 不是你的 AI LLM Token 消耗节省计划 (How to Save Token for LLM) 智能体的角色定位和身份演化 (Agent Role Orientation and Identity Evolution) 本地部署 OpenClaw,QwenPaw 和 Hermes Agent (Local Deployment of OpenClaw, QwenPaw and Hermes Agent) 本地部署智能体 - OpenClaw,QwenPaw,Hermes Agent ... 部署 Matrix 服务器 Synapse (Deployment of Matrix Server Synapse) 部署 frp 内网穿透服务 (Deployment of frp NAT Traversal Service) 本地部署大模型服务 (Local Deployment of LLM Services) AI 时代的生产力和生产关系 (Forces and Relations of Production in AI Era) 业余无线电入门 - CQ, CQ, CQ, this is BD1CZP. Calling CQ and standing by. 重构 - 之于代码、之于工作、之于生活 大语言模型微调 (Fine-tuning Large Language Models) 提升图片分辨率和质量 - Invoke AI 101 教程 使用画布创建和组合生成新的图片 - Invoke AI 101 教程 探索 AI 模型和概念适配器 - Invoke AI 101 教程 理解图像到图像和降噪过程 - Invoke AI 101 教程 使用控制层和指示控制图片的生成 - Invoke AI 101 教程 使用 Invoke 创作你的第一张图片 - Invoke AI 101 教程 凡人歌 - 凡人,但不要烦心 Shell 调用方式 fork,exec 和 source (Run Shell with fork, exec and source) 重定向和管道 (Redirect and Pipe) 模型压缩和推理加速 (Model Compression and Inference Acceleration) 我们需要多少种编程语言 (How Many Programming Languages do We Need) 数据可视化小贴士 - 面向动态文档生成,秉承规范、统一和实用的理念 从 rm -rf * 说起 - 喜新、怀旧、再出发 当我谈摄影时,我谈些什么 - 色彩篇 Part 1 CSS 布局和定位 (CSS Layout and Position) 当我谈修图时,我谈些什么 - 色彩篇 Part 1 在 Windows 下利用 WSL2 和 Ubuntu 配置 GPU 机器学习环境 文学编程和可重复性研究 (Literate Programming and Reproducible Research) 在 OpenWrt 中安装 Jellyfin 搭建家庭影音中心 自私和贪婪 (Selfish and Greedy) 评分和排名算法 (Rating & Ranking Algorithms) 小记这一波裁员浪潮 基于内容的图像检索 (Content-based Image Retrieval, CBIR) 你所应该知道的 A/B 测试 (A/B Test You Should Know) 一个人的摩旅 (Travel with My Motorcycle Alone) 设计语言初探 (A Glimpse of Design Language) Spark 集群搭建 (Spark Cluster Setup) Hive 安装和配置 (Hive Setup) Hadoop 集群搭建 (Hadoop Cluster Setup) 虚拟环境准备 (Virtual Environment Preparation) 大数据 SQL 性能调优 (Big Data SQL Performance Tuning) SQL 样式指南 (SQL Style Guide) 进程,线程和协程 (Process, Thread and Coroutine) - 实现篇 进程,线程和协程 (Process, Thread and Coroutine) - 理论篇 胶囊网络 (Capsule Network) 投票公平合理吗? 图存储与计算 (Network Storage and Computing) - 复杂网络系列 网络算法 (Network Algorithms) - 复杂网络系列 真实世界网络结构 (Structure of Real-World Network) - 复杂网络系列 网络表示,测度和度量 (Network Representation, Measures and Metrics) - 复杂网络系列 文本相似度 (Text Similarity) 而立之前 (Life before 30) 最近邻搜索 (Nearest Neighbor Search) 无模型策略预测和控制 - 时序差分学习 (Model-Free Policy Prediction and Control - Temporal Difference Learning) - 强化学习系列 无模型策略预测和控制 - 蒙特卡洛方法 (Model-Free Policy Prediction and Control - Monte-Carlo Learning) - 强化学习系列 利用动态规划求解马尔可夫决策过程 (Planning by Dynamic Programming) - 强化学习系列 贝叶斯优化 (Bayesian Optimization) 马尔可夫决策过程 (Markov Decision Process) - 强化学习系列 多臂赌博机 (Multi-armed Bandit) - 强化学习系列 强化学习简介 (Introduction of Reinforcement Learning) - 强化学习系列 在群晖 NAS 上编译安装 tmux 隐马尔可夫,条件随机场和序列标注 (Hidden Markov Model, Conditional Random Fields and Sequence Labeling) 图嵌入和图神经网络 (Graph Embedding and Graph Neural Network) 预训练自然语言模型 (Pre-trained Models for NLP) toB 产品用户权限 (User Privileges of toB Products) 京东数科 HIPO 学习之旅 (JDD HIPO Learning Journey) 杭州和东京之旅 (Tour of Hangzhou and Tokyo) 国际智慧温室种植挑战赛 (International Autonomous Greenhouse Challenge) 记忆中的儿时 (My Childhood in Memory) 启发式算法 (Heuristic Algorithms) 关不掉的浏览器标签页 (Browser Tabs You do not Close) 贝塞尔曲线 (Bézier Curve) 如何阅读一本书 (How to Read a Book) 相似性和距离度量 (Similarity and Distance Measurement) 集成学习算法 (Ensemble Learning) 计算复杂性与动态规划 (Computational Complexity and Dynamic Programming) 利用 Flask 和 Google App Engine 部署模型服务 序列到序列和注意力机制 (Seq2Seq and Attention Machanism) 词向量 (Word Embeddings) 循环神经网络 (Recurrent Neural Network, RNN) 泰国之行 (Tour of Thailand) 媒介之战 (War of Medias) 卷积神经网络 (Convolutional Neural Network, CNN) 买书,囤书,看书 (Buy Books, Hoard Books and Read Books) Play Safe, Smart Choice & Yuppie 基于 PyQt5/PySide2 和 QML 的跨平台 GUI 程序开发 流形学习 (Manifold Learning) 深度学习优化算法 (Optimization Methods for Deep Learning) 深度学习优化算法 (Optimization Methods for Deeplearning) 生成对抗网络简介 (GAN Introduction) Ising 模型,Hopfield 网络和受限的玻尔兹曼机 (Ising, Hopfield and RBM) 马尔科夫链蒙特卡洛方法和吉布斯采样 (MCMC and Gibbs Sampling) 特征值分解,奇异值分解和主成分分析 (EVD, SVD and PCA) 墨尔本之行 (Trip to Melbourne)
在 OpenWrt 和群晖中自动申请和部署证书
范叶亮 · 2025-05-25 · via 中文博客 on 范叶亮 | Leo Van

在 OpenWrt 和群晖中自动申请和部署证书

分类: 教程 / 字数: 2496 / 标签: OpenWrt, 群晖, Synology, 证书, Certificate, acme.sh, Let's Encrypt, Cloudflare


为了在本地局域网环境中摆脱 IP 用上域名(纯属闲来无事瞎鼓捣),购入了 leovan.dev 域名。想着把各种服务都映射到不同的二级域名上,这样就可以不用 IP 和端口了,岂不完美。然,问题这就来了。

acme.sh

域名是在 Cloudflare 上申请的,在 Cloudflare 上使用 Page 服务部署网站就可以白嫖他家的证书,还能自动帮你续期,比如当前的站点就是使用 Page 进行部署的。但你要是想生成证书下载下来使用,就会很麻烦,因为证书的有效期只有三个月,手动续期再加上各种替换操作就不太方便了。

这时候就要请出我们的 acme.sh 了,除了支持各种桌面和服务器操作系统外,还支持 OpenWrt 路由器系统。

Cloudflare

使用 acme.sh 申请免费证书需要使用 DNS 验证对域名的所有权,本文以 Cloudflare 为例,其它 DNS 请参考官方文档。Cloudflare 支持两种方式,一种是使用 API Token,另一种是使用全局 API Key,这里我们以 API Token 为例。

进入 API Token 页面,单击 创建令牌 按钮,在 API 令牌模板中选择 编辑区域 DNS,单击 使用模板 按钮。在 权限 中添加 区域 - DNS - 编辑区域 - 区域 - 读取 的权限,在 区域资源 中根据你的需求选择对应的 特定区域,例如 leovan.dev,或为了省事选择 所有区域 也可以,如下图所示:

创建 API Token

创建完毕后会生成 Token,将 Token 保存为 CF_Token="xxxxxxxxx",注意该 Token 在 Cloudflare 中不会再展示。

之后从 Cloudflare 账户主页进入对应的域名详情页面,在右下角可以找到 API 的区域 ID 和账户 ID 两个代码,如下图所示:

区域 ID 和账户 ID

将区域 ID 保存为 CF_Zone_ID="xxxxxxxxx",将账户 ID 保存为 CF_Account_ID="xxxxxxxxx"

Opwnert 使用 uHTTPd 作为默认的 Web 服务器。正如官网上说的,这是一个轻量极了的 Web 服务器,以至于不支持反向代理。

警告

那就安装一个 Nginx 吧,不是说不行,只是 Nginx 和 uHTTPd 存在冲突,你需要把路由器的 LuCI 也切换到 Nginx 上,麻烦不说,后续如果有更新还有可能又会变回 uHTTPd。自己搞了下,差点登录不进去 Web 页面,遂放弃。

但这不影响我们先把路由器的域名 router.leovan.dev 映射到 192.168.100.1 上先用起来。

acme.sh

通过 系统 - 软件包 或命令行安装 acme.sh 相关软件包:

opkg install acme acme-acmesh-dnsapi luci-app-acme luci-i18n-acme-zh-cn luci-ssl-openssl

安装完毕后可以在 服务 菜单下找到 ACME 证书 子菜单,进入后在 ACME 全局配置 中输入 电子邮件帐户,勾选 启用调试日志记录,如下图所示:

ACME 证书 - ACME 全局配置

证书配置 中删除默认的配置,在下方输入框中输入配置名称,例如 leovan_dev,如下图所示:

ACME 证书 - 证书配置

单击 添加 按钮打开配置对话框。在 常规设置 中勾选 已启用,输入所需的域名,选择验证方式为 DNS,其它保持默认,如下图所示:

ACME 证书 - 证书配置 - 常规设置

DNS 质询验证 中选择对应的 DNS API(本文使用 CloudFlare.com),并将上文中的 CF_Token="xxxxxxxxx"CF_Zone_ID="xxxxxxxxx"CF_Account_ID="xxxxxxxxx" 填写到对应的位置,其它保持默认,如下图所示:

ACME 证书 - 证书配置 - DNS 质询验证

高级设置 中根据自己的需求选择 密钥长度(本文使用 ECC 256 位),其它保持默认,如下图所示:

ACME 证书 - 证书配置 - 高级设置

单击 保存 按钮,并在 ACME 证书 页面单击 保存并应用 按钮。

稍等片刻后,如果运行正常则可以在 证书 中看到对应域名的证书,如下图所示:

ACME 证书 - 证书

同时,系统会启动自动续签,在 系统 - 计划任务 中可以看到添加了如下一条记录:

0 0 * * * /etc/init.d/acme renew

uHTTPd

通过 系统 - 软件包 或命令行安装 uHTTPd 的管理界面:

opkg install luci-app-uhttpd luci-i18n-uhttpd-zh-cn

安装完毕后可以在 服务 菜单下找到 uHTTPd 子菜单,进入后在 MAIN - 常规设置 中添加 HTTPS 监听,如下图所示:

uHTTPd - HTTPS 监听

HTTPS 证书 中选择上文中生成的证书(本文为 /etc/ssl/acme/leovan.dev.fullchain.crt),如下图所示:

uHTTPd - HTTPS 证书

HTTPS 私钥 中选择上文中生成的私钥(本文为 /etc/ssl/acme/leovan.dev.key),如下图所示:

uHTTPd - HTTPS 证书

uHTTPd 页面单击 保存并应用 按钮。

在 Cloudflare 中将 router.leovan.dev 解析到 192.168.100.1 上后,分别通过 http://192.168.100.1https://192.168.100.1https://router.leovan.dev 访问路由器,如下图所示:

路由器 - IP 和 域名访问

可以看出通过 router.leovan.dev 域名进行访问已经实现了 HTTPS 安全访问。

群晖

由于在 OpenWrt 上搞 Nginx 有些麻烦,此时此刻,恰巧手里还有一台群晖的 NAS,恰巧群晖默认支持反向代理服务器,这一切的一切不就又双叒叕完美了。

acme.sh

稍显遗憾的是在群晖中没有像 OpenWrt 那样的工具可以直接使用,这里就只能用脚本的方式手搓部署了。首先通过命令行 SSH 登录群晖,并切换到 root 用户:

由于群晖没有 crontab,因此需要使用如下命令强制安装,根据实际情况修改命令中的电子邮箱:

curl https://get.acme.sh | sh -s email=my@example.com --force

当控制台显示 Install success! 后表示安装成功。进入 /root/.acme.sh 目录,修改 account.conf 文件:

cd /root/.acme.sh
vi account.conf

account.conf 文件示例如下,请根据上文中的内容修改 CF_TokenCF_Zone_IDCF_Account_ID 配置项:

export CF_Token="xxxxxxxxx"
export CF_Zone_ID="xxxxxxxxx"
export CF_Account_ID="xxxxxxxxx"

LOG_FILE="/root/.acme.sh/acme.sh.log"
LOG_LEVEL=1

AUTO_UPGRADE="1"

ACCOUNT_EMAIL="my@example.com"
UPGRADE_HASH="xxxxxxxxx"

运行如下命令申请证书:

./acme.sh --set-default-ca --server letsencrypt
./acme.sh --issue --dns dns_cf --keylength ec-256 -d leovan.dev -d *.leovan.dev

正常情况下,申请的证书将保存在 /root/.acme.sh/leovan.dev_ecc 目录下。

运行如下命令将证书部署到群晖系统中:

export SYNO_USE_TEMP_ADMIN=1
./acme.sh --deploy --deploy-hook synology_dsm -d leovan.dev -d *.leovan.dev

此时进入群晖的 控制面板 - 安全性 - 证书 中,可以看到 leovan.dev 证书已经部署到系统中并作为默认证书,如下图所示:

控制面板 - 安全性 - 证书

在群晖中创建计划任务来实现自动更新并部署证书,在 控制面板 - 计划任务 中选择 新建 - 计划的任务 - 用户自定的脚本。在 常规 中设置 任务名称,选择 用户账号root,如下图所示:

计划任务 - 常规

计划 中设置执行的周期,由于 acme.sh 在证书到期前一个月会发起重新申请,因此可以将计划任务周期设置为每周,如下图所示:

计划任务 - 计划

任务设置 中设置 用户自定义的脚本

/root/.acme.sh/acme.sh --cron --home /root/.acme.sh

根据个人需要可以勾选 通过电子邮件发送运行详情,如下图所示:

计划任务 - 任务设置

反向代理

在 Cloudflare 中将 nas.leovan.dev 解析到 192.168.100.10 上后,在群晖的 登录门户 - 高级 单击 反向代理服务器 按钮打开对话框,单击 新增 按钮,根据下图添加配置:

反向代理

分别通过 http://192.168.100.10:500 和 https://nas.leovan.dev 访问群晖,如下图所示:

群晖 - IP 和 域名访问

可以看出通过 nas.leovan.dev 域名进行访问已经实现了 HTTPS 安全访问。

提示

针对局域网其它机器上的 Web 服务,可以先将域名解析到群晖的 IP 上,再利用群晖的反向代理转发到对应机器的 Web 服务上。对于非 Web 服务,将域名直接解析到对应的机器上即可。