前文 使用Let’s Encrypt获取免费证书 介绍了使用 certbot 工具从Let’s Encrypt获取免费证书。但certbot需要自行设置定时任务更新证书、依赖于新版 Python(Debian 9等系统的Python是即将放弃支持的Python 3.5)、以及不少DNS验证插件需要自行安装。
鉴于上述缺点,考虑换成自动化程度更高、使用起来更简易的另一个ACME协议客户端:acme.sh
。本教程简要介绍使用acme.sh
从Let’s Encrypt获取免费证书。
安装acme.sh
acme.sh
官网是 https://github.com/acmesh-official/acme.sh,里面已经有比较详细的中文使用说明。
首先是安装acme.sh
:
curl https://get.acme.sh | sh
如果提示“curl: command not found”,CentOS/RHEL/Aliyun OS等衍生系统使用:yum install -y curl
,Debian/Ubuntu及衍生系统使用:apt update && apt install -y curl
安装curl
,然后再次运行上面的acme.sh安装命令。
更新:新版acme.sh使用ZeroSSL作为CA,建议切换到Let’s Encrypt的CA:
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
acme.sh
依赖于cron
执行定时任务,安装完成后,输入 crontab -l
命令,能看到如下输出:
41 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
定时任务保证了证书在到期前能自动续期。由于ACME协议和Let’s Encrypt CA都在频繁的更新,因此建议开启acme.sh的自动升级:
~/.acme.sh/acme.sh --upgrade --auto-upgrade
注意:本文中都是使用
~/.acme.sh/acme.sh
方式来使用命令,实际上安装好后退出终端并重新登录,便可以使用更简单的acme.sh
命令。如果你不想退出终端,可使用这条命令让acme.sh
生效:
source ~/.bashrc
本文本着正确性,都使用全路径的
~/.acme.sh/acme.sh
方式。
使用acme.sh签发证书
使用acme.sh
签发证书非常简单:
1. 如果你的服务器上已经运行了web软件,指定webroot即可签发证书:
~/.acme.sh/acme.sh --issue -d 域名 --webroot web目录
如果要为多个域名签发,直接加 -d 域名
就可以。
需要注意的是,非DNS验证方式签发证书的前提都是域名的IP需要指向当前服务器,并且防火墙需要
2. 如果网站已经运行Nginx/Apache,指定对应插件就可以了:
~/.acme.sh/acme.sh --issue -d 域名 --nginx # 如果是apache,换成 --apache
3. 如果没有运行web软件并且80端口空闲,可以使用acme.sh自己监听80端口进行验证:
~/.acme.sh/acme.sh --issue -d 域名 --standalone
4. 也可以使用DNS方式,手动添加DNS记录进行验证:
~/.acme.sh/acme.sh --issue --dns -d 域名 # 命令结束后,acme.sh会显示解析记录,需要到DNS后台设置解析 # 设置好解析后,生成证书 ~/.acme.sh/acme.sh --renew -d 域名
对于DNS方式,acme.sh内置了许多DNS服务商的插件,使用方法参考:https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md
如果有通配符证书要求,需要使用DNS验证方式,其他方式一个证书的域名数不能超过20
申请好证书的证书位于~/.acme.sh
目录内,不建议直接使用,而是将其安装到指定目录:
~/.acme.sh/acme.sh --install-cert -d 域名 \ --key-file 密钥存放路径(例如/etc/nginx/ssl/域名.key) \ --fullchain-file 证书存放路径(例如/etc/nginx/ssl/域名.pem) \ --reloadcmd "service nginx force-reload"
其中--reloadcmd
是可选的,用来安装好证书后重启web服务器。
接下来配置好网站的SSL配置(参考 使用Let’s Encrypt获取免费证书 ),就可以愉快的用HTTPS方式访问你的站点了。
acme.sh提示
上面提到的申请和安装命令,执行过一次后,acme.sh
便会记下你的操作,在证书即将到期前自动帮你执行一遍,非常的好用和贴心。
老哥,不太理解如下这一步的 【密钥存放目录】和【证书存放路径】需要填什么信息,劳烦有空解答一下~
~/.acme.sh/acme.sh –install-cert -d 域名 \
–key-file 密钥存放目录 \
–fullchain-file 证书存放路径 \
–reloadcmd “service nginx force-reload”
我一般这样:密钥存放路径填 /etc/nginx/conf.d/域名.key,证书存放路径:/etc/nginx/conf.d/域名.pem
翻到这篇文章,突然想起来自己的SSL证书也要到期了…
可以问一下,在输入apt install -y curl之后显示
Err:1 http://deb.debian.org/debian buster/main amd64 libcurl4 amd64 7.64.0-4
404 Not Found [IP: 151.101.22.132 80]
Err:2 http://deb.debian.org/debian buster/main amd64 curl amd64 7.64.0-4
404 Not Found [IP: 151.101.22.132 80]
E: Failed to fetch http://deb.debian.org/debian/pool/main/c/curl/libcurl4_7.64.0-4_amd64.deb 404 Not Found [IP: 151.101.22.132 80]
E: Failed to fetch http://deb.debian.org/debian/pool/main/c/curl/curl_7.64.0-4_amd64.deb 404 Not Found [IP: 151.101.22.132 80]
E: Unable to fetch some archives, maybe run apt-get update or try with –fix-missing?
该如何解决吗?
先运行这条命令: apt update
[Tue Feb 28 04:06:42 EST 2023] The domain ‘xxx.tk’ seems to have a ECC cert already, lets use ecc cert.
[Tue Feb 28 04:06:42 EST 2023] Installing key to: /etc/nginx/cert_file/key.pem
[Tue Feb 28 04:06:42 EST 2023] Installing full chain to: /etc/nginx/cert_file/fullchain.pem
cat: /root/.acme.sh/xxx.tk_ecc/fullchain.cer: No such file or directory
大佬好,我这提示上述的问题,cat: /root/.acme.sh/xxx.tk_ecc/fullchain.cer: No such file or directory,我看了下目录确实没有这个文件,我用的是letsencrypt,但是生产的ecc里边没有要找的文件
先把域名证书删了,然后再次申请
nginx SSL no start line: expecting: TRUSTED CERTIFICATE
按照步骤,使用生成的证书配置nginx,最后使用nginx -t,会报错nginx SSL no start line: expecting: TRUSTED CERTIFICATE。
证书没有生成成果,或者key和证书文件弄反了
大佬,我没改之前正常打开wp,改了nginx后就去了Welcome to CentOS欢迎界面,是不是我nginx改错了。麻烦帮我看下配置是不是有问题。
server {
listen 80;
server_name testc.bobostudio.tk testc.bobostudio.tk;
rewrite ^(.*) https://$server_name$1 permanent;
charset utf-8;
set $host_path “/var/www/testc.bobostudio.tk”;
access_log /var/log/nginx/testc.bobostudio.tk.access.log main buffer=32k flush=30s;
error_log /var/log/nginx/testc.bobostudio.tk.error.log;
root $host_path;
set $skip_cache 0;
if ($query_string != “”) {
set $skip_cache 1;
}
if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml”) {
set $skip_cache 1;
}
# 登录用户或发表评论者
if ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in”) {
set $skip_cache 1;
}
location = / {
index index.php index.html;
try_files /index.php?$args /index.php?$args;
}
location / {
index index.php index.html;
try_files $uri $uri/ /index.php?$args;
}
location ~ ^/\.user\.ini {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_index index.php;
fastcgi_cache wordpress;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \.(js|css|png|jpg|jpeg|gif|ico|swf|webp|pdf|txt|doc|docx|xls|xlsx|ppt|pptx|mov|fla|zip|rar)$ {
expires max;
access_log off;
try_files $uri =404;
}
}
server {
listen 443 ssl;
server_name testc.bobostudio.tk testc.bobostudio.tk;
charset utf-8;
ssl_certificate /root/cert.crt;
ssl_certificate_key /root/private.key;
ssl_protocols TLSv1.2; # TLSv1.3需要nginx 1.13.0以上版本
# 如果nginx版本低,建议使用这种加密算法配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
keepalive_timeout 70;
# 这里填写其他配置
}
443端口的配置没有正确写好root的值
尝试了Nginx方式和acme.sh自己监听80端口两种方式,都报错这两行…知道怎么解决了
[Tue Aug 24 19:12:26 HKT 2021] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35
[Tue Aug 24 19:12:28 HKT 2021] Can not init api for: https://acme.zerossl.com/v2/DV90.
换一个证书中心:acme.sh –set-default-ca –server letsencrypt,然后再重试
感谢 问题解决
不懂就问
请问我可以同时进行监听80端口验证和DNS验证吗?我已经输入代码~/.acme.sh/acme.sh –issue -d 域名 –standalone.突然又想改回DNS验证,哈哈,折腾才是人生呀.
80端口验证我已经到了申到了证书
到了这一步
~/.acme.sh/acme.sh –install-cert -d 域名 \
–key-file 密钥存放目录 \
–fullchain-file 证书存放路径 \
–reloadcmd “service nginx force-reload”
我有疑问,请问有没有推荐的目录和路径呢?
然后我没有安装nginx服务,请问reloadcmd这一行指令我需要输入吗?
谢谢作者
你可以用acme.sh –remove -d 域名先把域名证书删除了,然后用dns方式重新申请
推荐证书安装在nginx配置目录内
如果没有安装nginx,–reloadcmd这一行可不写
谢谢回复
请问一下为什么我输入监听80端口的时候它显示是这样的
[Mon Mar 15 04:26:20 EDT 2021] Please install socat tools first.
[Mon Mar 15 04:26:20 EDT 2021] _on_before_issue.
需要先安装socat,CentOS系统:yum install -y socat,Ubuntu/Debian:apt install -y socat
非常感谢.我原本以为又要在网站上搜索socat的安装,但是网上说的步骤都太麻烦了,没想到你的一个代码直接解决了,非常感谢,哈哈
请问一下,Debian11系统该怎么安装socat吗?
apt install -y socat
文章里的”~”符号用的都是全角,奇怪。
这么奇怪,有空我改改
我一直搞不懂通配符的意思,请教一下!安装XRAY和NGINX的时候,我使用了下面这些命令在一台VPS安装了通配符证书curl https://get.acme.sh | sh
source ~/.bashrc
导入CF的API:
export CF_Key=”xxxxxxxxxxxxx”
export CF_Email=”xxxxxxxxxxxxx”
~/.acme.sh/acme.sh –issue –dns dns_cf -d abcd.me -d *.abcd.me -k ec-256
~/.acme.sh/acme.sh –install-cert -d abcd.me -d *.abcd.me –fullchainpath /etc/v2ray/abcd.me.crt –keypath /etc/v2ray/abcd.me.key –ecc
定期自动更新
acme.sh –upgrade –auto-upgrade
证书安装成功后,假如我有另外一台VPS的IP也解析在这个abcd.me域名下,申请的是这个abcd.me的二级chery.abcd.me,那我在这台VPS下该怎么安装和使用我前面那个已经申请通配符的证书用在这台新的vps上面呢?需要从新走一遍上面的脚本命令来安装申请这个chery.abcd.me的证书吗?
可以把证书复制过去,也可以重新运行申请一次
感谢回复!那请问如果重新申请的话,CF-key需要重新导入吗?这条代码~/.acme.sh/acme.sh –issue –dns dns_cf -d abcd.me -d *.abcd.me -k ec-256还是这样去申请这个根域名吗?还是要变成这样我的二级域名~/.acme.sh/acme.sh –issue –dns dns_cf -d chery.abcd.me -d *.chery.abcd.me -k ec-256去申请?
同一台服务器上只需要运行~/.acme.sh/acme.sh –install-cert安装证书就好了,不同的服务器上需要设置CF-key这些变量,然后再次申请和安装
感谢热心回复!