给 serv00 的 Hexo 博客绑定自有域名并签发 SSL 证书

serv00 默认给的是 用户名.serv00.net 这样的二级域名,能用但不够「自己」。本文承接前两篇(《devil 命令详解》《裸仓库 + 钩子自动部署》),讲清楚如何把自有域名绑定到 serv00 上的 Hexo 博客,并用 Let’s Encrypt 免费证书开启并维护 HTTPS。

一、整体流程概览

绑定域名 + HTTPS 的完整链条是:

1
2
3
查 serv00 的 IP  →  在域名处加 DNS 解析(A/AAAA)  →  serv00 建站绑定域名
→ 等 DNS 生效 → 签发 Let's Encrypt 证书 → 强制 HTTPS
→ 更新 Hexo 站点 url 并重新部署

其中证书签发依赖「域名已正确解析到 serv00」,所以顺序很重要:先把 DNS 指过去,再签证书。

下面假设自有域名为 example.com,serv00 账号为 [email protected]

二、第一步:查到 serv00 分配给你的「Web IP」

证书签发和 DNS 解析都要用到你账号的真实 IP。不要随便用别人的 IP,必须以下面命令列出的为准:

1
devil vhost list

这里有个极易踩的坑devil vhost list 通常会返回三个 IP,它们用途不同,配 DNS 和签证书只能用其中的「Web IP」:

IP(示例) RevDNS 用途
188.68.248.8 s15.serv00.com 主机 / SSH 登录入口,不是网站 IP
188.68.250.201 web15.serv00.com Web 服务器 → A 记录与签 SSL 都用这个
188.68.250.202 cache15.serv00.com 缓存服务器,不直接使用

也就是说:SSH 登录用的 sXX.serv00.com 那个 IP,和网站用的 IP 不是同一个,千万别混用,否则证书签不下来、域名也解析不到站点。

最可靠的判断方法:看你现有的 用户名.serv00.net 域名实际解析到哪个 IP,那个就是 Web IP:

1
2
3
4
5
# 本地执行
dig +short yourname.serv00.net
# 或 Windows PowerShell
Resolve-DnsName yourname.serv00.net -Type A
# → 188.68.250.201 这个就是要用的 Web IP(对应 web15)

记下这个 Web IP(下文统一记为 <WEB_IP>),后面配 DNS 和签证书都用它。

三、第二步:在域名服务商处配置 DNS 解析

到你买域名的地方(阿里云 / Cloudflare / Namecheap 等)添加解析记录,把域名指向上一步的 serv00 IP:

主机记录 类型 记录值 说明
@ A <WEB_IP>(如 188.68.250.201) 根域名指向 serv00 的 Web IP
www CNAME yourname.serv00.net. www 子域名指向 serv00 站点(注意末尾的点)

子域名(如 blog.example.com)同理:加一条 A 记录指向 <WEB_IP>,或用 CNAME 指向 yourname.serv00.net.(带末尾点)。

Cloudflare 用户注意:签发 Let’s Encrypt 证书时,serv00 走的是 HTTP-01 验证(需要 80 端口可达)。如果你在 Cloudflare 开了橙色云朵(代理),验证可能失败。建议先把云朵切成灰色(DNS only)签完证书,再视情况开回代理;若坚持用代理,请在 Cloudflare 的 SSL/TLS 模式选 Full,避免证书环路。

配置完用以下命令确认解析已生效(指向 serv00 IP 即可):

1
2
3
4
# 本地或服务器上
nslookup example.com
# 或
dig example.com +short

DNS 生效有缓存延迟,通常几分钟到几十分钟。务必等解析确实指向 serv00 IP 后再做下一步,否则证书签不下来。

四、第三步:在 serv00 上建站并绑定域名

SSH 登录 serv00,用 devil www 把域名加为一个站点(静态站用 php 类型):

1
devil www add example.com php

成功后,该域名的网站根目录为:

1
~/domains/example.com/public_html

如果还想让 www.example.com 也能访问,用指针指过去即可:

1
devil www add www.example.com pointer example.com

此时直接访问 http://example.com 应该已经能看到内容(若 public_html 为空会是默认页,部署后即正常)。

五、第四步:签发 Let’s Encrypt 免费证书

重要区分:*.serv00.net 子域名根本不用签证书。 serv00 平台为所有 *.serv00.net 子域名预置了一张 Let’s Encrypt 通配符证书CN=*.serv00.net),由平台自动签发和续期,用户完全零维护。只有绑定自有域名时,才需要像本节这样手动签一次——因为通配符证书不覆盖你的自有域名。

确认域名已解析到 serv00 后,用 devil ssl 申请证书。语法是 devil ssl www add <IP> le le <域名>,IP 用第二步查到的 Web IP:

1
devil ssl www add <WEB_IP> le le example.com
  • 第一个 le 表示证书文件用 Let’s Encrypt 自动签发;
  • 第二个 le 表示私钥同样自动生成;
  • 多个域名(如根域名 + www)可一并写在后面。

签发成功后查看:

1
devil ssl www list

能看到 example.com 对应的证书条目即表示签发成功。此时 https://example.com 应该可以打开了。

可以用 openssl 实测证书的颁发者、绑定域名和有效期,比看浏览器锁图标更直观:

1
2
3
4
5
6
7
8
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates
# issuer = ... O=Let's Encrypt ... ← 颁发者是 Let's Encrypt
# subject = CN=example.com ← 证书绑定的正是你的域名(而非 *.serv00.net)
# notAfter= ... ← 约 90 天后到期,平台自动续期

# 顺带确认站点可访问
curl -o /dev/null -s -w "HTTP %{http_code}\n" https://example.com/ # 期望 HTTP 200

如果签发报错,90% 是 DNS 没生效或指错 IP。回到第二、三步核对 dig +short example.com 的结果是否等于第二步查到的 Web IP(注意不是 SSH 主机 IP)。

六、第五步:强制全站走 HTTPS

证书装好后,还要强制把 HTTP 跳转到 HTTPS,避免用户走明文:

1
devil www options example.com sslonly on

顺手可以再开两个对静态站友好的选项:

1
2
devil www options example.com cache long   # 长缓存
devil www options example.com gzip on # gzip 压缩

七、第六步:让 Hexo 输出新域名并重新部署

域名变了,Hexo 里的 url 也要同步改,否则永久链接、RSS、sitemap 里仍是旧地址。

编辑本地 _config.yml

1
2
# 改成你的新域名
url: https://example.com

然后把构建产物发布到新域名的 public_html。这里有两种做法:

做法 A:更新部署钩子的发布目录(推荐)

修改服务器上 ~/hexo.git/hooks/post-receive 里的 WEBROOT

1
WEBROOT="$HOME/domains/example.com/public_html"

这样新域名成为唯一站点,源码改完照常推送即可:

1
2
3
git add .
git commit -m "切换到自有域名 example.com"
git push serv00 main

钩子会自动 hexo generate 并发布到新域名目录,几秒后 https://example.com 即更新。

做法 B:保留 serv00.net 为构建目标,新域名做指针

如果你想两个域名都能访问、又不想改钩子,可把新域名设为 serv00.net 的指针:

1
devil www add example.com pointer yourname.serv00.net

指针站会共享原站点内容。不过此时证书要绑在 serv00.net 那侧,配置略绕,个人博客更建议用做法 A,单一域名、链路清晰。

八、SSL 证书的续期与维护

Let’s Encrypt 证书有效期 90 天。好消息是:

serv00 / MyDevil 会自动续期 Let’s Encrypt 证书,到期前自动更新,无需手动操作。

按证书来源分两种情况:

域名类型 证书来源 续期维护
用户名.serv00.net 子域名 平台通配符证书 *.serv00.net 完全自动,零操作devil ssl www list 里甚至看不到,因为不属于你的账号证书)
自有域名(le 自动签) 你账号下的 Let’s Encrypt 证书 serv00 自动续期,偶尔检查即可
自有域名(上传第三方证书) 你手动上传 需自己手动续,到期前重新上传

你只需偶尔对自有域名做点检查与维护:

1
2
3
4
5
6
# 查看账号下现有证书(关注自有域名的有效期)
devil ssl www list

# 实测某域名当前生效的证书有效期
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -dates

几条维护建议:

  1. 保持 DNS 始终指向 serv00:自动续期同样走 HTTP-01 验证,若哪天你把解析改走别处,续期会失败。
  2. 换 IP 要重签:serv00 偶尔会调整账号 IP(用 devil vhost list 复查)。若 IP 变了,需用新 IP 重新 devil ssl www add 并更新 DNS。
  3. 自有上传的证书需手动续:只有 le 自动证书才会自动续期;若你上传的是第三方付费证书,到期前要自己 devil ssl www add IP 证书 私钥 重新上传。
  4. 续期失败的征兆:浏览器报证书过期,或 devil ssl www list 显示已过期。此时手动重签一次即可:
    1
    2
    devil ssl www del <WEB_IP> example.com
    devil ssl www add <WEB_IP> le le example.com

九、常见问题速查

现象 排查
证书签不下来 DNS 未生效 / 指错 IP(用了 SSH 主机 IP 而非 Web IP),用 dig +short example.com 对比第二步查到的 Web IP
Cloudflare 下签发失败 暂时关闭橙色云朵(DNS only)再签,或把 SSL 模式设 Full
HTTPS 能开但 HTTP 不跳转 没开 devil www options example.com sslonly on
网页打开但永久链接是旧域名 Hexo _config.ymlurl 没改或没重新部署
www 打不开 没加 devil www add www.example.com pointer example.com
证书过期 检查 DNS 是否仍指向 Web IP;手动 del 后重新 add 重签

小结

给 serv00 的 Hexo 博客绑定自有域名 + HTTPS,核心就六步:查 Web IP(devil vhost list,注意区分 SSH 主机 IP 与 Web IP)→ 配 DNS(A 记录指向 Web IP)→ 建站(devil www add)→ 签证书(devil ssl www add <WEB_IP> le le 域名)→ 强制 HTTPS(sslonly on)→ 改 Hexo url 重新部署

特别记住两点:*.serv00.net 子域名的证书由平台通配符全自动处理、零维护,只有自有域名才要手动签一次;签证书和配 DNS 一定要用 Web IP(站点真正解析到的那个),而不是 SSH 登录用的主机 IP。

证书续期 serv00 会自动处理,你只需保证域名始终解析到 Web IP、IP 变动时及时重签。配合前文的裸仓库部署钩子,从此就是「本地写作 → git push → 自有域名 HTTPS 站点自动更新」的顺畅闭环。


给 serv00 的 Hexo 博客绑定自有域名并签发 SSL 证书
http://eevann.cn/2026/06/24/serv00-custom-domain-ssl/
作者
月下独白
发布于
2026年6月24日
许可协议