前言
最近也是穷的不行了,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加密的了。
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加密的了。
总结
累累嘟,但是写完了。
终于可以免费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.