<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>技术网</title><link>https://www.jsw.ac.cn/</link><description>记录服务器运维、技术学习与问题解决过程的个人技术站点。</description><language>zh-CN</language><lastBuildDate>Mon, 17 Aug 2026 00:00:00 GMT</lastBuildDate><atom:link href="https://www.jsw.ac.cn/rss.xml" rel="self" type="application/rss+xml"/><item><title>GitHub Actions 续签 ESA 证书</title><link>https://www.jsw.ac.cn/2026/08/github-actions-esa-cert/</link><guid isPermaLink="true">https://www.jsw.ac.cn/2026/08/github-actions-esa-cert/</guid><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><dc:date>2026-08-17T00:00:00.000Z</dc:date><dc:creator>技术网</dc:creator><dc:language>zh-CN</dc:language><description>用 GitHub Actions 串联 Alibaba Cloud International ESA 与 Cloudflare DNS，自动续订 jsw.ac.cn 与 *.jsw.ac.cn 的 Let’s Encrypt 边缘证书。</description><category>ssl 证书</category><category>GitHub Actions</category><category>ESA</category><category>Cloudflare</category><category>Let&apos;s Encrypt</category><category>自动续订</category><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;本文使用模型辅助整理与润色，但文中涉及的 GitHub Actions、Alibaba Cloud International ESA、Cloudflare DNS 配置、证书申请逻辑与实际签发结果均已核对并确认可行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这次先从 GitHub Actions 开始。&lt;/p&gt;
&lt;p&gt;该网站现在每天会运行一次名为 &lt;code&gt;ESA certificate watch&lt;/code&gt; 的 Workflow。证书正常时，它检查完就退出；当证书缺失或进入续订窗口后，它会向 Alibaba Cloud International ESA 申请新的 Let’s Encrypt 证书，取得 DNS-01 验证值，再通过 Cloudflare API 写入 TXT。签发完成后，临时 &lt;code&gt;_acme-challenge&lt;/code&gt; 记录也会被清掉。&lt;/p&gt;
&lt;p&gt;最终维护的是同一张同时覆盖下面两个名称的边缘证书：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;jsw.ac.cn
*.jsw.ac.cn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样 &lt;code&gt;jsw.ac.cn&lt;/code&gt; 根域与 &lt;code&gt;www.jsw.ac.cn&lt;/code&gt;、&lt;code&gt;blog.jsw.ac.cn&lt;/code&gt;、&lt;code&gt;files.jsw.ac.cn&lt;/code&gt; 这类一级子域可以放在同一张证书里处理。&lt;/p&gt;
&lt;h2&gt;Action 本身怎么写&lt;/h2&gt;
&lt;p&gt;目前该网站实际使用的 Workflow 如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: ESA certificate watch

on:
  schedule:
    - cron: &quot;17 2 * * *&quot;
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: esa-certificate-watch
  cancel-in-progress: false

jobs:
  monitor-and-renew:
    runs-on: ubuntu-latest
    timeout-minutes: 15

    env:
      PYTHONUNBUFFERED: &quot;1&quot;
      ALIBABA_CLOUD_ACCESS_KEY_ID: ${{ secrets.ALIBABA_CLOUD_ACCESS_KEY_ID }}
      ALIBABA_CLOUD_ACCESS_KEY_SECRET: ${{ secrets.ALIBABA_CLOUD_ACCESS_KEY_SECRET }}
      CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}

      ESA_REGION_ID: ${{ vars.ESA_REGION_ID || &apos;ap-southeast-1&apos; }}
      ESA_ENDPOINT: ${{ vars.ESA_ENDPOINT }}
      ESA_SITE_ID: ${{ vars.ESA_SITE_ID }}
      ESA_SITE_NAME: ${{ vars.ESA_SITE_NAME || &apos;jsw.ac.cn&apos; }}
      ESA_DOMAINS: ${{ vars.ESA_DOMAINS || &apos;jsw.ac.cn,*.jsw.ac.cn&apos; }}
      ESA_RENEW_BEFORE_DAYS: ${{ vars.ESA_RENEW_BEFORE_DAYS || &apos;14&apos; }}
      ESA_CERT_TYPE: ${{ vars.ESA_CERT_TYPE || &apos;lets_encrypt&apos; }}
      ESA_ISSUANCE_WAIT_SECONDS: ${{ vars.ESA_ISSUANCE_WAIT_SECONDS || &apos;300&apos; }}

      CLOUDFLARE_ZONE_ID: ${{ vars.CLOUDFLARE_ZONE_ID }}
      CLOUDFLARE_ZONE_NAME: ${{ vars.CLOUDFLARE_ZONE_NAME || &apos;jsw.ac.cn&apos; }}
      CLOUDFLARE_DCV_TTL: ${{ vars.CLOUDFLARE_DCV_TTL || &apos;120&apos; }}
      CLOUDFLARE_PURGE_CONFLICTING_ACME: ${{ vars.CLOUDFLARE_PURGE_CONFLICTING_ACME || &apos;true&apos; }}
      CLOUDFLARE_CLEAN_AFTER_ISSUE: ${{ vars.CLOUDFLARE_CLEAN_AFTER_ISSUE || &apos;true&apos; }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: &quot;3.12&quot;

      - name: Install Alibaba Cloud International ESA SDK
        run: python -m pip install --disable-pip-version-check alibabacloud_esa20240910

      - name: Monitor ESA certificate and reconcile Cloudflare DNS DCV
        run: python -u scripts/esa_certificate_watch.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Workflow 本身很薄。GitHub Actions 主要负责四件事：定时启动、注入 Secret 与 Variable、准备 Python 环境、运行真正的续订脚本。&lt;/p&gt;
&lt;p&gt;也就是说，核心其实是最后这一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python -u scripts/esa_certificate_watch.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;为什么还要接 Cloudflare&lt;/h2&gt;
&lt;p&gt;该网站使用 Alibaba Cloud International ESA 做边缘加速，HTTPS 最终在 ESA 边缘结束，所以 ESA 上需要可用的边缘证书。&lt;/p&gt;
&lt;p&gt;不过该网站并没有把 NS 托管给 ESA，权威 DNS 仍然在 Cloudflare。这样一来，ESA 可以负责申请 Let’s Encrypt 证书，却不能直接替 Cloudflare 完成 DNS-01 验证。&lt;/p&gt;
&lt;p&gt;于是续订链路自然变成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;GitHub Actions
      ↓
Alibaba Cloud International ESA
      ↓
读取 DNS DCV
      ↓
Cloudflare DNS
      ↓
Let&apos;s Encrypt 验证
      ↓
ESA 获得新证书
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原来需要在 ESA 和 Cloudflare 之间手动复制 TXT，现在由 Action 来做。&lt;/p&gt;
&lt;h2&gt;先检查，不急着申请&lt;/h2&gt;
&lt;p&gt;脚本启动后先读取当前证书，并检查有没有一张证书同时覆盖 &lt;code&gt;jsw.ac.cn&lt;/code&gt; 和 &lt;code&gt;*.jsw.ac.cn&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def cert_covers_bundle(cert):
    return all(
        cert_covers_target(cert, domain)
        for domain in DOMAINS
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后从可用证书中找有效期最靠后的那一张：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def newest_usable_bundle(certificates):
    usable = [
        cert
        for cert in certificates
        if cert_covers_bundle(cert)
        and str(cert.get(&quot;Status&quot;) or &quot;&quot;)
        in {&quot;OK&quot;, &quot;Issued&quot;, &quot;Expiring&quot;}
    ]

    if not usable:
        return None

    usable.sort(
        key=lambda cert:
            parse_not_after(cert.get(&quot;NotAfter&quot;)),
        reverse=True,
    )

    return usable[0]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认续订阈值是 14 天。因此每天运行并不会每天申请证书，大部分运行实际上只是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;找到证书
→ SAN 正确
→ 状态正常
→ 距离到期还很久
→ 退出
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有没有完整证书，或者进入续订窗口，才继续调用 ESA。&lt;/p&gt;
&lt;h2&gt;申请一张根域 + 泛域证书&lt;/h2&gt;
&lt;p&gt;申请部分并不长：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def apply_bundle_certificate(client, site_id):
    response = client.apply_certificate(
        esa_models.ApplyCertificateRequest(
            site_id=site_id,
            domains=&quot;,&quot;.join(DOMAINS),
            type=CERT_TYPE,
        )
    )

    result = body_map(response).get(&quot;Result&quot;) or []

    log(
        &quot;Requested one Let&apos;s Encrypt bundle for: &quot;
        + &quot;, &quot;.join(DOMAINS)
    )

    for item in result:
        log(
            f&quot;ESA result domain={item.get(&apos;Domain&apos;)} &quot;
            f&quot;id={item.get(&apos;Id&apos;)} &quot;
            f&quot;status={item.get(&apos;Status&apos;)}&quot;
        )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前 &lt;code&gt;DOMAINS&lt;/code&gt; 默认值是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;jsw.ac.cn,*.jsw.ac.cn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里要求的是一张同时覆盖根域与 wildcard 的证书，而不是分别维护两张证书。&lt;code&gt;*.jsw.ac.cn&lt;/code&gt; 可以覆盖一级子域，却不会自动覆盖 &lt;code&gt;jsw.ac.cn&lt;/code&gt; 本身，所以根域仍然需要出现在 SAN 中。&lt;/p&gt;
&lt;h2&gt;ESA 给验证值，Cloudflare 负责落地&lt;/h2&gt;
&lt;p&gt;进入 &lt;code&gt;Applying&lt;/code&gt; 后，ESA 会暴露 DNS DCV。脚本把当前仍有效的验证值收集起来：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def active_esa_dns_challenges(certificates):
    active = {}

    for cert in certificates:
        if str(cert.get(&quot;Status&quot;) or &quot;&quot;) != &quot;Applying&quot;:
            continue

        for dcv in cert.get(&quot;DCV&quot;) or []:
            if str(dcv.get(&quot;Type&quot;) or &quot;&quot;).upper() != &quot;DNS&quot;:
                continue

            key = str(dcv.get(&quot;Key&quot;) or &quot;&quot;).strip().rstrip(&quot;.&quot;)
            value = str(dcv.get(&quot;Value&quot;) or &quot;&quot;).strip()

            if not key or not value:
                continue

            key = validate_dcv_name(key)
            active.setdefault(key, set()).add(value)

    return active
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里用了 &lt;code&gt;set()&lt;/code&gt;，因为 &lt;code&gt;jsw.ac.cn&lt;/code&gt; 与 &lt;code&gt;*.jsw.ac.cn&lt;/code&gt; 的 DNS-01 验证都可能落在：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;_acme-challenge.jsw.ac.cn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同一个名字下面可能同时需要两个 TXT：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;_acme-challenge.jsw.ac.cn TXT &quot;value-a&quot;
_acme-challenge.jsw.ac.cn TXT &quot;value-b&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果直接把 TXT 当作单值更新，第二个 challenge 很容易把第一个覆盖掉。现在的逻辑是先把 ESA 当前这一轮要求的值全部收集起来，再让 Cloudflare 同时保留。&lt;/p&gt;
&lt;p&gt;Cloudflare 这边没有额外装 SDK，直接用 API v4：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def cf_request(method, path, *, query=None, payload=None):
    url = &quot;https://api.cloudflare.com/client/v4&quot; + path

    if query:
        url += &quot;?&quot; + parse.urlencode(query)

    data = (
        json.dumps(payload).encode(&quot;utf-8&quot;)
        if payload is not None
        else None
    )

    req = request.Request(
        url,
        data=data,
        method=method,
        headers={
            &quot;Authorization&quot;: f&quot;Bearer {CF_TOKEN}&quot;,
            &quot;Content-Type&quot;: &quot;application/json&quot;,
            &quot;User-Agent&quot;: &quot;siteforge-inkstone-theme/esa-certificate-watch&quot;,
        },
    )

    with request.urlopen(req, timeout=30) as response:
        result = json.loads(response.read().decode(&quot;utf-8&quot;))

    if not result.get(&quot;success&quot;, False):
        raise RuntimeError(result.get(&quot;errors&quot;))

    return result.get(&quot;result&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写 TXT 也就变成普通的 API 请求：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;cf_request(
    &quot;POST&quot;,
    f&quot;/zones/{zone_id}/dns_records&quot;,
    payload={
        &quot;type&quot;: &quot;TXT&quot;,
        &quot;name&quot;: record_name,
        &quot;content&quot;: value,
        &quot;ttl&quot;: CF_DCV_TTL,
        &quot;comment&quot;: MANAGED_COMMENT,
    },
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;签完就把 TXT 收掉&lt;/h2&gt;
&lt;p&gt;ACME 验证记录没有必要长期留在 DNS 里。&lt;/p&gt;
&lt;p&gt;脚本只允许操作目标 Zone 内、名称以 &lt;code&gt;_acme-challenge.&lt;/code&gt; 开头的 TXT：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def validate_dcv_name(record_name):
    name = record_name.lower().rstrip(&quot;.&quot;)

    if (
        name != CF_ZONE_NAME
        and not name.endswith(&quot;.&quot; + CF_ZONE_NAME)
    ):
        raise RuntimeError(
            &quot;Refusing to modify Cloudflare DNS outside zone&quot;
        )

    if not name.startswith(&quot;_acme-challenge.&quot;):
        raise RuntimeError(
            &quot;Refusing to modify non-ACME TXT record&quot;
        )

    return name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以 SPF、DKIM、DMARC、MX 等记录不在脚本的操作范围里。&lt;/p&gt;
&lt;p&gt;当前 ESA 申请需要的 TXT 会被保留，同名但已经不属于本轮申请的旧 challenge 可以删除。等 ESA 确认证书已经 &lt;code&gt;Issued&lt;/code&gt; 或 &lt;code&gt;OK&lt;/code&gt;，脚本再清掉自己管理的临时 ACME TXT。&lt;/p&gt;
&lt;p&gt;如果五分钟内 ESA 仍然在验证，当前 challenge 不会被强制删除，下一轮 cron 会继续检查。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def wait_for_issuance(client, site_id, zone_id):
    deadline = (
        time.monotonic()
        + max(0, ISSUANCE_WAIT_SECONDS)
    )

    while True:
        certificates = list_certificates(client, site_id)
        active = reconcile_dcv(certificates, zone_id)

        cleanup_orphaned_managed_txt(
            zone_id,
            active,
        )

        if bundle_issued(certificates):
            cleanup_orphaned_managed_txt(
                zone_id,
                {},
            )
            return

        if time.monotonic() &amp;gt;= deadline:
            return

        time.sleep(10)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Action 运行时能看见它在干什么&lt;/h2&gt;
&lt;p&gt;第一次调试时遇到过一个很简单的问题：Python stdout 缓冲让 Action 长时间没有新日志，看起来像任务卡住。&lt;/p&gt;
&lt;p&gt;所以 Workflow 里现在同时有：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;PYTHONUNBUFFERED: &quot;1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以及：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python -u scripts/esa_certificate_watch.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本日志也主动 &lt;code&gt;flush&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def log(message):
    print(message, flush=True)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在运行时可以直接看到证书 SAN、Site、Cloudflare Zone、当前 challenge、轮询状态等信息。自动化本身不一定要复杂，但至少应该知道它现在卡在哪一步。&lt;/p&gt;
&lt;h2&gt;换成别的域名还能跑吗&lt;/h2&gt;
&lt;p&gt;可以。现在大部分站点相关值都通过 GitHub Repository Variables 注入，而不是写死在 Action 里。&lt;/p&gt;
&lt;p&gt;例如要换成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;example.com
*.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以设置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ESA_SITE_NAME=example.com
ESA_DOMAINS=example.com,*.example.com
CLOUDFLARE_ZONE_NAME=example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;凭据仍然放在 Repository Secrets：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ALIBABA_CLOUD_ACCESS_KEY_ID
ALIBABA_CLOUD_ACCESS_KEY_SECRET
CLOUDFLARE_API_TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果已经知道具体 ID，还可以直接提供：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ESA_SITE_ID
CLOUDFLARE_ZONE_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要更换 ESA 地域时，则修改：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ESA_REGION_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者直接指定：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ESA_ENDPOINT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此在同样使用 &lt;strong&gt;Alibaba Cloud International ESA + Cloudflare 权威 DNS&lt;/strong&gt; 的站点上，主要替换域名、Zone、Site 与凭据就可以复用。&lt;/p&gt;
&lt;p&gt;如果连证书平台也换掉，例如不再使用 ESA，那么 Cloudflare DNS 这一半依然可以保留，但 &lt;code&gt;ListCertificates&lt;/code&gt;、&lt;code&gt;ApplyCertificate&lt;/code&gt; 和读取 ESA DCV 的部分需要替换成对应平台的 API。&lt;/p&gt;
&lt;p&gt;GitHub Actions 也不是必须的。脚本本身只是普通 Python 程序，把同样的环境变量放到 VPS 上，再用 cron 运行同一个脚本也可以。GitHub Actions 的价值主要是省掉一台专门跑定时任务的机器。&lt;/p&gt;
&lt;h2&gt;现在它每天做的事情很少&lt;/h2&gt;
&lt;p&gt;最终该网站的续订链路已经变成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;GitHub Actions
       ↓
检查 ESA 证书
       ↓
还没到续订时间 → 退出
       ↓
需要续订
       ↓
申请 jsw.ac.cn + *.jsw.ac.cn
       ↓
获取 ESA DNS DCV
       ↓
写入 Cloudflare TXT
       ↓
等待 Let&apos;s Encrypt 验证
       ↓
ESA 获得新边缘证书
       ↓
删除临时 TXT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它没有重新发明一套证书管理平台，只是把 ESA 和 Cloudflare 之间原本需要手动处理的那一小段接起来。&lt;/p&gt;
&lt;p&gt;对于该网站这种 &lt;strong&gt;ESA 负责边缘 HTTPS、Cloudflare 继续负责权威 DNS&lt;/strong&gt; 的结构，一个 Workflow 加一个 Python 脚本已经足够。&lt;/p&gt;
</content:encoded></item><item><title>手把手教你安装和运行 Hexo 博客框架</title><link>https://www.jsw.ac.cn/2026/06/hexo/</link><guid isPermaLink="true">https://www.jsw.ac.cn/2026/06/hexo/</guid><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><dc:date>2026-06-27T00:00:00.000Z</dc:date><dc:creator>技术网</dc:creator><dc:language>zh-CN</dc:language><description>Hexo 是一个快速、简洁且强大的静态博客框架，非常适合个人博客搭建。本文将带你一步步完成 Hexo 的安装和运行，新手也能轻松上手！</description><category>静态框架</category><category>Hexo</category><content:encoded>&lt;p&gt;Hexo 是一个快速、简洁且强大的静态博客框架，非常适合个人博客搭建。本文将带你一步步完成 Hexo 的安装和运行，新手也能轻松上手！&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;环境准备&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在开始之前，请确保你的电脑已安装以下工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Node.js 和 npm&lt;/strong&gt; 
下载地址：&lt;a href=&quot;https://nodejs.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Node.js 官方网站&lt;/a&gt; 
&lt;strong&gt;推荐版本：LTS&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;安装 Hexo&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;打开终端，安装 Hexo 的命令行工具：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install -g hexo-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;创建博客项目&lt;/strong&gt; 
选择一个空文件夹作为你的博客目录，例如 &lt;code&gt;hexo-blog&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir hexo-blog
cd hexo-blog
hexo init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后，目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hexo-blog/
├── _config.yml    # 站点配置文件
├── package.json   # 项目信息
├── scaffolds/     # 模板文件
├── source/        # 博客内容
└── themes/        # 主题文件
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;安装依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;运行 Hexo&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;启动本地服务器：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hexo server
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;打开浏览器，访问 &lt;a href=&quot;http://localhost:4000&quot; rel=&quot;noopener noreferrer&quot;&gt;http://localhost:4000&lt;/a&gt;，你将看到 Hexo 的默认页面。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;撰写博客文章&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;新建文章&lt;/strong&gt; 
使用命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hexo new &quot;文章标题&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文章文件会保存在 &lt;code&gt;source/_posts/&lt;/code&gt; 文件夹下，文件格式为 &lt;code&gt;.md&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;编辑文章&lt;/strong&gt; 
打开新建的 Markdown 文件，在其中撰写你的内容。例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 我的第一篇博客
date: 2025-06-18 10:00:00
tags: [Hexo, 博客]
---
这是我的第一篇 Hexo 博客文章！欢迎阅读！
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;生成静态页面&lt;/strong&gt; 
在终端运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hexo generate
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;再次启动服务器&lt;/strong&gt; 
如果服务器已经关闭，请重新运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hexo server
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;常用命令汇总&lt;/strong&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hexo new &amp;lt;标题&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;新建文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hexo generate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;生成静态文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hexo server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;本地预览&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hexo deploy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;部署&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hexo clean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;清理缓存与旧的静态文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;部署网站&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;（推荐）SSH登入后上传到nginx指向路径即可&lt;/li&gt;
&lt;li&gt;（不太推荐）使用hexo-deployer-sftp插件上传，因为太久没维护了，不安全，上传推送可能不支持。&lt;a href=&quot;https://hexo.io/zh-cn/docs/one-command-deployment#SFTP&quot; rel=&quot;noopener noreferrer&quot;&gt;使用方法&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;结语&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;恭喜你完成了 Hexo 博客的安装和运行！通过 Hexo，你可以轻松记录生活和技术点滴，还可以通过丰富的主题和插件打造个性化博客。快去试试吧！&lt;/p&gt;
</content:encoded></item><item><title>如何申请免费的阿里云域名邮箱</title><link>https://www.jsw.ac.cn/2025/12/apply-aliemail/</link><guid isPermaLink="true">https://www.jsw.ac.cn/2025/12/apply-aliemail/</guid><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><dc:date>2025-12-15T00:00:00.000Z</dc:date><dc:creator>技术网</dc:creator><dc:language>zh-CN</dc:language><description>本文介绍如何白嫖阿里云邮箱的免费版本，创建一个常用日常用的邮箱，开启第三方邮件客户端登陆</description><category>邮箱</category><category>阿里邮箱</category><content:encoded>&lt;p&gt;本文介绍如何白嫖阿里云邮箱的免费版本，创建一个常用日常用的邮箱，开启第三方邮件客户端登陆&lt;/p&gt;
&lt;p&gt;首先给个阿里云免费企业邮箱申请入口链接：&lt;a href=&quot;https://common-buy.aliyun.com/?userCode=r3yteowb?spm=a2c6h.13066369.question.5.221a49eb7cbpCQ&amp;amp;commodityCode=alimail&amp;amp;specCode=lx_18482&amp;amp;request=%7B%22ord_time%22:%223:Year%22,%22account_num%22:%225%22%7D#/buy&quot; rel=&quot;noopener noreferrer&quot;&gt;阿里云免费企业邮箱申请&lt;/a&gt;
填入绑定邮箱域名才能生成价格，价格会显示0元
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/emails-buy.png&quot; alt=&quot;购买免费的阿里云免费企业邮箱&quot; loading=&quot;lazy&quot; /&gt;
然后点击支付，支付完成后，进入控制台配置解析记录
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/set-emails-dns.png&quot; alt=&quot;配置解析&quot; loading=&quot;lazy&quot; /&gt;
解析记录配对好且有效时候就可以访问邮箱访问地址使用初始的 postmaster账户登录进行邮箱分配
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/Account-allocation.png&quot; alt=&quot;进行账户分配&quot; loading=&quot;lazy&quot; /&gt;
登陆后点击域管理
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/Domain-management.png&quot; alt=&quot;点击顶部域管理&quot; loading=&quot;lazy&quot; /&gt;
点击组织与用户&amp;gt;员工账户&amp;gt;创建账户，输入账户和密码和选择是否要求初始化密码，最后保存配置
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/create-Account.png&quot; alt=&quot;分配邮箱&quot; loading=&quot;lazy&quot; /&gt;
点击安全管理&amp;gt;账户安全策略，下拉找到三方客户端安全登录，选择允许使用第三方客户端，然后点击保存配置
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/Allow-third-party-login.png&quot; alt=&quot;允许第三方登录&quot; loading=&quot;lazy&quot; /&gt;
第三方客户端登录配置可以参考&lt;a href=&quot;https://help.aliyun.com/document_detail/36596.html&quot; rel=&quot;noopener noreferrer&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何将hexo部署到阿里云pages上</title><link>https://www.jsw.ac.cn/2025/12/ali-pages/</link><guid isPermaLink="true">https://www.jsw.ac.cn/2025/12/ali-pages/</guid><pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate><dc:date>2025-12-09T00:00:00.000Z</dc:date><dc:creator>技术网</dc:creator><dc:language>zh-CN</dc:language><description>最近阿里云开放了pages服务，所以本网站搭个车将网站迁移到阿里云pages上面。本文介绍如何通过hexo d上传到GitHub，然后让阿里云pages拉取github项目完成部署。</description><category>阿里云</category><category>阿里云ESA</category><content:encoded>&lt;p&gt;最近阿里云开放了pages服务，所以本网站搭个车将网站迁移到阿里云pages上面。本文介绍如何通过hexo d上传到GitHub，然后让阿里云pages拉取github项目完成部署。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;阿里云推广图片&lt;/span&gt;
在原先你的hexo目录中&lt;code&gt;_config.yml&lt;/code&gt;的deploy部分填入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;deploy:
  type: git
  repo: git@github.com:你的GitHub账号/项目名称.git
  branch: main
  message: &quot;Site updated: {{ now(&apos;YYYY-MM-DD HH:mm:ss&apos;) }}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;本地 &lt;code&gt;hexo d&lt;/code&gt; 时，会自动把 &lt;code&gt;public&lt;/code&gt; 的内容推到 &lt;code&gt;main&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;仓库的 &lt;code&gt;main&lt;/code&gt; 分支里就是“纯静态站点”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在阿里云 ESA：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;导入这个 &lt;code&gt;blog&lt;/code&gt; 仓库，&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;分支选 &lt;code&gt;main&lt;/code&gt;，&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;同样配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安装命令：&lt;code&gt;echo skip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;构建命令：&lt;code&gt;echo skip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;静态目录：&lt;code&gt;./&lt;/code&gt;
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/pages-1.png&quot; alt=&quot;pages部署设置&quot; loading=&quot;lazy&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完成部署后可以绑定自定义域名，同时建议将NS交给ESA托管
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/pages-2.png&quot; alt=&quot;pages绑定自定义域名&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待DNS记录传播生效，同时留意pages目前只提供ipv4访问，少部分纯ipv6环境不完全支持，所以itdog提供ipv6 https测试部分地区出现解析失败无法访问是正常现象
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/itdog-pages-v4.png&quot; alt=&quot;ipv4测试&quot; loading=&quot;lazy&quot; /&gt;
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/itdog-pages-v6.png&quot; alt=&quot;ipv6测试&quot; loading=&quot;lazy&quot; /&gt;
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/oversea-dnsquery-v6.png&quot; alt=&quot;海外DNS查询AAAA记录&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>将 Hexo 站点部署到阿里云 OSS 并绑定 ESA 加速</title><link>https://www.jsw.ac.cn/2025/09/acceleration/</link><guid isPermaLink="true">https://www.jsw.ac.cn/2025/09/acceleration/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><dc:date>2025-09-10T00:00:00.000Z</dc:date><dc:creator>技术网</dc:creator><dc:language>zh-CN</dc:language><description>使用 Hexo 搭建博客后，我们通常会得到一个 public/ 文件夹，其中就是最终的静态站点文件。本文介绍如何将这些文件上传到阿里云 OSS，并开启静态网站托管，再通过 ESA（Edge Side Acceleration）进行全球加速。</description><category>阿里云</category><category>OSS</category><category>ESA</category><content:encoded>&lt;p&gt;使用 Hexo 搭建博客后，我们通常会得到一个 &lt;code&gt;public/&lt;/code&gt; 文件夹，其中就是最终的静态站点文件。本文介绍如何将这些文件上传到阿里云 OSS，并开启静态网站托管，再通过 ESA（Edge Side Acceleration）进行全球加速。&lt;/p&gt;
&lt;h2&gt;一、生成站点文件&lt;/h2&gt;
&lt;p&gt;进入 Hexo 项目根目录，执行命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hexo g
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成的静态文件会存放在 &lt;code&gt;public/&lt;/code&gt; 目录下。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、配置并使用 &lt;code&gt;ossutil&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;1. 安装 &lt;code&gt;ossutil&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;前往&lt;a href=&quot;https://help.aliyun.com/zh/oss/developer-reference/install-ossutil&quot; rel=&quot;noopener noreferrer&quot;&gt;阿里云 OSS 官方下载页面&lt;/a&gt;，下载对应系统的 &lt;code&gt;ossutil&lt;/code&gt; 工具。
 Windows 用户下载 &lt;code&gt;.exe&lt;/code&gt; 文件后放到 PATH 路径下，方便调用。&lt;/p&gt;
&lt;h3&gt;2. 初始化配置&lt;/h3&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ossutil config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依次输入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Config file path&lt;/strong&gt;：直接回车默认即可&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AccessKey ID / Secret&lt;/strong&gt;：RAM 用户的凭证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region&lt;/strong&gt;：如 &lt;code&gt;cn-hangzhou&lt;/code&gt;、&lt;code&gt;ap-southeast-1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Endpoint&lt;/strong&gt;：可留空，默认使用公网域名，例如 &lt;code&gt;oss-cn-hangzhou.aliyuncs.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 上传 Hexo 静态文件&lt;/h3&gt;
&lt;p&gt;推荐使用同步方式上传：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ossutil sync 需要上传目录位置 oss://你的Bucket名/ --delete
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt;：强制覆盖&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--delete&lt;/code&gt;：让远端和本地完全一致，会删除 OSS 上多余文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样，&lt;code&gt;public&lt;/code&gt; 内的内容就会直接部署到 Bucket 的根目录。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、开启 OSS 静态网站托管&lt;/h2&gt;
&lt;p&gt;为了让 OSS 直接作为网站访问，需要开启 &lt;strong&gt;静态网站托管&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 OSS 控制台 → 选择对应 Bucket → 数据管理 → 静态页面&lt;/li&gt;
&lt;li&gt;配置：&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;索引页面&lt;/strong&gt;：&lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误页面&lt;/strong&gt;：&lt;code&gt;404.html&lt;/code&gt;
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/OSS-1.png&quot; alt=&quot;OSS静态页面设置&quot; loading=&quot;lazy&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;四、绑定阿里云 ESA 加速&lt;/h2&gt;
&lt;p&gt;为了加速境内外访问速度，可以绑定阿里云 ESA：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 ESA 控制台新建加速实例&lt;/li&gt;
&lt;li&gt;绑定自定义域名&lt;/li&gt;
&lt;li&gt;在源站地址选择 &lt;strong&gt;OSS Bucket 域名&lt;/strong&gt;
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/ESA-1.png&quot; alt=&quot;ESA绑定自定义域名&quot; loading=&quot;lazy&quot; /&gt;&lt;/li&gt;
&lt;li&gt;配置 HTTPS（可在NS托管下让其生成免费的SSL证书）
&lt;img src=&quot;https://www.jsw.ac.cn/img/post/ESA-2.png&quot; alt=&quot;让ESA生成免费HTTPS证书&quot; loading=&quot;lazy&quot; /&gt;
之后就会通过 ESA 节点加速，提升国内外访问体验。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>acme.sh 安装及使用指南</title><link>https://www.jsw.ac.cn/2025/05/acme-alidns/</link><guid isPermaLink="true">https://www.jsw.ac.cn/2025/05/acme-alidns/</guid><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><dc:date>2025-05-26T00:00:00.000Z</dc:date><dc:creator>技术网</dc:creator><dc:language>zh-CN</dc:language><description>acme.sh 是一个用于申请和管理 CA 证书的轻量级 ACME 客户端，支持自动续订。</description><category>ssl 证书</category><category>acme.sh</category><category>云解析</category><category>阿里云</category><content:encoded>&lt;p&gt;acme.sh 是一个用于申请和管理 CA 证书的轻量级 ACME 客户端，支持自动续订。&lt;/p&gt;
&lt;h2&gt;1. acme.sh 安装&lt;/h2&gt;
&lt;h3&gt;**1.1 安装 socat&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt install socat -y  # Ubuntu/Debian
yum install socat -y  # CentOS
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;1.2 安装 acme.sh&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;使用以下命令安装 acme.sh：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl https://get.acme.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后，可能需要重新加载 shell 以生效：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;source ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 申请泛域名证书（使用 阿里云DNS 验证）&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;2.1 配置 阿里云DNS API&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://ram.console.aliyun.com/users/create&quot; rel=&quot;noopener noreferrer&quot;&gt;登录阿里云账户管理&lt;/a&gt;，创建一个具有DNS管理权限的RAM用户&lt;/p&gt;
&lt;p&gt;在申请证书前，需要提供 阿里云DNS 的 API Key 和 Email：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export Ali_Key=&quot;sddi*********daf&quot;
export Ali_Secret=&quot;jls******************lsa&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;2.2 申请泛域名证书&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;注意&lt;code&gt;yourdomain.com&lt;/code&gt;填写的是你的域名&lt;/p&gt;
&lt;p&gt;使用 阿里云 DNS 验证方式申请：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;acme.sh --issue --dns dns_ali -d yourdomain.com -d &apos;*.yourdomain.com&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;参数说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--dns dns_ali&lt;/code&gt;：使用 Cloudflare DNS 进行域名验证。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d yourdomain.com -d &apos;*.yourdomain.com&apos;&lt;/code&gt;：申请主域名和泛域名证书。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 证书安装及自动续订&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;3.1 安装证书到指定目录&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;将证书安装到 &lt;code&gt;/etc/nginx/cert/&lt;/code&gt; 目录，并自动续订：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;acme.sh --install-cert -d yourdomain.com \
    --key-file /etc/nginx/cert/private.key \
    --fullchain-file /etc/nginx/cert/cert.crt \
    --reloadcmd &quot;systemctl reload nginx&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3.2 确保证书自动续订&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;acme.sh 会自动续订证书，无需手动干预。可以使用以下命令检查续订任务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;crontab -l | grep acme.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要手动触发续订：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;acme.sh --renew -d yourdomain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. 其他常用命令&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;4.1 查看证书列表&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;acme.sh --list
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4.2 强制更新 acme.sh&lt;/strong&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;acme.sh --upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4.3 卸载 acme.sh&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;如果不再使用，可以卸载：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;acme.sh --uninstall
rm -rf ~/.acme.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 最后&lt;/h2&gt;
&lt;p&gt;使用 acme.sh，可以轻松申请和管理 CA 证书，结合 阿里云 DNS 验证，支持泛域名证书，并且自动续订，适用于大多数网站的 HTTPS 配置需求。&lt;/p&gt;
</content:encoded></item></channel></rss>