1. 安装包

    yum -y install ftp expect
  2. 阿里云账号配置
    登录阿里云账号之后,依次点击:访问控制 -> 用户 -> 新建用户
    登陆名: ds(可自行更改)
    显示名: ds(可自行更改)
    访问方式: 编程式访问
    添加权限: AliyunDNSFullAccess
    获得新用户的 AccessKey IDAccessKeySecret
  3. 准备要签发证书的域名
    abc.com,表示要签发的通配符证书适用于域名 abc.com*.abc.com
    注意:每一行只能一个域名!

    cat > /data/tools/dns << EOF
    abc.com
    wx.abc.com
    yz.abc.com
    EOF
  4. 创建文件夹,下载压缩包,解压,创建链接

    mkdir -p /data/tools /data/app
    cd /data/app
    wget https://github.com/go-acme/lego/releases/download/v4.3.1/lego_v4.3.1_linux_amd64.tar.gz
    tar -xvf lego_v4.3.1_linux_amd64.tar.gz
    ln -s /data/app/lego/lego /usr/local/bin/lego
  5. 环境准备:环境变量,常用命令自定义

    cat > /etc/profile.d/lego_env.sh << EOF
    #!/bin/bash
    # 前面新用户的 AccessKey ID
    export ALICLOUD_ACCESS_KEY="TS***bp"
    # 前面新用户的 AccessKeySecret
    export ALICLOUD_SECRET_KEY="x0d***ac6"
    #export ALICLOUD_HTTP_TIMEOUT=300
    #export ALICLOUD_POLLING_INTERVAL=300
    #export ALICLOUD_PROPAGATION_TIMEOUT=600
    export ALICLOUD_TTL=60
    # ds@ID.onaliyun.com替换为新创建的登录名
    lego_args="-a --email ds@ID.onaliyun.com --dns alidns"
    alias legorun='function __legorun() { domain=$1;domains=*.$1;lego $lego_args --domains="$domain" --domains="$domains" run; unset -f __legorun; };cd /data/app/lego && __legorun'
    alias legorenew='function __legorenew() { domain=$1;domains=*.$1;lego $lego_args --domains="$domain" --domains="$domains" renew --days 35; unset -f __legorenew; };cd /data/app/lego && __legorenew'
    EOF
  6. 使环境变量生效

    source /etc/profile.d/lego_env.sh
  7. 证书生成脚本

    cat >> /data/tools/cou_cert.sh << EOF
    #!/bin/bash
    # 其中`shopt`命令是“shell options”的缩写,用来开关shell中的选项;
    # 开启`expand_aliases`之后`source`命令重新读取和执行记录了`alias`别名设置的bash配置文件。
    shopt -s expand_aliases
    source /etc/profile.d/lego_env.sh
    dnfile=/data/app/lego/.lego/certificates/$1.crt
    if [ ! -f "$dnfile" ];then
     legorun $1
    else
     legorenew $1
    fi
    ftp
    EOF
  8. 新增域名,生成证书

    cat > /data/tools/add_new.sh <<EOF
    cat dns | grep ^$1$ > /dev/null && echo 证书已存在 && exit
    cat >> dns << EOF
    $1
    EOF
    ./rec_cert.sh
    EOF
  9. 将脚本通过FTP拷贝到目标服务器
    目标服务器配置的FTP Server信息(需要替换):
    地址:192.168.16.8
    端口:12358
    用户名:UserName
    密码:UserPwd

    cat >> /data/tools/auto_copy.sh << EOF
    #!/bin/bash
    # 
    fp="/data/app/lego/.lego/certificates/"
    while read dn pass
    do
     /usr/bin/expect <<-END
    spawn /data/tools/cou_cert.sh $dn
    expect {
    "ftp> " {send "!ftp 192.168.16.8 12358\r";exp_continue}
    "Name (192.168.16.8:root): " {send "UserName\r";exp_continue}
    "Password:" {send "UserPwd\r"}
    }
    expect "ftp> " { send "send $fp$dn.crt x.$dn.pem\rsend $fp$dn.key x.$dn.key\rquit\rquit\r" }
    expect eof
    END
    done < /data/tools/dns
    EOF
  10. 计划任务,添加任务,启动服务,添加开机启动,查看服务状态

    echo 0 0 1 * * /data/tools/auto_copy.sh >> /etc/crontab
    systemctl start crond & systemctl enable crond & systemctl status crond
  11. 目标服务器
    需要使用FileZilla Server搭建FTP服务器,配置证书、用户名、密码、用户目录(作为证书的专用目录)和对应权限;
    根据自己的情况,查看是直接配置证书路径还是再加一层同步操作。
    定期重启web服务,确保最新的证书生效。
    配置FileZilla Server请参照另一篇文章《用FileZilla搭建FTP服务器及相关问题
  12. 当证书签发服务与Nginx代理服务在同一台服务器上

    #!/bin/bash
    cat > /data/tools/rec_cert.sh << EOF
    # 其中`shopt`命令是“shell options”的缩写,用来开关shell中的选项;
    # 开启`expand_aliases`之后`source`命令重新读取和执行记录了`alias`别名设置的bash配置文件。
    # 证书签发的准备工作
    tmp_log="/data/tools/renew_result"
    echo > ${tmp_log}
    shopt -s expand_aliases
    source /etc/profile.d/lego_env.sh
    fp="/data/app/lego/.lego/certificates/"
    ngc="/etc/nginx/certs/"
     
    # 根据/data/tools/dns当中记录的域名签发证书
    while read dn pass
    do
    dnfile=$fp$dn.crt
    if [ ! -f "$dnfile" ];then
     # 生成证书
     legorun $dn >> ${tmp_log}
    else
     # 更新证书
     legorenew $dn >> ${tmp_log}
    fi
    [ ! -f "/etc/nginx/certs/x.$dn.key" ] && echo > ${ngc}x.$dn.key
    [ ! -f "/etc/nginx/certs/x.$dn.pem" ] && echo > ${ngc}x.$dn.pem
    cp -f $fp$dn.crt ${ngc}x.$dn.pem
    cp -f $fp$dn.key ${ngc}x.$dn.key
    done < /data/tools/dns
     
    # 重启nginx,使证书生效
    nginx -s reload
     
    # 更新其他服务器上的证书
    cat renew_result | grep -e ".*yz\.abc\.com"|grep -v ": no renewal\." > /dev/null && scp ${ngc}x.ids.abc.com.* root@192.168.16.8:${ngc} >> nul
    # 通过邮件发送新的证书到指定服务器
    cat renew_result | grep -e ".*wx\.abc\.com"|grep -v ": no renewal\." > /dev/null && /data/tools/send-mail.sh
    
    # 删除临时日志
    rm -f ${tmp_log}
    
    EOF
  13. 证书格式转换

    cat > pem_to_pfx_no_ca.sh <<EOF
    if [ ! -n "$1" ]; then
     echo "Useage: $0 domain.com"
     exit
    fi
     
    ckey="x.$1.key"
    cpem="x.$1.pem"
    ccrt="x.$1.crt"
    cpfx="x.$1.pfx"
    #echo $ckey $cpem $cpfx $ccrt
     
    if [ -f "$cpem" ]; then
     [ ! -f $ckey ] && openssl rsa -in $cpem -out $ckey
     openssl x509 -in $cpem -out $ccrt
    #    openssl pkcs12 -export -out $cpfx -inkey $ckey -in $ccrt
     /usr/bin/expect <<-END
    spawn openssl pkcs12 -export -out $cpfx -inkey $ckey -in $ccrt
    expect {
    "Enter Export Password:" {send "\r";exp_continue}
    "Verifying - Enter Export Password:" {send "\r"}
    }
    expect eof
    END
    fi
    EOF
     
    chmod +x pem_to_pfx_no_ca.sh
  14. 通过邮件发送证书

    yum -y install mailx expect
     
    cat >> /etc/mail.rc <<EOF
    # 正式邮箱配置
    # 加密连接设置
    set from=sender@abc.com
    #设置SMTP服务器SSL连接
    set smtp=smtps://smtp.abc.com:465
    #设置SMTP服务器登录名
    set smtp-auth-user=smtp@abc.com
    #设置SMTP服务器登录密码
    set smtp-auth-password=pAQc******Qws
    #设置SMTP验证方式
    set smtp-auth=login
    #设置秘钥目录,以下目录为自建目录
    #set nss-config-dir=/etc/mail.rc_ssl.crt
    #验证
    set ssl-verify=ignore
    EOF
     
    cat >> /data/tools/send_mail.sh <<EOF
    # 准备环境
    dm01="abc.com"
    dm02="wx.abc.com"
    cert="wx_certs"
    [ ! -d /data/tools ] && mkdir -p /data/tools
    cd /data/tools
    [ -d ${cert} ] && rm -rf ${cert}
    [ -f ${cert}.zip ] && rm -f ${cert}.zip
    mkdir ${cert}
     
    # 拷贝证书文件
    cp /etc/nginx/certs/x.${dm01}.* /etc/nginx/certs/x.${dm02}.* ${cert}/
     
    # 证书转换,如果异常发邮件通知管理员
    [ ! -f pem_to_pfx_no_ca.sh ] && echo "证书转换脚本缺失!"|mailx -v -s "证书签发异常!" admin@abc.com && exit
    cp -f pem_to_pfx_no_ca.sh ${cert}/tran.sh
    cd ${cert}
    chmod +x tran.sh
     
    # 证书转换-自动交换
    ./tran.sh ${dm01}
    ./tran.sh ${dm02}
     
    # 删除转换脚本
    rm -f tran.sh
     
    # 压缩文件
    cd .. && zip -r ${cert}.zip ${cert}
    # 将证书发给目标邮箱
    echo "新的证书已附于附件中,敬请查收!"|mailx -v -s "eswnd相关证书已更新" -a ${cert}.zip receiver@abc.com
    rm -rf ${cert}*
     
    EOF
  15. 参考文献:


Ably
603 声望44 粉丝

Let everything around us become better