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

发表于

一体化运维管控平台

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

工具 | 大数据系列(5)——Hadoop集群MYSQL的安装

文|指尖流淌 前言 有一段时间没写文章了,最近事情挺多的,现在咱们回归正题,经过前面四篇文章的介绍,已经通过VMware安装了Hadoop的集群环境,相关的两款...

2886
来自专栏有刻

Docker 小记 — MySQL 与 Redis 配置

3997
来自专栏程序你好

SignalR介绍简单示例教程入门版

844
来自专栏Golang语言社区

社区leaf学习笔记|05. 游戏玩家注册、登陆(上)

首先 我们需要增加玩家注册、登陆的协议,消息结构定义在server\msg\msg.go中,但是为了便于查找建议单独建立文件 例如 如下图 建立目录:serve...

671
来自专栏云鼎实验室的专栏

事件分析 | 一起攻击者利用 Redis 未授权访问漏洞进行新型入侵挖矿事件

| 本文作者 hanochzhang、 jaryzhou 近日,腾讯安全云鼎实验室发现一起针对云上服务器利用 Redis 未授权访问漏洞的入侵挖矿事件,和以往...

1151
来自专栏熊二哥

快速入门系列--WCF--07传输安全、授权与审核

这部分主要涉及企业级应用的安全问题,一般来说安全框架主要提供3个典型的安全行为:认证、授权和审核。除了典型的安全问题,对于一个以消息作为通信手段的分布式应用,还...

1709
来自专栏北京马哥教育

解决八种Linux硬盘问题的技巧

#1 - 错误: 设备上无剩余空间 当你的类UNIX系统磁盘写满了时你会在屏幕上看到这样的信息。本例中,我运行fallocate命令然后我的系统就会提示磁盘空间...

5006
来自专栏信安之路

常见端口及安全测试

在渗透测试中,端口扫描是一个非常重要的环节,端口扫描的目的是了解服务器上运行的服务信息,针对不同的端口进行不同的安全测试,本文的主要内容是关于常见端口安全隐患以...

970
来自专栏信安之路

域渗透神器Empire安装和简单使用

关于内网渗透,我们平时基本第一时间想到Metasploit,集信息收集,预渗透,渗透,后渗透,木马,社会工程学于一体的平台,但是Empire就是针对内网的渗透,...

800
来自专栏freesan44

ACP互联网架构认证笔记-EDAS企业级分布式应用服务

EDAS支持语言Java,C++,PHP。EDAS支持Idea,Eclipse;Eclipse插件安装等编译工具。EDAS初级版仅支持应用的部署管理,不支持HS...

1177

扫码关注云+社区