跳转到内容

证书管理

证书管理页面截图

证书管理 — 证书列表:域名 / CA / 服务器 / 验证方式 / 状态 / 过期时间 / 部署 / 自动续期 / 自动部署

4 个 mock 域名,可以申请新证书、续期、下载、删除。完全本地。

Mock 演示4 张证书 · 一键申请 / 续期 / 删除 · 多 DNS provider
2正常1即将到期1已过期
域名DNS 提供商关联服务器到期时间状态操作
hk.example.com
Cloudflare
hk1.example.com
2026-09-12(97 天后到期)
正常
us.example.com
Cloudflare
us1.example.com
2026-07-03(26 天后到期)
即将到期
jp.example.com
Aliyun
jp1.example.comjp2.example.com
2026-11-28(174 天后到期)
正常
old.example.com
Tencent未关联服务器
2026-05-15(23 天前到期)
已过期

证书管理模块通过 ACME 协议自动申请和续期 TLS 证书。支持多种 DNS 提供商,证书自动同步到远程服务器。页面有两个选项卡:「证书列表」和「DNS 提供商」;顶部按钮为「刷新」「申请证书」「上传证书」。

提供商 所需凭证
Cloudflare API Token
阿里云 DNS AccessKey ID + Secret
腾讯云 DNSPod SecretId + SecretKey
Namesilo API Key

在「DNS 提供商」选项卡点「添加 DNS 提供商」,选择类型后按提示填入凭证即可;系统会自动生成并校验配置:

添加 DNS 提供商对话框截图

添加 DNS 提供商:名称 + 提供商类型 + API 凭证

  1. 进入「证书管理」页面,点击「申请证书」
  2. 输入域名(支持通配符,如 *.example.com)
  3. 填写邮箱,选择 CA 提供商(默认 Let’s Encrypt)
  4. 验证方式选 DNS-01(通配符必须)并选择已添加的 DNS 提供商
  5. 申请泛域名时可开启「同时申请根域名和泛域名」,系统会把 example.com 与 *.example.com 作为同一张证书的 SAN
  6. 按需开启「自动续期」「自动部署」
  7. 提交后系统完成 DNS 验证;签发结果同时保存到数据库与证书目录

申请证书对话框截图

申请 SSL/TLS 证书:域名、邮箱、CA、验证方式、DNS 提供商、根域名 + 泛域名、自动续期、自动部署

已有证书(例如由 Certimate 或其他 ACME 客户端签发)可以直接粘贴 PEM 上传:

上传证书对话框截图

上传证书:域名 + 证书内容(PEM)+ 私钥内容(PEM);对话框顶部也给出了 API 上传方式

上传后证书出现在列表中,CA 显示为 manual,同样可以下载、部署到服务器。

证书列表的「下载」会生成包含 fullchain.pem 与 privkey.pem 的压缩包。续期、重新签发或 Webhook 更新后,系统会重新下发到所有引用该证书的 Nginx 与 Xray 目录并替换旧文件;从 Agent 恢复历史 Xray 配置时也会先补发配置引用的证书。

证书到期前系统自动续期。续期成功后,证书文件自动更新到所有使用该证书的远程服务器。

证书文件路径(远程服务器):
证书: /root/cert/{domain}/fullchain.pem
私钥: /root/cert/{domain}/privkey.pem
  • VLESS/VMess/Trojan + TLS 入站需要 TLS 证书
  • Hysteria2 / AnyTLS 入站需要 TLS 证书
  • REALITY 入站不需要证书(使用目标站点证书)

添加节点向导在服务器 443 端口尚未配好证书时会弹出「SSL 配置」提示,可从那里一键为服务器配置证书与 Nginx 443。

Webhook 上传证书(Certimate 集成)

Section titled “Webhook 上传证书(Certimate 集成)”

妙妙屋X 提供 HTTP 接口接收外部证书签发系统(如 Certimate)通过 webhook 推送的证书内容,落库后自动部署到所有标记了该域名的远程服务器。

Method: POST

URL: https://your-mmwx-host/api/admin/certificates/upload

鉴权: Authorization: Bearer <token> 或 MM-Authorization: <token>(系统设置里的全局 API Token,或 admin 用户在「API Token」管理页签发的个人 Token)

Content-Type: application/json

  • domain — 证书绑定的主域名(如 *.example.com 或 a.example.com)
  • cert_pem — 证书 PEM 文本,兼容两种格式:裸 PEM(以 —–BEGIN 开头)或 base64 编码(旧 UI 上传格式)
  • key_pem — 私钥 PEM 文本,同样兼容裸 PEM 或 base64
  • 同域名已存在 → 更新现有证书记录(cert_path / key_path / 有效期),并触发自动部署
  • 首次上传 → 新建一条 manual / no-deploy 类型的证书记录,后续可在 UI 切换 deploy target
  • 成功返回 {success: true, certificate_id: N};失败返回 {success: false, message: "..."}

Certimate webhook 部署器支持 ${CERTIMATE_DEPLOYER_*} 模板变量替换为实际证书内容(裸 PEM,无 base64)。妙妙屋X 接口自动嗅探 —–BEGIN 开头识别 PEM,与原 base64 上传两路兼容。

URL: https://your-mmwx-host/api/admin/certificates/upload
Method: POST
Headers:
Authorization: Bearer <your-api-token>
Content-Type: application/json
Body:
{
"domain": "${CERTIMATE_DEPLOYER_COMMONNAME}",
"cert_pem": "${CERTIMATE_DEPLOYER_CERTIFICATE}",
"key_pem": "${CERTIMATE_DEPLOYER_PRIVATEKEY}"
}

用文件内容直接 POST,无需 base64 转码。文件路径替换成实际证书位置。

curl -X POST https://your-mmwx-host/api/admin/certificates/upload \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile cert /path/to/fullchain.pem \
--rawfile key /path/to/privkey.pem \
'{domain:"*.example.com", cert_pem:$cert, key_pem:$key}')"