2025年6月4日星期三

acme.sh申请https证书


        之前用过dns方法验证,最后发现其实兼容性不好,比较麻烦,每家dns托管服务商申请api令牌的方法也不同,之后再增加新的域名部署不太方便。

经过试验发现最终其实还是用Http Web服务器的方式验证域名所有权的兼容性最好,速度也快,不容易出现什么奇奇怪怪的bug,所以最近统一把几台服务器的ssl证书申请都部署了 webroot的验证方式。

1 首先安装
curl https://get.acme.sh | sh -s email=my@example.com
邮箱填写自己的常用邮箱,之后续订时失败会发邮件给这个邮箱。安装后会自动把脚本放到这个目录:   ~/.acme.sh/   我用的root账户,所以也就是/root/.acme.sh/acme.sh

2 首次申请证书
~/.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

然后使用这2个域名访问网站吧,浏览器提示连接安全,证书有效,Firefox访问的话,可以点击小锁标志,更多信息-查看证书-主题替代名称(SAN字段)里显示了此证书覆盖的所有域名,正是前面申请的那2个域名。

之后就等待到期后自动更新并部署吧,最后附上此项目的官方网站。








没有评论:

发表评论

XG-040G-XX SuPassword 解密工具

 买了新光猫 XG-040G-TF ,  所以写了一个 SuPassword 解密工具, 以备不时之需 . 点击下载