前言

最近也是穷的不行了,SSL的付费证书买不起了,如果是之前的阿里云付费版本的请参考这里《[无敌小白版] 上传SSL证书,将HTTP变成HTTPS》

终于把目标放在了觊觎已久的Let's Encrypt,其实这个挺合理的,因为Let's Encrypt 的周期短,而且可以自动更新。

正文

1. WordPress

Let's Encrypt提供了很多种安装的方法,我们这里使用Bash里面的acme.sh,这里官网也提供了acme.sh中文版

这里根据步骤,我们可以一步一步来:

1.1 生成acme.sh

首先我们应该生成acme.sh,安装很简单,一条命令

curl https://get.acme.sh | sh -s email=xinhai.zou@hotmail.com

注意:普通用户和root用户都可以安装使用。

这里的安装过程进行了以下几步:
1. 把 acme.sh 安装到了我们的 home 目录下: ~/.acme.sh/ 并创建一个 shell 的 alias,例如 .bashrc,方便使用: alias acme.sh=~/.acme.sh/acme.sh
2. 自动为我们创建 cronjob,每天0:00点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
注意:如果安装完成后提示-bash: acme.sh: command not found,需要手动执行source ~/.bashrc

1.2 生成证书

acme.sh 实现了 acme协议支持的所有验证协议。 一般用两种方式验证:HTTP 和 DNS验证。

我们这里使用HTTP验证,我们的wordpress是nginx服务器,所以我们直接使用nginx模式,使用以下的命令,注意我们这里的Nginx路径和平时不一样,我们需要指定Nginx的路径,参考自《How to issue a cert》

对于我们wordpress而言,我们需要找到wordpress.conf,对于我而言,它的位置在/usr/local/nginx/conf/vhost/wordpress.conf,把它放在--nginx后面即可。

acme.sh --issue -d navi.seanzou.com --nginx /usr/local/nginx/conf/vhost/wordpress.conf

如果发生报错,CA证书申请失败了,这种问题通常与CA的验证流程和速率限制相关。

[Sun Aug 10 19:39:00 CST 2025] Processing. The CA is processing your order, please wait. (1/30)
[Sun Aug 10 19:39:07 CST 2025] The retryafter=86400 value is too large (> 600), will not retry anymore.

我们需要切换CA 到 Let's Encrypt

acme.sh --set-default-ca --server letsencrypt

然后显示

[Sun Aug 10 19:42:46 CST 2025] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory

我们可以再重新尝试生成证书

acme.sh --issue -d navi.seanzou.com --nginx /usr/local/nginx/conf/vhost/wordpress.conf

然后成功

[Sun Aug 10 21:14:01 CST 2025] Pending. The CA is processing your order, please wait. (1/30)
[Sun Aug 10 21:14:08 CST 2025] Pending. The CA is processing your order, please wait. (2/30)
[Sun Aug 10 21:14:28 CST 2025] Success
...

注意:
1. Nginx模式,acme.sh在完成验证后,会恢复到之前的状态,都不会私自改变程序本身的配置,好处是我们不用担心配置被搞坏,但是也有一个确定,我们需要自己配置SSL项,否则我们只能生成证书,我们的网站还是无法正常使用HTTPS。
2. 如果遇到问题[Sun Aug 10 20:58:14 CST 2025] navi.seanzou.com: Invalid status. Verification error details: 47.241.94.225: Invalid response from http://navi.seanzou.com/.well-known/acme-challenge/<YOUR TOKEN>: 404,请检查自己的nginx.conf/wordpress.conf是否配置正确
3. 如果失败,还有可能是强制重定向问题,把wordpress.conf里面这个rewrite ^ https://$host$request_uri? permanent;给注释了

1.3 复制证书

证书生成好以后,我们需要把证书复制给对应的Nginx服务器去使用。

必须使用--install-cert命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。

我们使用命令

acme.sh --install-cert -d navi.seanzou.com \
  --cert-file      /usr/local/nginx/conf/ssl/leaf.pem \
  --key-file       /usr/local/nginx/conf/ssl/key.pem \
  --ca-file        /usr/local/nginx/conf/ssl/chain.pem \
  --fullchain-file /usr/local/nginx/conf/ssl/fullchain.pem \
  --reloadcmd      "nginx -t && nginx -s reload"

然后成功

[Sun Aug 10 23:27:37 CST 2025] Running reload cmd: service nginx reload
Redirecting to /bin/systemctl reload nginx.service
[Sun Aug 10 23:27:38 CST 2025] Reload successful

然后,我们需要回到我们的/usr/local/nginx/conf/vhost/wordpress.conf,去看看是否用的路径正确

ssl_certificate           /usr/local/nginx/conf/ssl/fullchain.pem;  # 叶子 + 中间
ssl_certificate_key       /usr/local/nginx/conf/ssl/key.pem;        # 私钥
ssl_trusted_certificate   /usr/local/nginx/conf/ssl/chain.pem;      # 仅中间证书(不要放 root)
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;  # 让 nginx 能解析 OCSP 域名
resolver_timeout 5s;

然后重新reload nginx服务器:nginx -t && nginx -s reload

然后我们登陆发现成功,虽然有warning如下:

nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/usr/local/nginx/conf/ssl/fullchain.pem"
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/usr/local/nginx/conf/ssl/fullchain.pem"

但是我们现在的网站已经是https加密的了。

Screenshot 20250810 at 23.49.56.png

3. Nginx上传

步骤和Wordpress类似

1.1 生成acme.sh

首先我们应该生成acme.sh,安装很简单,一条命令

curl https://get.acme.sh | sh -s email=xinhai.zou@hotmail.com

注意:普通用户和root用户都可以安装使用。

这里的安装过程进行了以下几步:
1. 把 acme.sh 安装到了我们的 home 目录下: ~/.acme.sh/ 并创建一个 shell 的 alias,例如 .bashrc,方便使用: alias acme.sh=~/.acme.sh/acme.sh
2. 自动为我们创建 cronjob,每天0:00点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
注意:如果安装完成后提示-bash: acme.sh: command not found,需要手动执行source ~/.bashrc

1.2 生成证书

acme.sh 实现了 acme协议支持的所有验证协议。 一般用两种方式验证:HTTP 和 DNS验证。

我们这里使用HTTP验证,我们这里是纯粹的nginx服务器,所以我们直接使用nginx模式,使用以下的命令,注意我们这里的Nginx路径和平时不一样,我们需要指定Nginx的路径,参考自《How to issue a cert》

对于我们纯粹的nginx而言,我们需要找到nginx.conf,对于我而言,它的位置在/www/server/nginx/conf/nginx.conf,把它放在--nginx后面即可。

我们需要切换CA 到 Let's Encrypt

acme.sh --set-default-ca --server letsencrypt

然后申请:

acme.sh --issue -d blog.seanzou.com --nginx /www/server/nginx/conf/nginx.conf

然后成功

[Sun Aug 10 21:14:01 CST 2025] Pending. The CA is processing your order, please wait. (1/30)
[Sun Aug 10 21:14:08 CST 2025] Pending. The CA is processing your order, please wait. (2/30)
[Sun Aug 10 21:14:28 CST 2025] Success
...

注意:
1. Nginx模式,acme.sh在完成验证后,会恢复到之前的状态,都不会私自改变程序本身的配置,好处是我们不用担心配置被搞坏,但是也有一个确定,我们需要自己配置SSL项,否则我们只能生成证书,我们的网站还是无法正常使用HTTPS。
2. 如果遇到问题[Sun Aug 10 20:58:14 CST 2025] navi.seanzou.com: Invalid status. Verification error details: 47.241.94.225: Invalid response from http://navi.seanzou.com/.well-known/acme-challenge/<YOUR TOKEN>: 404,请检查自己的nginx.conf/wordpress.conf是否配置正确
3. 如果失败,还有可能是强制重定向问题,把ngxin.conf里面这个rewrite ^ https://$host$request_uri? permanent;给注释了

1.3 复制证书

证书生成好以后,我们需要把证书复制给对应的Nginx服务器去使用。

必须使用--install-cert命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。

我们使用命令

acme.sh --install-cert -d blog.seanzou.com \
  --cert-file      /www/server/nginx/conf/vhost/cert/leaf.pem \
  --key-file       /www/server/nginx/conf/vhost/cert/key.pem \
  --ca-file        /www/server/nginx/conf/vhost/cert/chain.pem \
  --fullchain-file /www/server/nginx/conf/vhost/cert/fullchain.pem \
  --reloadcmd      "nginx -t && nginx -s reload"

然后成功

nginx: [warn] conflicting server name "blog.seanzou.com" on 0.0.0.0:80, ignored
nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful
nginx: [warn] conflicting server name "blog.seanzou.com" on 0.0.0.0:80, ignored
[Mon Aug 11 00:08:14 CST 2025] Reload successful

然后,我们需要回到我们的/www/server/nginx/conf/nginx.conf,去看看是否用的路径正确

ssl_certificate           /www/server/nginx/conf/vhost/cert/fullchain.pem;  # 叶子 + 中间
ssl_certificate_key       /www/server/nginx/conf/vhost/cert/key.pem;        # 私钥
ssl_trusted_certificate   /www/server/nginx/conf/vhost/cert/chain.pem;      # 仅中间证书(不要放 root)
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;  # 让 nginx 能解析 OCSP 域名
resolver_timeout 5s;

然后重新reload nginx服务器:nginx -t && nginx -s reload

然后我们登陆发现成功,虽然有warning如下:

nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/www/server/nginx/conf/vhost/cert/fullchain.pem"
nginx: [warn] conflicting server name "blog.seanzou.com" on 0.0.0.0:80, ignored
nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful
nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/www/server/nginx/conf/vhost/cert/fullchain.pem"
nginx: [warn] conflicting server name "blog.seanzou.com" on 0.0.0.0:80, ignored

但是我们现在的网站已经是https加密的了。

Screenshot 20250811 at 00.12.42.png

总结

累累嘟,但是写完了。

终于可以免费update了,不用再用一年快2000点 DV证书了。(最便宜的也要2000也太恐怖啦!)

参考

[1] 《[无敌小白版] 上传SSL证书,将HTTP变成HTTPS》
[2] acme.sh中文版
[3] Let's Encrypt
[4] acme.sh
[5] 《How to issue a cert》
[6] ChatGPT-Plus
[7] ChatGPT (原版不太行,还是得Plus)

Q.E.D.


立志做一个有趣的碳水化合物