curl https://get.acme.sh | sh -s email=my@example.com
~/.acme.sh/acme.sh --issue -d geoip.qzz.io -d jpliuyu.duckdns.org --webroot /var/www/html --server letsencrypt
命令中,我指定了申请多域名 geoip.qzz.io 和 jpliuyu.duckdns.org,也就是 SAN 证书(Subject Alternative Name)。 最终生成的是一套证书,但是支持多域名, jpliuyu.duckdns.org和geoip.qzz.io都能访问我的网站,这样不会影响老用户使用旧的域名访问。
执行这条命令前,这2个域名都需要在DNS托管服务商那里设置好A记录和AAAA记录,首先确保这2个域名都能成功解析到服务器IP。
参数--server letsencrypt 是可选的,如果不指定默认是ZeroSSL的CA服务商,我个人喜欢letsencrypt,所以这里指定了。
--webroot 指定你的http服务器根目录,我这里是/var/www/html,确保你的服务器可以从外部80端口访问到,如果配置了http 301跳转的话,记得先配置放行/.well-known/acme-challenge路径,nginx的例子:
server {
listen 80;
listen [::]:80;
server_name geoip.qzz.io;
# 放行 Let's Encrypt 验证请求
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/html;
allow all;
try_files $uri =404;
}
# 其他所有请求都重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
3 安装证书
第二步申请成功后,证书是保存到/root/.acme.sh目录下的,但是这个证书是给acme.sh内部使用的,接下来我们还要安装证书。
~/.acme.sh/acme.sh --install-cert -d geoip.qzz.io \
--cert-file /home/ubuntu/ssl_file/geoip.qzz.io/cert.pem \
--key-file /home/ubuntu/ssl_file/geoip.qzz.io/key.pem \
--fullchain-file /home/ubuntu/ssl_file/geoip.qzz.io/fullchain.pem \
--reloadcmd "systemctl reload nginx"
这样证书就被安装到指定的/home/ubuntu/ssl_file/geoip.qzz.io目录下了,安装成功后这里指定了执行命令 systemctl reload nginx ,这样之后脚本自动更新时,也会自动执行这条命令使http服务器生效。
接下来nginx的配置文件里指定ssl证书路径即可。
ssl_certificate /home/ubuntu/ssl_file/geoip.qzz.io/fullchain.pem;
ssl_certificate_key /home/ubuntu/ssl_file/geoip.qzz.io/key.pem;
4 验证
crontab -l
这里会发现自动添加到了定时任务,之后脚本会自动更新证书,并且使用第三步执行过的命令来安装证书。
43 18 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
这里看到,脚本自动加入的crontab 的规则,不是标准的语法,很有可能解析错误,所以我们执行命令 crontab -e 修改这行为正确的语法:
43 18 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null
没有评论:
发表评论