Skip to content

S00-00 General-Server

[TOC]

实战场景

个人信息

服务器:阿里云

配置信息

  • IP 地址:120.xx.xx.xx
  • 实例配置:CPU_2 核 内存_2GB
  • 系统盘:40GB
  • 带宽:3M
  • 到期时间:2026-04-01 23:59:59(【TODO:待续费】
  • 续费价格:99 元 / 年

域名

mrer.top
  • 注册/到期时间:2024-03-25 到 2034-03-25

  • 托管平台:阿里云

  • ICP 备案:已备案

  • 价格:90元 /10年

  • 域名解析

    子域名记录类型目标说明
    *A120.xx.xx.xx阿里云
    imgTXTleafer.qzz.ioCF Saas 自定义主机名
    noteTXTleafer.qzz.ioCF Saas 自定义主机名
    storageTXTleafer.qzz.ioCF Saas 自定义主机名
    imgCNAMEcloudflare.182682.xyz域名加速
    noteCNAMEcloudflare.182682.xyz域名加速
    storageCNAMEcloudflare.182682.xyz域名加速
    cdnCNAMEqiniudns.com七牛云图床
其他域名
域名注册平台托管平台价格注册/到期时间备注
leafer.qzz.ioDigitalPlat(1/2)Cloudflare免费2025-12-01 到 2026-12-01保活半年
mrer.qzz.ioDigitalPlat(2/2)Cloudflare免费2026-01-15 到 2027-01-15保活半年
mrer.de5.netDNSHE(1/10)Cloudflare免费2025-12-04 到 永久
rayer.de5.netDNSHE(2/10)Cloudflare免费2025-12-04 到 永久
hachimitu.de5.netDNSHE(3/10)Cloudflare免费2025-12-04 到 永久
rayer.ggff.netL53(1/1)Cloudflare免费2025-12-04 到 2027-12-042年期限
mivo.eu.ccGNAME(1/3)Cloudflare免费2026-01-27 到 2027-01-27每年到期前90天续费
realme.eu.ccGNAME(2/3)Cloudflare免费2026-01-27 到 2027-01-27免费续费地址
leafer.eu.ccGNAME(3/3)Cloudflare免费2026-01-27 到 2027-01-27

实战:申请 SSL 证书

方案1:acme.sh + 阿里云

针对阿里云上购买的服务器和域名,使用 acme.sh 配合阿里云的 DNS API 模式 是最理想的选择。这种方式不需要你手动去域名后台加解析记录,脚本会自动完成“添加记录 -> 验证 -> 删除记录”的全过程。

以下是详细的操作步骤和命令解析:

第一步:获取阿里云 AccessKey:

要让脚本自动修改 DNS,你需要给它“钥匙”。

  1. 登录阿里云后台,点击右上角头像 -> AccessKey 管理
  2. 创建一个 AccessKey(建议使用 RAM 子账号并只授予 AliyunDNSFullAccess 权限以保安全)。
  3. 获取 AccessKey IDAccessKey Secret

第二步:配置环境变量:

在你的服务器终端输入以下命令(替换为你实际的 Key):

bash
export Ali_Key="LTAI5t7xxxxxxxxxxxxxxx"
export Ali_Secret="sdfsdfxxxxxxxxxxxxxxx"
  • export:将变量设置为当前会话的环境变量。
  • 含义acme.sh 内部集成了阿里云的插件,它会自动读取这两个命名的变量来调用阿里云 API。

第三步:一键申请证书:

执行以下申请命令

bash
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
  • --issue:告诉脚本开始申请。
  • --dns dns_ali:核心参数。指定使用阿里云的 DNS 接口进行验证。
  • -d example.com:你的主域名。
  • -d *.example.com通配符域名。申请成功后,你所有的子域名(如 blog.example.com, api.example.com)都可以共用这一张证书。

判断证书申请是否成功

如果申请成功了,日志最后会显示绿色的 "Cert success",并且你会看到如下文件路径提示:

  • Your cert is in: /root/.acme.sh/mrer.top_ecc/mrer.top.cer
  • Your cert key is in: /root/.acme.sh/mrer.top_ecc/mrer.top.key
  • The intermediate CA cert is in: ...
  • And the full chain certs is in: /root/.acme.sh/mrer.top_ecc/fullchain.cer

问题:证书颁发机构 ZeroSSL 拥堵

由于 acme.sh 默认的证书颁发机构是 ZeroSSL,它的服务器经常拥堵或出故障,会让你的脚本等待 86400 秒(24小时)后再试,而脚本保护性地拒绝了这种无理要求并终止了任务。

解决方案:切换到 Let's Encrypt

由于 ZeroSSL 最近经常出现这种不稳定的情况,建议你直接切换到更稳定的 Let's Encrypt。这是目前最通用的解决方法。

请依次执行以下两条命令:

  1. 第一步:切换默认 CA 为 Let's Encrypt

    bash
    acme.sh --set-default-ca --server letsencrypt
  2. 第二步:重新申请证书

    bash
    acme.sh --issue --dns dns_ali -d example.top -d *.example.top

第四步:安装证书到指定位置:

申请成功后,证书存放在 ~/.acme.sh/ 的隐藏目录下。不要直接引用那里的文件,因为路径可能会变。你需要用 install-cert 命令将其“发布”到你的 Web 服务器目录。

以 Nginx 为例:

bash
acme.sh --install-cert -d example.com \
--key-file       /etc/nginx/ssl/example.com.key  \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd     "systemctl reload nginx"
  • --key-file:将私钥复制到指定位置。
  • --fullchain-file:将完整的证书链复制到指定位置(Nginx 必须使用 fullchain)。
  • --reloadcmd:这是最强大的一点。证书每 60 天会自动续期,续期成功后,acme.sh自动运行这个命令(重启 Nginx),实现证书更新无感化。

进阶:如何检查自动续期任务:

acme.sh 在安装时会自动往你的 Linux 系统里添加一个 crontab 计划任务。你可以输入以下命令查看:

bash
crontab -l

你会看到类似这样的一行: 56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

  • 含义:系统每小时会检查一次证书。如果证书距离到期不足 30 天,它就会自动重复上述的 API 验证过程,并更新你的证书文件。

方案2:acme.sh + Cloudflare

由于域名托管在 Cloudflare没有 ICP 备案,而在阿里云国内节点运行,最稳妥且能自动续期的方案是使用 Cloudflare DNS API 验证模式

这样可以避开阿里云对 80 端口的备案拦截,同时利用 Cloudflare 的 API 自动完成证书申请。

第一步:获取 Cloudflare API 令牌:

为了让脚本自动修改 DNS 记录进行验证,你需要获取 API Key:

  1. 登录 Cloudflare 控制台
  2. 点击右上角 个人资料 -> API 令牌
  3. 找到 Global API Key,点击“查看”并保存(或者创建一个仅具有 DNS 修改权限的专用令牌)。

第二步:在服务器设置环境变量:

在您的 CentOS Stream 9 终端输入:

bash
export CF_Key="你的Global_API_Key"
export CF_Email="你的Cloudflare注册邮箱"

第三步:一键申请通配符证书:

执行以下命令。注意:即便服务器在国内,由于是 DNS 验证,流量是发往 Cloudflare 的 API 接口,因此不会受到备案限制的影响。

bash
acme.sh --issue --dns dns_cf -d mrer.top -d *.mrer.top
  • --dns dns_cf:强制使用 Cloudflare 的 DNS 接口验证。
  • -d *.mrer.top:强烈建议申请通配符证书,这样你以后新增任何子域名(如 note.mrer.top)都无需重新备案或申请。

第四步:部署到 Nginx(避开 80 端口):

因为没有备案,你的 80 端口无法正常提供 Web 验证服务。我们将证书安装到指定目录,并准备通过 Cloudflare Tunnel非标端口 访问。

bash
# 创建存储目录
mkdir -p /etc/nginx/ssl/

# 安装证书
acme.sh --install-cert -d mrer.top --ecc \
--key-file       /etc/nginx/ssl/mrer.top.key  \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd     "systemctl reload nginx"

第五步:Nginx 配置与绕过备案建议:

在您的 Nginx 配置文件中,引用这些证书:

nginx
server {
    listen 443 ssl;
    server_name mrer.top;

    ssl_certificate /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/mrer.top.key;

    # ... 其他配置 ...
}

关键:如何访问:

由于没有备案,即便你配置了 443 端口,阿里云的网关依然可能拦截 HTTPS 请求。

  1. 方案 A(最推荐):使用 Cloudflare Tunnel。在服务器运行 cloudflared 隧道。流量从 CF 内部直接穿透到服务器,完全绕过备案检测。
  2. 方案 B:将域名在 Cloudflare 后台开启“小云朵”(Proxy),并尝试在 CF 设置中开启 Authenticated Origin Pulls,这能一定程度上增加穿透成功率,但国内节点仍有被拦截风险。

创建 RAM 用户并授权

为阿里云创建 RAM(Resource Access Management) 子账号并授予最小化权限,是保护主账号安全、实现自动化工具(如 acme.sh)安全调用的最佳实践。

以下是详细的操作步骤:

第一阶段:创建 RAM 用户:

  1. 登录 阿里云控制台

  2. 在顶部搜索栏输入 RAM,点击进入 访问控制 控制台。

  3. 在左侧导航栏,点击 身份管理 -> 用户

  4. 点击 创建用户

  5. 配置参数

    • 登录名称:例如 acme-sh-operator

    • 显示名称:例如 SSL证书自动化工具

    • 访问方式勾选“使用永久 AccessKey 访问”(这会生成 AccessKey IDAccessKey Secret)。

      注意:不需要勾选“控制台登录”。

  6. 点击 确定

第二阶段:保存 API 密钥(关键):

  1. 创建成功后,页面会显示该用户的 AccessKey IDAccessKey Secret

  2. 立即保存:点击“下载 CSV 文件”或手动复制。

    警告:Secret 只在此刻显示一次,刷新页面后将无法再次查看。如果丢失,只能删除旧的 Key 并重新生成。

第三阶段:精准授权 (AliyunDNSFullAccess):

创建完用户后,它默认是没有任何权限的。我们需要专门给它管理 DNS 的权力。

  1. 在用户列表页面,找到你刚刚创建的用户,点击其右侧操作列的 添加权限

  2. 配置资源范围

    • 授权范围:选择“账号级别”。
  3. 选择策略

    • 在搜索框输入 DNS

    • 在系统策略列表中找到并点击 AliyunDNSFullAccess(管理云解析服务的权限)。

  4. 点击 确定,完成授权。

第四阶段:在服务器上验证权限:

现在你可以回到 CentOS 服务器,将这对“子账号”的密钥填入 acme.sh 的配置中。

bash
# 替换为你刚才保存的子账号 Key
export Ali_Key="LTAI5txxxxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 尝试申请证书(测试权限是否生效)
acme.sh --issue --dns dns_ali -d yourdomain.com

为什么这样做更安全:

账号类型风险场景影响后果
主账号 API Key服务器被黑,Key 泄露。攻击者可以重置你的服务器、查看账单甚至删库。
RAM 子账号 Key服务器被黑,Key 泄露。攻击者只能修改你的域名解析记录,无法触碰你的服务器、数据库或资金。

常见问题排查:

  • 报错 AccessDenied:请检查授权是否已经点击“确定”并生效。有时会有 1 分钟左右的缓存延迟。
  • 权限过大?:如果你觉得 FullAccess 还是太大,阿里云支持自定义策略,可以精确到“只能修改某一个域名的记录”,但对于 acme.sh 来说,通常 AliyunDNSFullAccess 是最平衡的选择。

后续:配置 Nginx

完成了 SSL 证书的申请后,此时申请下来的证书,已经存在于 /etc/nginx/ssl/目录下了。现在我们要做的就是将其和 nginx 联系起来。可以在 Nginx 中进行如下配置:

注意:每个 Server 都要引入 SSL 证书

虽然你申请的是 通配符证书 (*.mrer.top),它已经包含了所有二级子域名。但 Nginx 的每个 server 块都是独立的,它需要明确知道该去哪里读取这个证书。

Nginx 的逻辑是:“按需加载”。 当你添加 note.mrer.top 时,Nginx 需要确认这个虚拟主机是否支持 SSL,以及使用哪张证书。由于 acme.sh 已经把证书安装到了 /etc/nginx/ssl/ 这个固定位置,你只需要“指路”即可。

实操建议:如何更优雅地配置:

如果你有很多子域名(比如 note, blog, api),在每个 server 块里都复制一遍这 10 几行 SSL 配置会显得很乱。

最佳实践:使用 include 抽离配置。

第一步:创建一个通用的 SSL 配置文件

创建一个新文件 /etc/nginx/conf.d/common-ssl.inc

注意:此处创建的文件后缀是 .inc,如果是 .conf,会在 Server 配置外部被引入,而 SSL 引入只能发生在 Server 内部。

nginx
# /etc/nginx/conf.d/common-ssl.inc

# 主要配置(必选)
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

# 这里放你刚才那些安全配置(可选)
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

第二步:在不同的子域名 Server 块中快速引用:

这样你的配置就会变得非常整洁:

nginx
# 你的主站配置
server {
    listen 443 ssl;
    server_name example.com;
    include /etc/nginx/conf.d/common-ssl.conf; # 一行引入

    location / { ... }
}

# 你的笔记站点配置
server {
    listen 443 ssl;
    server_name note.example.com;
    include /etc/nginx/conf.d/common-ssl.conf; # 同样是一行引入

    location / { ... }
}

细节:listen 参数:

listen 处需要再后面添加 ssl

  • ❌ 错误写法:listen 443;
  • ✅ 正确写法:listen 443 ssl;

在 Nginx 中,如果你想让这个端口处理 HTTPS 请求,必须在端口号后面显式加上 ssl 关键字,否则 Nginx 会用处理 HTTP 的方式去处理加密流量,导致浏览器报错“发送了无效响应”。