
阿里云服务器使用 acme.sh 安装 Let‘s Encrypt SSL证书
1 前言
想给博客网站添加 SSL 证书,阿里云付费的用不起,免费的又只有三个月,所以决定使用 Let‘s Encrypt。
此前我使用了 Certbot 安装,并且参考了以下三篇文章
都失败了。
第一个方法是用的 python 安装 Certbot ,但是最终卡在了下面这个报错:
An unexpected error occurred:
ValueError: Invalid version. The only valid version for X509Req is 0.
第二个用的是 snapd 安装 Certbot ,最终卡在了这个报错:
Certbot 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 说使用以下两个命令的其中一个安装:
curl 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
yum install git
随便挑一个目录,我是在 /root 目录,克隆仓库
git clone https://gitee.com/neilpang/acme.sh.git
然后运行安装脚本
# 进入目录
cd acme.sh/
# 运行安装脚本
./acme.sh --install -m 你的邮箱@email.com
![[https://xgrblog.cn/xgrblogbucket/image/20251010/151226f2-e22d-4bcc-b432-8638b6f9e455/Pasted image 20250918175645.png]]
它会将 acme.sh 安装到 ~/.acme.sh/ 这个目录下。
如果你当前操作的用户是 root ,那就是 /root 文件夹,如果是普通用户就是 /home/用户名 文件夹。
可以 在仓库目录 acme.sh 运行 ./acme.sh --version 查看版本
![[https://xgrblog.cn/xgrblogbucket/image/20251010/64cc76a7-cdbd-47e6-923e-72ccccccc9e6/Pasted image 20250918175621.png]]
给该脚本起个 shell 别名,方便使用
alias acme.sh=~/.acme.sh/acme.sh
注意等号前后不要有空格
3 创建阿里云 RAM 访问控制用户
首先需要在阿里云控制台创建用户,并且授权 DNS 管理的权限
登录阿里云官网,进入控制台,在头像下拉框处选择访问控制
![[https://xgrblog.cn/xgrblogbucket/image/20251010/ab9599e9-2d4b-456e-b930-72268ab8c76b/Pasted image 20250918181054.png|400]]
点击侧边栏的用户,点击创建用户
![[https://xgrblog.cn/xgrblogbucket/image/20251010/7250ad79-971a-4c65-a5a1-36fbf58bc7ec/Pasted image 20250918181241 1.png|400]]
安装要求填好登录名称和显示名称(可选),记得选中使用永久 AccessKey 访问
![[https://xgrblog.cn/xgrblogbucket/image/20251010/80caec37-28ed-4cdf-b471-18a870513cf5/Pasted image 20250918181435.png]]
创建好以后,会跳出用户信息,点击操作列的复制,可以一键复制 AccessKey 和 Access Secret,一定要记住这两个,后面会用到,退出该页面就不会再显示了。
![[https://xgrblog.cn/xgrblogbucket/image/20251010/326863ef-be92-4192-8fc9-f2ba0747105b/Pasted image 20250918181840.png]]
返回用户列表,点击列表右侧的添加权限
![[https://xgrblog.cn/xgrblogbucket/image/20251010/abb08b8a-bac5-4300-8a15-c490c1970de9/Pasted image 20250918181541.png]]
在搜索框输入 DNS 选择 AliyunDNSFullAccess,点击确认新增授权
![[https://xgrblog.cn/xgrblogbucket/image/20251010/90c7d5af-ef57-4fc2-b77e-ed5c91a098fc/Pasted image 20250918181614.png]]
4 生成密钥
输入命令 vim ~/.acme.sh/account.conf 修改该文件,在 ACCOUNT_EMAIL 下,添加下列两行
ACCOUNT_EMAIL='你的邮箱@email.com'
SAVED_Ali_Key='...'
SAVED_Ali_Secret='...'
SAVED_Ali_Key 填 AccessKey ,SAVED_Ali_Secret 填 Access Secret。
保存退出。
命令行输入:
acme.sh --issue --dns dns_ali -d 你的域名 --keylength ec-256
![[https://xgrblog.cn/xgrblogbucket/image/20251010/15175d07-4a07-4620-9e79-4a2c90857b32/Pasted image 20250918182520.png]]
我不知道哪些是隐私,我把我认为是隐私的地方注释了。
最后就可以看到生成的证书
![[https://xgrblog.cn/xgrblogbucket/image/20251010/a9ec55f6-185a-4327-8ada-a085dd066973/Pasted image 20250918182615.png]]
接下来要将证书复制出来,给 nginx 使用。为什么不直接用 ./acme.sh 里的?官网是这样说的:
必须使用
--install-cert命令来把证书复制到目标文件,请勿直接使用~/.acme.sh/目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。
输入命令
acme.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 写在哪就改哪。
server {
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
server {
listen 80;
server_name xgrblog.cn;
return 301 https://$host$request_uri;
}
之后就可以测试一下用https访问网站了,我这里就不演示了。
对了,还可以使用 crontab -l 查看是否有定时任务
![[https://xgrblog.cn/xgrblogbucket/image/20251010/a3258ad8-25b4-4033-ac9a-904e397f0967/Pasted image 20250918193330.png]]
这里是每天 00:06 执行 acme .sh 脚本
这个是在安装 acme.sh 时,acme.sh 自动创建的,官网有说,如果没有的,就自己手动创建一个吧。
输入命令 crontab -e 进入定时任务的编辑文件,写一个定时任务
6 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
时间可以自己自定义,路径要修改成自己的
5 总结
-
学会了安装 acme.sh,并使用 acme.sh 生成证书
-
学会了在 nginx 中配置 ssl 证书
-
学会了使用
crontab -e创建定时任务
0 人赞过
评论
评论加载中…