安装包
yum -y install ftp expect
- 阿里云账号配置
登录阿里云账号
之后,依次点击:访问控制
->用户
->新建用户
登陆名:ds
(可自行更改)
显示名:ds
(可自行更改)
访问方式:编程式访问
添加权限:AliyunDNSFullAccess
获得新用户的AccessKey ID
、AccessKeySecret
准备要签发证书的域名
如abc.com
,表示要签发的通配符证书适用于域名abc.com
和*.abc.com
;
注意:每一行只能一个域名!cat > /data/tools/dns << EOF abc.com wx.abc.com yz.abc.com EOF
创建文件夹,下载压缩包,解压,创建链接
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
环境准备:环境变量,常用命令自定义
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
使环境变量生效
source /etc/profile.d/lego_env.sh
证书生成脚本
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
新增域名,生成证书
cat > /data/tools/add_new.sh <<EOF cat dns | grep ^$1$ > /dev/null && echo 证书已存在 && exit cat >> dns << EOF $1 EOF ./rec_cert.sh EOF
将脚本通过FTP拷贝到目标服务器
目标服务器配置的FTP Server信息(需要替换):
地址:192.168.16.8
端口:12358
用户名:UserName
密码:UserPwdcat >> /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
计划任务,添加任务,启动服务,添加开机启动,查看服务状态
echo 0 0 1 * * /data/tools/auto_copy.sh >> /etc/crontab systemctl start crond & systemctl enable crond & systemctl status crond
- 目标服务器
需要使用FileZilla Server搭建FTP服务器,配置证书、用户名、密码、用户目录(作为证书的专用目录)和对应权限;
根据自己的情况,查看是直接配置证书路径还是再加一层同步操作。
定期重启web服务,确保最新的证书生效。
配置FileZilla Server请参照另一篇文章《用FileZilla搭建FTP服务器及相关问题》 当证书签发服务与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
证书格式转换
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
通过邮件发送证书
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
参考文献:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。