文档与帮助中心

使用文档

从域名验证到证书签发、自动续期、自动部署与 API 接入的完整指南。按左侧目录快速定位。

1 快速开始

三步完成第一张证书的签发。HTTP-01 适合单域名且服务器 80 端口可达;DNS-01 适合泛域名或无法开放 80 端口的场景。

登录并进入控制台

访问首页点击「免费注册」,或使用已有账号登录。首个注册账号会自动成为管理员。

添加域名

进入「用户中心 → 域名管理」,填写域名并选择验证方式。HTTP-01 需要域名解析到当前服务器且 80 端口可达。

申请证书并设置自动化

在「证书管理」发起签发;签发成功后到「自动续期设置」与「部署目标」中配置策略。

首次使用建议:先用 staging(测试环境)跑通完整流程,确认验证与部署链路无误后,再在后台切换到正式环境签发受信任证书,避免触发 CA 的签发频率限制。

2 域名与验证

证书签发前必须证明你对该域名拥有控制权。平台支持两种 ACME 标准验证方式,可按场景选择。

两种验证方式对比

方式 原理 适用场景 前置条件
HTTP-01 CA 访问 http://域名/.well-known/acme-challenge/<token>,校验返回内容 单域名 / 多域名 SAN 域名解析到本机,80 端口对外开放
DNS-01 在域名下添加指定 TXT 记录,CA 通过 DNS 查询校验 泛域名 *.example.com、无法开 80 端口 拥有该域名的 DNS 管理权限

配置 DNS 厂商凭证(DNS-01 自动模式)

若希望平台自动添加与清理 TXT 记录(无需手工操作),需在「用户中心 → DNS 凭证」中录入云厂商密钥,平台将加密存储。

厂商所需凭证权限范围建议
CloudflareAPI Token(推荐)或 Global API KeyZone → DNS → Edit
阿里云AccessKey ID / SecretAliyunDNSFullAccess(可限定域名)
腾讯云SecretId / SecretKeyDNSPod 相关读写权限
手动模式无需凭证平台给出 TXT 值,你手工添加到 DNS
权限最小化:建议为平台单独创建子账号或 Token,仅授予指定域名的 DNS 编辑权限,避免使用全局密钥。所有密钥在入库前均以 AES-256 加密。

手动 DNS 两步签发

发起签发,获取 TXT 记录

在签发页选择 DNS-01 且凭证为「手动」,平台生成订单并展示待添加的 TXT 记录名与值。

到域名服务商添加 TXT 记录

按给出的主机记录与值添加,等待 DNS 生效(通常几分钟内,取决于 TTL)。

回到平台点击「完成校验」

平台通知 CA 进行校验并完成签发,成功后即可下载证书。

3 申请证书

在「证书管理」中发起签发,选择域名、密钥算法与证书类型。

证书类型

  • 单域名:仅保护一个域名,如 www.example.com
  • 泛域名:保护主域名及所有一级子域名,如 *.example.com,必须使用 DNS-01。
  • 多域名 SAN:一张证书保护多个不同域名,减少部署与续期成本。

密钥算法选择

算法特点建议场景
RSA 2048兼容性最好,几乎所有客户端支持通用默认选择
RSA 4096强度更高,握手开销略增合规要求较高的场景
ECDSA P-256密钥更小、握手更快、更省资源现代浏览器、移动端优化
签发流程全自动:平台会自动创建 ACME 账户、提交订单、完成挑战校验、下载证书并把私钥加密后入库,全程无需人工干预(手动 DNS 模式除外)。

4 自动续期

证书有效期通常为 90 天,自动续期是避免服务中断的关键。

续期阈值设置

在「用户中心 → 自动续期」中,可为每张证书单独设置触发时机:

阈值说明
提前 30 天默认值,留足重试与排障时间,推荐
提前 7 天缩短证书交替周期,适合自动化程度高的场景
提前 1 天仅在特殊情况下使用,风险较高

调度机制

平台通过定时任务扫描到期证书并触发续期,无需常驻进程。请在服务器添加如下 Crontab:

crontab
# 每分钟执行一次续期与提醒调度
* * * * * php /www/wwwroot/ssl.hshen.eu.cc/sslapp/cron/cert_cron.php >> /www/wwwroot/ssl.hshen.eu.cc/sslapp/runtime/cron.log 2>&1
失败自动重试:续期失败会按策略重试(默认最多 3 次),并记录失败原因;连续失败将触发告警通知。

5 到期提醒

在证书到期前按阈值分级预警,支持邮件与 Webhook 两大类渠道。

配置邮件通知(SMTP)

在「用户中心 → 通知渠道」新增邮件渠道,填入 SMTP 服务器信息:

参数示例说明
SMTP 主机smtp.qq.com邮件服务商地址
端口465 / 587465 走 SSL,587 走 STARTTLS
账号 / 密码you@qq.com / 授权码多数服务商需使用授权码而非登录密码
发件人SSL 监控 <you@qq.com>收件人看到的发件人信息

Webhook 通知

支持钉钉、企业微信、飞书群机器人及自定义 Webhook。以钉钉机器人为例:

bash
# 发送一条测试通知
curl -X POST "http://ssl.hshen.eu.cc/?r=api/notify_test" \
  -H "X-API-Key: sk_你的密钥" \
  -H "Content-Type: application/json" \
  -d '{"channel_id": 1, "subject": "测试通知", "body": "这是一条测试消息"}'
配置后务必测试:保存渠道后请立即发送测试消息,确认网络可达、凭据正确。共享主机若禁用了 465 端口的外连,可尝试改用 587。

6 自动部署

续期成功后自动把新证书推送至目标,并按需执行重载命令,实现零人工干预。

支持的部署目标

类型说明所需配置
本机目录将证书写入本机指定路径,适用于同机 Nginx / Apache证书 / 私钥 / 全链路径、重载命令
远程 SSH通过 SSH 推送证书到其他服务器主机、端口、用户名、密钥、路径
Webhook以 HTTP 回调形式把证书推送给自定义服务回调地址、鉴权头

Nginx 部署示例

选择「本机目录」并填写如下配置,平台会在续期成功后写入文件并执行重载:

json
{
  "cert_path":      "/www/server/panel/vhost/cert/example.com/fullchain.pem",
  "key_path":       "/www/server/panel/vhost/cert/example.com/privkey.pem",
  "fullchain_path": "/www/server/panel/vhost/cert/example.com/fullchain.pem",
  "reload_cmd":     "nginx -s reload"
}
幂等安全:部署在写入前会备份原文件,写入失败自动回滚;每次部署的结果与错误都会记录在「部署记录」中,便于排查。

7 证书下载

在「证书管理」列表点击下载,支持多种格式以适配不同服务端。

格式包含内容适用服务
PEM / CRT仅证书(不含链)多数场景配合 fullchain 使用
Fullchain服务器证书 + 中间证书Nginx、Apache 推荐
KEY解密后的私钥与证书配对部署
PFX / PKCS#12证书 + 私钥 + 链打包IIS、Tomcat、Java 应用
私钥安全提醒:私钥在服务器端以 AES-256 加密存储,下载时仅在响应流中解密,不落明文临时文件。请妥善保管下载的私钥文件,避免泄露。

手动验证证书链

bash
# 查看服务器实际下发的证书信息
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates

# 校验证书与私钥是否匹配(比对两个 MD5)
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa  -noout -modulus -in key.pem  | openssl md5

8 API 接入

通过 API Key 以编程方式管理证书,适合集成到 CI/CD 或自建运维平台。

创建 API Key

在「用户中心 → API 密钥」中创建。密钥明文仅显示一次,请立即保存;可通过作用域(scopes)限制权限范围。

作用域说明
*全部权限
cert:read / cert:write证书读取 / 申请与操作
domain:read / domain:write域名读取 / 新增与修改
status读取系统状态统计

鉴权方式

在请求头中携带 X-API-Key

bash
curl -H "X-API-Key: sk_xxxxxxxxxxxxxxxx" \
  "http://ssl.hshen.eu.cc/?r=api/certs"

接口一览

方法端点说明
GET?r=api/certs列出当前账号下的全部证书
GET?r=api/cert&id=1查询单张证书详情
GET?r=api/domains列出域名
GET?r=api/status获取统计状态
POST?r=api/issue发起签发
POST?r=api/renew触发续期

返回示例

json
{
  "ok": true,
  "data": [
    {
      "id": 1,
      "domains": ["example.com"],
      "issuer": "Let's Encrypt",
      "status": "active",
      "not_after": "2026-12-11 08:00:00",
      "days_left": 90
    }
  ]
}
鉴权失败返回 401(未提供密钥)或 403(密钥无效 / 作用域不足)。所有接口均返回 JSON,字段 ok 标识请求是否成功。

9 常见问题

签发失败怎么办?

常见原因与排查方向:

  • HTTP-01 校验失败:确认域名解析到本机、80 端口可从公网访问,且 /.well-known/acme-challenge/ 路径可读取。
  • DNS-01 校验失败:确认 TXT 记录已生效(dig TXT _acme-challenge.example.com),TTL 较长时需等待。
  • 触发频率限制:测试环境有更严格的限额,建议先 staging 调试;正式环境同一域名每周签发次数有限。

支持泛域名吗?

支持。*.example.com 必须使用 DNS-01 验证。若使用手动模式,需按平台提示分两步完成 TXT 记录添加与校验。

续期需要人工介入吗?

正常情况下不需要。配置好续期阈值与部署目标后,定时任务会自动完成续期与推送;仅在验证方式变更或 DNS 凭证失效时才需要人工处理。

私钥存储在哪里?安全吗?

私钥以 AES-256 加密后存入数据库,解密密钥保存在服务器配置文件中,不随代码分发;下载时仅临时解密并直接输出,不落明文文件。

可以自定义证书颁发机构吗?

平台内置 Let's Encrypt(含 staging / production)。如需接入其他 ACME 兼容 CA,可在后台配置 ACME 目录地址。

还未解决?请到「服务状态」页查看系统运行情况,或登录后在「操作日志」中查看具体的失败原因与错误详情。