专栏首页一体化运维管控平台HTTPS 证书配置一劳永逸

HTTPS 证书配置一劳永逸

HTTPS 是在 HTTP 协议基础之上加了一层 SSL/TLS 安全认证机制,原理功能概括一句即客户端和服务端在非对称密钥通讯中交换临时对称密钥进行的加密数据通信,达到防止数据传输中途被第三方窃取的目的

xg3.gif

背景

HTTPS 证书相关的体系组织是一个商业团体,商人出于利益的需要,把 HTTPS 证书分为各类等级,笼统的说分收费证书和免费证书,但是无论如何技术本质是一样的,所谓收费证书就是在证书发放流程中域名校验环节严格了一些,不过最终目的还是一样,确保你是申请域名证书的拥有者,另外有一点就是需要确认审核发放的证书的下级组织是否有一定公信度,一般来说选择大家熟知的即可,而在不久前 Let’s Encrypt 这个组织宣布支持免费申请泛域名证书了,这个组织是大家公认有可信度的,所以以后 HTTPS 证书的费用就再也不需要了,我们只需要申请免费的证书即可,需要注意的是收费证书一般有效期时间比较长(3-5年),有效期时间越长越不安全,而 Let’s Encrypt 提供的证书只有3个月有效期,也就是说你需要定期更新证书,有效期越短越安全,出于以上背景我们整合资源,给出全自动更新方案,一劳永逸让你的站点证书永不过期

原理

  1. 获取证书(调用 Let’s Encrypt 提供的 API 自动实现对自己域名的校验)
  2. 更新 Web 服务器 HTTPS 证书
  3. 更新 CDN 上相关域名证书配置(调用云服务商提供的 API 完成更新) [可选]
  4. 执行 CRONTAB 任务(每月自动执行一次上面三步骤)

实现一(小矩阵用户)

在小矩阵平台里的 Master 机器 /srv/salt/ssl/ 目录,我们默认有2个域名目录例子

  • example1.com 适用于 Qcloud DNS(dnspod.cn) 上的域名配置
  • example2.com 适用于 Aliyun DNS(net.cn) 上的域名配置

比如我们需要申请 xabcloud.com 在 dnspod.cn 上该域名的泛域名证书,流程如下步骤:(在 Master 机器操作)

1.复制一份例子

cd /srv/salt/ssl;cp -a example1.com xabcloud.com

2.编辑 /srv/salt/ssl/xabcloud.com/acme.sh 更新前面2行的 token 信息(从 dnspod.cn 站点用户中心那里获得,见下图)

export DP_Id="12345"
export DP_Key="u4io94fe08cbc67ach8888"

3.执行生成证书,默认会在 /srv/salt/ssl/CA/ 目录下生成对应的域名证书文件,其中 .pem 文件即证书 .key 文件为服务端的私钥,这两个文件将部署在 Web 服务器和 CDN 上,比如 Nginx 上 server {} 配置段里

cd /srv/salt/ssl/xabcloud.com/
./acms.sh --issue --dns dns_dp -d xabcloud.com -d *.xabcloud.com --force(2分钟左右就可以拿到信任证书)

4.配置自动执行任务(因为 xabcloud.com 域名在 dnspod.cn 上,所以下面注释了 Aliyun 相关设置,根据需要使用对应的配置),完成三件事

  • 设定每月的7号申请新的证书(申请 xabcloud.com 的证书)
  • 调用 CDN API 更新 CDN 域名证书信息(更新 src.xabcloud.com 和 s.xabcloud.com 这两个 CDN 站点域名的证书配置)
  • 执行 salt -N Nginx state.apply group.Nginx 模版管理下发更新 Web 服务器证书(更新 xabcloud.com 站点的 Nginx 分组服务器集群证书)
# cat /opt/sys/cron.sh

#!/bin/bash
#*************************************************
# Description : CA UPDATE
# Version     : 1.0
# Author      : XABCLOUD.COM
#*************************************************
#-----------------VAR-----------------------------
SSL=/srv/salt/ssl
CA=/srv/salt/ssl/CA
Qdns="xabcloud.com"
Adns="example1.com example2.com"
Qcdn="src.xabcloud.com s.xabcloud.com"
Acdn="xxx.example1.com yyy.example1.com"
#-----------------FUN-----------------------------
ACME(){
        if [ $(date +"%d") = "07" ];then

                # Qcloud DNS
                for domain in $Qdns
                do
                        cd $SSL/$domain;./acme.sh --issue --dns dns_dp -d $domain -d *.$domain --force
                done

                # Aliyun DNS
                #for domain in $Adns
                #do
                #        cd $SSL/$domain/;./acme.sh --issue --dns dns_ali -d $domain -d *.$domain --force
                #done

                # Update Qcloud CDN
                key=$(cat $CA/xabcloud.com.key|base64)
                pem=$(cat $CA/xabcloud.com.pem|base64)
                for domain in $Qcdn
                do
                        /opt/sys/qcloud-cdn.py SetHttpsInfo --host $domain --privateKey "$key" --cert "$pem" 
                done

                # Update Aliyun CDN
                #key=$(cat $CA/example1.com.key)
                #pem=$(cat $CA/example1.com.pem)
                #for domain in $Acdn
                #do
                #        /opt/sys/aliyun-cdn.py Action=SetDomainServerCertificate DomainName=$domain ServerCertificateStatus=on PrivateKey="$key" ServerCertificate="$pem"
                #done

                # Update Web Server
                salt --async -N Nginx state.apply group.Nginx

                # End
                find $CA -type f ! -name "*.pem" -a ! -name "*.key" -delete
        fi
}
main(){
        ACME
}
#-----------------PROG----------------------------
main

!> 请留意腾讯云 API 证书私钥内容以 Base64 编码后传输,而阿里云 API 是直接原内容传输(网络交换数据时,比如从A地到B地,一般要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,一些不可见字符有可能被处理错误,导致数据失真,先把数据 Base64 编码,统一为可见字符,可以减少错误概率)

5.添加 crontab 每月7号夜里执行的任务,完成 HTTPS 证书永不过期一劳永逸的目的

#crontab -e 

* 3 7 * * /opt/sys/cron.sh &>/dev/null

实现二(非小矩阵用户)

以我们官网 xabcloud.com 举例子,我们官网部署在一台 CentOS 7 机器一个普通用户目录下,部署结构规划如下:

  • Web Server ( OpenResty 部署在 /home/xabc/0/ )
  • App Server ( 文档部署在 /home/xabc/1/ )
  • DB Server ( Redis 部署在 /home/xabc/2/ )
  • 工具 ( /home/xabc/bin/ )
  • 配置 ( /home/xabc/etc/ )
  • 日志 ( /home/xabc/log/ )
  • 证书生成 ( /home/xabc/ssl/ )

官网 nginx.conf

server{
        listen 80;
        server_name xabcloud.com www.xabcloud.com;
        return 301 https://$host$request_uri;
}
server{
        listen 443 ssl http2;
        server_name xabcloud.com www.xabcloud.com;
        ssl_certificate /home/xabc/etc/openresty/ssl/xabcloud.com.pem;
        ssl_certificate_key /home/xabc/etc/openresty/ssl/xabcloud.com.key;
        ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        location /{
                root /home/xabc/1/docs;
        }
}

每天夜里 /home/xabc/bin/cron.sh 任务执行一次(每月7号申请证书,更新本地 Web Server 证书,更新 CDN 域名证书配置)

#!/bin/bash
#*************************************************
# Description : CRON
# Version     : 1.0
# Author      : XABCLOUD.COM
#*************************************************
#-----------------VAR-----------------------------
HOME=/home/xabc
BIN=$HOME/bin
SSL=$HOME/ssl
CA=$HOME/etc/openresty/ssl
LOG=$HOME/0/openresty/nginx/logs
#-----------------FUN-----------------------------
LOG(){
        if [ $(date +"%H") = "00" ];then
                mv $HOME/log/access.log $HOME/log/$(date -d "yesterday" +"%Y-%m-%d").log
                kill -USR1 $(cat $LOG/nginx.pid)
        fi
}
ACME(){
        if [ $(date +"%d") = "07" ];then
                for domain in xabcloud.com
                do
                        cd $SSL/$domain;./acme.sh --issue --dns dns_dp -d $domain -d *.$domain --force
                done
                $HOME/0/openresty/nginx/sbin/nginx -s reload
                key=$(cat $CA/xabcloud.com.key|base64)
                pem=$(cat $CA/xabcloud.com.pem|base64)
                for domain in src.xabcloud.com s.xabcloud.com
                do
                        $BIN/qcloud-cdn.py SetHttpsInfo --host $domain --privateKey "$key" --cert "$pem"
                done
                find $CA -type f ! -name "*.pem" -a ! -name "*.key" -delete
        fi
}
main(){
        LOG
        ACME
}
#-----------------PROG----------------------------
main

资源

上面自动化更新所依赖的相关资源如下:

参考 Let’s Encrypt Acme.sh 腾讯云 API 阿里云 API

原文链接:https://xabcloud.com/#/ssl

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如果云主机太多,运维管理麻烦的话,了解下我们的运维平台

    小矩阵一体化运维平台解决企业云上或者自建数据中心大量主机高效安全运维管控的问题,支持多个独立网络节点主机管理,即支持多云统一管控

    ywgx
  • ELK分析ngx_lua_waf软件防火墙日志

    https://github.com/loveshell/ngx_lua_waf

    三杯水Plus
  • 教你彻底关闭win10的自动更新

    最近的windows10更新是越来越可怕了。不仅常驻后台偷吃资源和网络,还不让关闭。比如下面

    短短的路走走停停
  • 迈向基于系统工程的汽车产品工程流程(CS SE)

    现有汽车产品开发中的不足和冗余阻碍了基于系统工程的开发。在本文中,我们讨论了一种方法程序,以消除现有产品开发中的缺陷,进而能够引入一种新的基于系统工程的开发方法...

    Rosalie
  • 银行铁饭碗VS年薪30W,应该怎么选?

    比如“是金子哪里都会发光”VS“选择决定命运”。如果问现在从事大数据行业月薪20k的我,我会说金子只有在对的地方才会发光,而选择真的可以改变命运。

    CDA数据分析师
  • pip安装第三方模块Read time out解决办法

    一、 遇到问题 1.有些小伙伴在用pip安装selenium时候报 Read time out > HTTPSConnectionPool(host='py...

    上海-悠悠
  • mydumper安装笔记

    参考:http://www.tuicool.com/articles/2eAVVvN

    二狗不要跑
  • VB6 连接SQLite小型数据库

    巴西_prince
  • 工业4.0时代打造智能制造体系(转)

    用户5495712
  • vue+element踩坑记-checkbox的全选和全不选的操作实现

    在做一个业务的时候,有一个需求是多个条件进行筛选,全部是checkbox的筛选条件,可以进行任意一个的选择还可以进行全选和全不选,这样进行表格的筛选

    何处锦绣不灰堆

扫码关注云+社区

领取腾讯云代金券