之前网页连接总是显示不安全,看着很难受,虽然这个网站也没有什么有价值的信息值得别人攻击,但是既然现在有时间了,那就签个证书吧


其实主要是为了让我记得以前是怎么签证书的,不然之后涉及到博客搬迁什么的就头大了
首先我使用的是github上的acme.sh工具,支持全自动免费续签证书,很方便
acme.sh项目地址:https://github.com/acmesh-official/acme.sh?tab=readme-ov-file

b站上也有很详细的教程:【三行命令,免费申请https加密证书,一次配置,永久生效。NAS/家庭内网服务配置TLS加密,自建网站配置SSL/TLS加密】https://www.bilibili.com/video/BV1UNzmYpEZz?vd_source=f4aa22bd29b8ecd1787204cb76312ebb

安装

  • 安装很简单,就按照github上的教程安装就行了
  • 后面的邮箱要换成自己的,用于注册和到期提醒等
 curl https://get.acme.sh | sh -s email=my@example.com
  • 关于因为连不上github的情况导致的安装失败,b站教程也有详细的解释
  • 后续安装成功应该是这样的:
  • 需要记一下安装地址

切换CA机构

  • acme.sh默认用的是ZeroSSL,如果希望换为 Let's Encrypt来颁发,就需要执行下面的命令来切换CA
 acme.sh --set-default-ca --server letsencrypt
  • 切换CA后可能需要用邮箱重新注册一下进行账号登记
 /root/.acme.sh/acme.sh --register-account -m ****@**.com
  • 我这边使用的是 Let's Encrypt
  • 因为我在签证书的时候,命令写错了,导致多次验证失败,ZeroSSL直接把我封了24小时

申请新证书

  • 这里就跟着教程来,但需要注意一下,如果你有两个HOST,并且两个网站都是有不同的数据库,放在不同的根目录下的,是完全独立的站点,比如像我一样,一个www,一个blog,可能需要对命令进行一些修改,不然就像我一样被ZeroSSL封了...
  • 同时也有很多颁发证书的方法,具体可以看github教程
  • 我这边就说一下在两个三级域名的情况下,怎么用webroot模式来颁发证书,采用webroot可以规避后续签发证书时,导致占用80端口而使nginx停机几十秒的情况,虽然也就几十秒,完全没有影响就是了。
  • 首先教程給的原指令是
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
  • 这边虽然它有两个三级域名,但是只有一个根目录 /home/wwwroot/example.com,如果在我这种情况下直接使用,会出现奇奇怪怪的问题,在使用zerossl的话,会出现网络超时的问题,而用letsencrypt的话,就直接404了
  • 这是当时我的Let's Encrypt的报错

    [Sun Jan 25 07:38:19 PM CST 2026] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory
    root@*******:~# /root/.acme.sh/acme.sh --issue -d blog.comyugetsu.top -d www.comyugetsu.top --webroot /www/wwwroot/comyugetsu.top
    [Sun Jan 25 07:38:35 PM CST 2026] Using CA: https://acme-v02.api.letsencrypt.org/directory
    [Sun Jan 25 07:38:35 PM CST 2026] Multi domain='DNS:blog.comyugetsu.top,DNS:www.comyugetsu.top'
    [Sun Jan 25 07:38:44 PM CST 2026] Getting webroot for domain='blog.comyugetsu.top'
    [Sun Jan 25 07:38:44 PM CST 2026] Getting webroot for domain='www.comyugetsu.top'
    [Sun Jan 25 07:38:44 PM CST 2026] Verifying: blog.comyugetsu.top
    [Sun Jan 25 07:38:46 PM CST 2026] Pending. The CA is processing your order, please wait. (1/30)
    [Sun Jan 25 07:38:51 PM CST 2026] blog.comyugetsu.top: Invalid status. Verification error details: *******: Invalid response from http://blog.comyugetsu.top/.well-known/acme-challenge/QyV6Z-26yt4C-Eh59zjELvpx9J8R8pp3ifaFDdWIXe4: 404
    [Sun Jan 25 07:38:51 PM CST 2026] Please add '--debug' or '--log' to see more information.
    [Sun Jan 25 07:38:51 PM CST 2026] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
  • 所以后面其实要接两个地址,都是你的两个网站的根目录
  • 先运行这个命令
nginx -T | grep -E "server_name|root"
  • 输出:

请输入图片描述

  • 我有三个三级语域名,分别存在于两个完全不同的文件夹下,所以后面要接两个地址
  • 实际命令就是:
/root/.acme.sh/acme.sh --issue \
-d blog.comyugetsu.top -w /www/wwwroot/comyugetsu.blog.top \
-d www.comyugetsu.top -w /www/wwwroot/comyugetsu.top
  • 这个过程有可能会经历几次连接超时,没办法,毕竟国内连国外,多试几次总会成功的。
  • 输出:

    [Sun Jan 25 07:47:26 PM CST 2026] Your cert is in: ***
    [Sun Jan 25 07:47:26 PM CST 2026] Your cert key is in: ***
    [Sun Jan 25 07:47:26 PM CST 2026] The intermediate CA cert is in: ***
    [Sun Jan 25 07:47:26 PM CST 2026] And the full-chain cert is in: ***

安装证书

  • 此时证书还在 /root/.acme.sh/... ,要把证书从 /root 先复制到nginx能读到的 /etc/nginx/ssl 目录
  • 命令:
mkdir -p /etc/nginx/ssl

/root/.acme.sh/acme.sh --install-cert -d blog.comyugetsu.top \
--key-file       /etc/nginx/ssl/blog.key \
--fullchain-file /etc/nginx/ssl/blog.cer \
--reloadcmd     "service nginx force-reload"
  • 按照自己的实际情况具体更改即可
  • 然后
nginx -t
  • 出现 syntax is ok 后就重启
service nginx restart

修改配置文件

  • 先查看网站配置文件叫啥名:
ls /www/server/panel/vhost/nginx/
  • 我这边是叫 comyugetsu.blog.top.conf comyugetsu.top.conf

先配comyugetsu.top.conf(无typecho后台)

  • 然后用nano打开文件
nano /www/server/panel/vhost/nginx/comyugetsu.top.conf
  • 然后把下列配置添加到原文件最后一个 } 的后面(新添加的 HTTPS (443端口) 配置)
server {
    listen 443 ssl http2;
    server_name comyugetsu.top www.comyugetsu.top;
    # 网站目录 (根据你之前 nginx -T 查到的结果填写)
    root /www/wwwroot/comyugetsu.top;
    index index.php index.html index2.html;
    # SSL 证书路径 (复用刚才安装的证书,也就是彻底安装好证书之后的那个输出,不是刚刚签发好证书的那个输出)
    ssl_certificate /***/***/***;
    ssl_certificate_key /***/***/***;
    # SSL 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    # PHP 配置 
    include enable-php-82.conf;
    # 伪静态规则
    include /www/server/panel/vhost/rewrite/comyugetsu.top.conf;
    # 禁止访问的文件 
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
        return 404;
    }
    # 错误页配置
    error_page 404 /404.html;
}

note type="success flat"

退出nano编辑器:
按 Ctrl + O (保存) -> 按 Enter (确认)
按 Ctrl + X (退出)

后配comyugetsu.blog.top.conf(有typecho后台)

  • 然后用nano打开文件
nano /www/server/panel/vhost/nginx/comyugetsublog.top.conf
  • 然后把下列配置添加到原文件最后一个 } 的后面(新添加的 HTTPS (443端口) 配置)
server {
    listen 443 ssl http2;
    server_name blog.comyugetsu.top;
    # 证书路径(复用刚才安装的证书)
    ssl_certificate /***/***/***;
    ssl_certificate_key /***/***/***;
    # SSL 协议配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    # 网站根目录(根据你之前 nginx -T 查到的结果填写)
    root /www/wwwroot/comyugetsu.blog.top;
    index index.php index.html;
    # Typecho 伪静态规则 
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }
    # 【关键修正】直接使用宝塔自带的 PHP-82 配置
    # 这行代码会自动处理 PathInfo,让后台正常访问
    include enable-php-82.conf;
    # 错误页
    error_page 404 /404.html;
}
  • 然后
nginx -t
  • 出现 syntax is okSuccessful 后就重启
service nginx restart
  • 然后通过https://访问,大概率是可以访问到的,也就是成功了🎉🎉🎉🎉🎉🎉🎉🎉🎉
  • 如果还是没有https:,那主要就是看看你服务器防火墙有没有开 443 端口

查看证书

acme.sh --info -d domain.com

更新证书

-acme.sh 安装完成后会每日执行证书状态检测。如果检测到证书剩余有效期不足 30 天,脚本将尝试自动触发续期,全程无需人工操作。
-如需提前更新,可执行以下指令针对某个域名手动进行强制更新:

acme.sh --renew -d domain.com --force

中途踩的一个坑:
最开始我的blog.的conf配置最后多加了一个配置:

location ~ [^/]\.php(/|$) {
    try_files $uri =404;
    fastcgi_pass  unix:/tmp/php-cgi-74.sock; # 注意:这里的 74 取决于你的 PHP 版本,可能是 56, 72, 80 等
    fastcgi_index index.php;
    include fastcgi.conf;
    fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/proc/";
}

AI给的,结果直接把我的typecho后台给干404了
后续AI给的原因是:
这是一个非常经典的问题,原因出在我刚才给你提供的那个“通用 PHP 配置”里有一行代码太严格了,把 Typecho 的后台路径(/admin/)给误杀(404)了。
Typecho 的后台地址其实是“虚拟”的(比如 index.php/admin/),但我给你的配置里有一句 try_files $uri =404;,它会去硬盘里找真实存在的 /admin/ 文件夹,找不到就报错 404。
解决方法非常简单:删繁就简。 既然你用的是宝塔面板,它自带的 enable-php-82.conf 已经写得很完美了,我们不需要手写那一堆复杂的 PHP 配置。