2084 字
3 分钟
6 次
- 2025-10-10
1 前言
想给博客网站添加 SSL 证书,阿里云付费的用不起,免费的又只有三个月,所以决定使用 Let‘s Encrypt。
此前我使用了 Certbot 安装,并且参考了以下三篇文章
都失败了。
第一个方法是用的 python 安装 Certbot ,但是最终卡在了下面这个报错:
bashAn unexpected error occurred: ValueError: Invalid version. The only valid version for X509Req is 0.
第二个用的是 snapd 安装 Certbot ,最终卡在了这个报错:
textCertbot failed to authenticate some domains (authenticator: nginx). The Certificate Authority reported these problems: Domain: xgrblog.cn Type: unauthorized Detail: xxx.xxx.xxx.xxx: Invalid response from http://xgrblog.cn/.well-known/acme-challenge/kA5GhAtuIB9E6g1yyBa61P90QhHdwXIf7jaweC0X084: 403 Hint: The Certificate Authority failed to verify the temporary nginx configuration changes made by Certbot. Ensure the listed domains point to this nginx server and that it is accessible from the internet. Some challenges have failed. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
最后找到了这个文章
以及 ACME 的 github wiki
成功安装了证书。
2 安装 acme.sh
wiki 说使用以下两个命令的其中一个安装:
bashcurl https://get.acme.sh | sh -s email=my@example.com wget -O - https://get.acme.sh | sh -s email=my@example.com
但是我不论选哪一个,都下载不了,下载速度都是 --.-K/s。
于是决定使用
这个记录的方法。
首先安装 git
bashyum install git
随便挑一个目录,我是在 /root 目录,克隆仓库
bashgit clone https://gitee.com/neilpang/acme.sh.git
然后运行安装脚本
bash# 进入目录 cd acme.sh/ # 运行安装脚本 ./acme.sh --install -m 你的邮箱@email.com

它会将 acme.sh 安装到 ~/.acme.sh/ 这个目录下。
如果你当前操作的用户是 root ,那就是 /root 文件夹,如果是普通用户就是 /home/用户名 文件夹。
可以 在仓库目录 acme.sh 运行 ./acme.sh --version 查看版本

给该脚本起个 shell 别名,方便使用
bashalias acme.sh=~/.acme.sh/acme.sh
注意等号前后不要有空格
3 创建阿里云 RAM 访问控制用户
首先需要在阿里云控制台创建用户,并且授权 DNS 管理的权限
登录阿里云官网,进入控制台,在头像下拉框处选择访问控制

点击侧边栏的用户,点击创建用户

安装要求填好登录名称和显示名称(可选),记得选中使用永久 AccessKey 访问

创建好以后,会跳出用户信息,点击操作列的复制,可以一键复制 AccessKey 和 Access Secret,一定要记住这两个,后面会用到,退出该页面就不会再显示了。

返回用户列表,点击列表右侧的添加权限

在搜索框输入 DNS 选择 AliyunDNSFullAccess,点击确认新增授权

4 生成密钥
输入命令 vim ~/.acme.sh/account.conf 修改该文件,在 ACCOUNT_EMAIL 下,添加下列两行
textACCOUNT_EMAIL='你的邮箱@email.com' SAVED_Ali_Key='...' SAVED_Ali_Secret='...'
SAVED_Ali_Key 填 AccessKey ,SAVED_Ali_Secret 填 Access Secret。
保存退出。
命令行输入:
bashacme.sh --issue --dns dns_ali -d 你的域名 --keylength ec-256

我不知道哪些是隐私,我把我认为是隐私的地方注释了。
最后就可以看到生成的证书

接下来要将证书复制出来,给 nginx 使用。为什么不直接用 ./acme.sh 里的?官网是这样说的:
必须使用
--install-cert命令来把证书复制到目标文件,请勿直接使用~/.acme.sh/目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。
输入命令
bashacme.sh --install-cert -d 你的域名 --key-file /my/ssl/key.pem --fullchain-file /my/ssl/fullchain.pem --reloadcmd "systemctl restart nginx" --ecc
/my/ssl这个路径是可以自定义的
接下来就是给 nginx 配置证书了,我博客网站是单独创建的一个配置文件,名为 xgrblog.conf 所以我就在改配置下改就行了,server 写在哪就改哪。
textserver { listen 443 ssl; # 我这里原本是80端口,现在改成443 server_name xgrblog.cn; # 写域名 # fullchain.pem 路径 ssl_certificate /my/ssl/fullchain.pem; # key.pem 路径 ssl_certificate_key /my/ssl/key.pem; # SSL/TLS 会话缓存超时时间 ssl_session_timeout 10m; # 共享会话缓存大小 ssl_session_cache shared:SSL:10m; # 指定支持的 TLS 协议版本 ssl_protocols TLSv1.2 TLSv1.3; # 允许使用的加密算法套件 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305; # 优先使用该配置的加密套件 ssl_prefer_server_ciphers on; }
此外,还需要添加一个service 监听 80 端口,用于将 http 请求重定向到 https
textserver { listen 80; server_name xgrblog.cn; return 301 https://$host$request_uri; }
之后就可以测试一下用https访问网站了,我这里就不演示了。
对了,还可以使用 crontab -l 查看是否有定时任务

这里是每天 00:06 执行 acme .sh 脚本
这个是在安装 acme.sh 时,acme.sh 自动创建的,官网有说,如果没有的,就自己手动创建一个吧。
输入命令 crontab -e 进入定时任务的编辑文件,写一个定时任务
text6 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
时间可以自己自定义,路径要修改成自己的