acme.sh 自动解析并申请证书

772 阅读2分钟

腾讯云证书现在是3个月过期,自动申请下发证书变成刚需,域名多了免得证书失效了。

参考腾讯云文档  cloud.tencent.com/document/pr…

参考 zhuanlan.zhihu.com/p/670418258

步骤

安装nginx并设置域名解析

  • 1、在腾讯云管理台,域名解析新建二级域名A记录指向服务器外网IP,如域名test.my.com

  • 2、SSH登录服务器,安装nginx

# 安装nginx
yum install -y nginx
# 开机启动
systemctl enable nginx
# 启动
nginx
# 软连接
mkdir -p /root/nginx && ln -s /etc/nginx/ /root/nginx
  • 3、在nginx新建域名配置文件

进入 /etc/nginx/conf.d/ 新建文件 test.my.com.conf

cd /etc/nginx/conf.d/
touch test.my.com.conf

将下面内容放入 test.my.com.conf

server {
    listen 80;
    server_name test.my.com; 
    location / {
       proxy_pass http://127.0.0.1:8080; 
       proxy_set_header Host $proxy_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 }

再重启nginx

nginx -t
nginx -s reload

安装 acme.sh

curl https://get.acme.sh | sh -s email=自己邮箱@qq.com

crontab -l

cd ~/.acme.sh

# 查看已配置域名
sh acme.sh --list   

sh acme.sh --set-default-ca --server letsencrypt

注册域名自动申请证书


cd /root/.acme.sh

export Domain="test.my.com"

############################################
###### 1、如果是yum安装的nginx且已经注册nginx服务可以不用知道nginx.conf文件地址,用下面这句
sh acme.sh --issue -d $Domain --nginx

###### 2、如果是nginx编译安装的,需要知道nginx.conf文件地址,用下面这句
sh acme.sh --issue -d $Domain --nginx /usr/local/nginx/conf/nginx.conf
############################################

############################################
# 注意下面的 key 和 crt 目标地址根据自身情况写,我用的yum就是这个地址
# force-reload 这句也是根据自身情况写,我用的yum而且已经注册nginx为服务,不然就用 nginx -s reload

##### 1、如果是 yum 安装的nginx 且已经注册nginx服务
sh acme.sh --install-cert -d $Domain \
--key-file       /etc/nginx/conf.d/$Domain.key  \
--fullchain-file /etc/nginx/conf.d/${Domain}_bundle.crt \
--reloadcmd     "service nginx force-reload"

##### 2、如果是自己编译安装的nginx,如果没有 nginx service 服务
sh acme.sh --install-cert -d $Domain \
--key-file       /usr/local/nginx/conf/$Domain.key  \
--fullchain-file /usr/local/nginx/conf/${Domain}_bundle.crt \
--reloadcmd     "nginx -s reload"
#########################################

报错处理

Cannot find nginx config.

增加上 nginx 配置文件地址

sh acme.sh --issue -d $Domain --nginx /usr/local/nginx/conf/nginx.conf

urn:ietf:params:acme:error:serverInternal

看起来 letsenscypt 报错,等了一分钟,重新执行又成功了

Signing failed. Finalize code was not 200.
{
  "type": "urn:ietf:params:acme:error:serverInternal",
  "detail": "Error finalizing order",
  "status": 500
}

image.png

image.png

配置nginx的https

进入 /etc/nginx/conf.d/ 修改 test.my.com.conf 改为 注意里面都要改成自己的域名

server {
    listen 80;
    listen 443 ssl; 
    server_name test.my.com; 
    ssl_certificate /etc/nginx/conf.d/test.my.com_bundle.crt; 
    ssl_certificate_key /etc/nginx/conf.d/test.my.com.key; 
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3; 
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_prefer_server_ciphers on;
    if ( $scheme = 'http' ){
       rewrite ^(.*)$ https://$host$1 permanent;
    }
    location / {
       proxy_pass http://127.0.0.1:8080; 
       proxy_set_header Host $proxy_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
 }

再重启nginx

nginx -t
nginx -s reload

参考文档

注意:如果是泛域名则需要建子账号获取Tencent_SecretId和Tencent_SecretKey,更常用的是单独域名的则不需要建子账号,使用nginx,直接执行下面脚本

第一步curl有点慢或者超时,多试几次吧

image.png

服务器操作

采用新建子账号 acme,并授权dns方式,重点是获取Tencent_SecretIdTencent_SecretKey

image.png

image.png

image.png

某项目

域名  xxxx.xxxxxx.cn/

找到nginx配置文件目录  /etc/nginx/conf.d/

新建 xxxx.conf文件,每个域名一个 *.conf 配置文件

image.png

文件内容,主要是要生成 key 和 crt 文件

# 执行器仪表监控项目, 配置https
     server {
        listen 80;
        listen 443 ssl; 
        server_name xxxx.xxxxxx.cn; 
        ssl_certificate /etc/nginx/conf.d/xxxx.xxxxxx.cn_bundle.crt; 
        ssl_certificate_key /etc/nginx/conf.d/xxxx.xxxxxx.cn.key; 
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3; 
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;
        #将http请求转成https
        if ( $scheme = 'http' ){
           rewrite ^(.*)$ https://$host$1 permanent;
        }
        location / {
           proxy_pass http://127.0.0.1:50281; # 转发到前端容器内nginx
           proxy_set_header Host $proxy_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
     }

执行shell脚本,注意把里面域名都替换成自己的


curl https://get.acme.sh | sh -s email=自己邮箱@qq.com

crontab -l

cd ~/.acme.sh

sh acme.sh --set-default-ca --server letsencrypt

// 方式一:泛域名,这里是泛域名方式要制定 dns 服务商,所以需要上面建立子账号获取Tencent_SecretId和Tencent_SecretKey
export Tencent_SecretId="xxxxxxxxxxxxxxxxxxxxxxx"
export Tencent_SecretKey="xxxxxxxxxxxxxxxxxxxxxxx"
sh acme.sh --issue --dns dns_tencent -d xxxx.xxxxxx.cn
// 常用方式二:单独域名,如果是单独域名就不用建立子账号获取Id和Key,并指定nginx模式
sh acme.sh --issue -d xxxx.xxxxxx.cn --nginx


sh acme.sh --install-cert -d xxxx.xxxxxx.cn \
--key-file       /etc/nginx/conf.d/xxxx.xxxxxx.cn.key  \
--fullchain-file /etc/nginx/conf.d/xxxx.xxxxxx.cn_bundle.crt \
--reloadcmd     "service nginx force-reload"

file-read-472.png

可以看到nginx中 key和crt文件已经重新生成

image.png