【技能】acme.sh 实现域名https证书

不说废话哈哈,域名大家都知道的,公司的对外根域名是买的阿里云,估计站点挂的免费的ssl用完了,老大不想花钱扩容,所以部门想个办法实现域名的免费证书。

acme.sh 是一个git的开源项目,可以帮你生成免费的证书,而且支持多个免费的签发机构,如果某一个机构不能使用了,那么可以自己去切换。项目地址:github.com/acmesh-offi... 这个程序默认的签发机构是zerossl,我尝试了几次有时候linux的ssh版本会导致创建证书这一步执行失败,建议切换成 Let's Encrypt ,切换的方式 acme.sh --set-default-ca --server letsencrypt

使用的方式

首先我们需要切换成root用户,作者建议我们使用root的方式配置,作者也提供了sudo的方式配置,但是也不建议,比较麻烦。

  1. 需要下载acme.sh,下载的方式 curl get.acme.sh | sh -s email=个人邮箱,如果无法在服务器下载可以自己去git上面下载然后上传到服务器上。
  2. 为程序配置全局别名 alias acme.sh=~/.acme.sh/acme.sh
  3. 然后就可以我们的域名生成证书了,正常我们都是用代理中间件配置域名的对应转发,比如nginx、haproxy、apache,官方提供了nginx 和 apache 两种证书生成的模式
css 复制代码
acme.sh --issue  -d mydomain.com   --apache 
acme.sh --issue  -d mydomain.com   --nginx 
  1. 将生成的证书配置到我们指定的位置
css 复制代码
acme.sh --install-cert  -d mydomain.com \
--key-file       /etc/nginx/ssl/mydomain.com.key  \
--fullchain-file /etc/nginx/ssl/mydomain.com.crt \
--reloadcmd     "nginx -s reload"

这里就算是结束了 ,免费的证书已经按生成完成,后面大家可以自己在自己的服务中间件配置https,其实大家可以到acme的目录下面找到自己域名的子目录,这个就是整个过程的工程目录,里面有一个mydomain.com.conf ,域名开头的配置文件,acme的自动的更新证书的执行计划也是基于这个配置完成。大致是这么个配置

ini 复制代码
Le_Domain= 
Le_Alt='no'
Le_Webroot='nginx:'
Le_PreHook=''
Le_PostHook=''
Le_RenewHook=''
Le_API= 
Le_Keylength='ec-256'
Le_OrderFinalize= 
Le_LinkOrder= 
Le_LinkCert= 
Le_CertCreateTime='1705023903'
Le_CertCreateTimeStr='2024-01-12T01:45:03Z'
Le_NextRenewTimeStr='2023-01-11T01:45:03Z'
Le_NextRenewTime='1710121503'
Le_RealCertPath=''
Le_RealCACertPath=''
Le_RealKeyPath= 
Le_ReloadCmd= 
Le_RealFullChainPath= 

是不是特别的清晰,域名、更新时间、下一次的更新的时间、更新的位置(Le_RealCertPath)。

后言

因为公司使用的是haproxy,这个代理服务器https的配置需要将两个key和crt文件合成一个pem文件配置,才能使用,所以我写了一个脚本完成自动更新,如果需要大家可以参考下我的

bash 复制代码
#! /bin/bash
acme_folder=$1
domian_name=$2
haproxy_folder="/etc/haproxy"
# acme 
acme_conf_file=$3 
force_run=$4
cd "$acme_folder"
# crt_file 的配置文件
crt_file="${domian_name}.crt" 
# crt_file 的配置文件
key_file="${domian_name}.key" 
# pem文件
pem_file="${domian_name}.pem"
# 旧的pem文件
old_pem_file="${domian_name}.pem.back"
# 新的pem文件
new_pem_file="${domian_name}.pem.new"
# 下一次运行日的行号
line_number=14  # 请替换为你需要的行号
# 使用sed命令读取特定行的内容,并赋值给变量
line_content=$(sed -n "${line_number}p" "$acme_conf_file")
# 获取下次重新更新的时间
Le_NextRenewTimeStr=$(echo $line_content | awk -F '=' '{print $2}'|tr -d "'")
# 将时间字符串转换为时间戳
timestamp=$(date -d "$Le_NextRenewTimeStr" +"%s")
# 获取今天的时间戳
today_timestamp=$(date +"%s")
# 计算天数差
day_difference=$(( ($today_timestamp - $timestamp) / 86400 ))
echo "$timestamp"
echo "$today_timestamp"
echo "$day_difference"
if [ $day_difference -gt 1 ]  || [ $force_run = true ] ; then
    touch "$new_pem_file";
    # 读取第一个文件的配置 读取第二个文件的配置
    cat "$crt_file" "$key_file" > "$new_pem_file"
    # 移动新的文件到haproxy工作目录中 
    mv "$new_pem_file"  "$haproxy_folder"
        # 切换位置 
    cd "$haproxy_folder"
    if [ -e "$pem_file" ]; then
        # 复制旧的配置 
        cp "$pem_file" "$old_pem_file"
        # 替换新文件
        cp "$new_pem_file" "$pem_file"
    else
        # 替换新文件
        cp "$new_pem_file" "$pem_file"
    fi
    # 执行重新加载的命令
    systemctl reload haproxy;
    echo "更新证书完成"
else
    echo "还没有到达更新的时间"
fi

执行的方式

bash autoupdate.sh 证书位置 你的域名 /root/.acme.sh/mydomain.com_ecc/mydomain.com.conf true(是否强制生成证书)

相关推荐
章豪Mrrey nical1 分钟前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
派大鑫wink1 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼1 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII1 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home2 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3212 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446232 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL2 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小信啊啊2 小时前
Go语言切片slice
开发语言·后端·golang
Victor3564 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端