小黑的日常折腾-快速建立私有CA的shell脚本

    小黑又开始折腾新的东西了,上周刚学习完openssl建设私有CA,周六就花了点时间写了这个脚本,时间仓促,搞完就去撸DNS了,如果有啥BUG请见谅,本脚本纯属练习,用来练openssl、awk、sed等知识点。

    先来介绍下建设私有CA的简单步骤(以下路劲为默认安装路径):  

(1) 生成私钥;

    ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

(2) 生成自签证书;

~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem  -days 3655

     -new:生成新证书签署请求;

     -x509:生成自签格式证书,专用于创建私有CA时;

     -key:生成请求时用到的私有文件路径;

     -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;

     -days:证书的有效时长,单位是day;

(3) 为CA提供所需的目录及文件;

    ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}

    ~]# touch  /etc/pki/CA/{serial,index.txt}

    ~]# echo  01 > /etc/pki/CA/serial

    本脚本通过分析openssl.conf文件来得到相关路径,再通过命令建设私有CA,自签证书的相关信息通过数组保存通过echo命令传给生成自签证书的命令。具体的脚本内容如下:

#!/bin/bash
#Program:
#      This program is used to creat CA
#History:
#2016/4/9    xiaohei   v1.0
#blog:http://zww577593841.blog.51cto.com/6145493/1750689
#
#私有CA存放目录
# dir 
#已颁发的证书的存放目录
# certs
#已吊销的证书的存放目录
# crl_dir
#新证书的存放目录
# new_certs_dir
#当前证书的序列号保存文件
# serial
#已颁发证书的索引文件
# database
#CA的自签证书
# certificate
#CA的私钥
# private_key
#openssl.conf配置文件的位置
declare  conffile=/etc/pki/tls/openssl.cnf
#定义一个数组保存CA配置文件中需要保存的一些属性名称
declare -a  var
var=("dir" "certs" "crl_dir" "new_certs_dir" "serial" "database" "certificate" "private_key")
#临时文件和目录
declare -a tempfile
tempfile=("./ca_default.txt" "./ca_value.txt")
#必要的文件和目录
declare -a creatfile
declare -a creatdir
creatfile=("serial" "database")
creatdir=("certs" "crl_dir" "new_certs_dir")
#openssl.conf关于CA的相关属性
declare -A ca
#自签证书需要填写的信息:国家(大写的两个字母);省;市;公司;部门;主机名;邮箱(可选)
cainfo=("CN" "Beijing" "Beijing" "blackboy" "ops" "ca.blackboy.com" "blackboy@163.com" )
#信号捕捉
trap  'mytrap' INT
mytrap(){
        clean_temp
        echo -e "\033[31mexit\033[0m"
        exit
}
#清理临时文件和变量及数组
clean_temp(){
        for((i=0;i<${#tempfile[*]};i++));do
                mv -f ${tempfile[$i]}  /tmp/
        done
        unset -v conffile       
        unset -v var    
        unset -v tempfile       
        unset -v ca
        unset -v creatfile
        unset -v creatdir
        unset -v cainfo
}
#分析文件或者目录是否存在       
analyse_file_dir(){
        if   [ -f "$1"  ];then
                echo -e "\033[32mfile $1 exist\033[0m"
                return 0
        elif [  -d "$1"  ];then
                echo -e  "\033[32m$1 is exist\033[0m"
                return 0
        else
                echo -e  "\033[31m$1 is not exist\033[0m"               
                return 1
        fi
}
#创建需要的文件
creat_file(){
        touch "$1"
        analyse_file_dir "$1" &> /dev/null && echo -e "\033[32mcreat $1  successful\033[0m" || return 1
        return 0
}
#创建需要的目录
creat_dir(){
        mkdir -pv "$1"
        analyse_file_dir "$1" &> /dev/null && echo -e "\033[33mcreat $1  successful\033[0m" || return 1
        return 0
}
#分析并获得conffile变量保存的路径所指的openssl.conf文件的一些信息
analyse_conf(){
analyse_file_dir $1 || exit 1
#通过sed获得配置文件自己需要的部分的内容
sed -n  '/\[ CA_default/,/##/s@[#].*@ @gp'  $1   | sed 's/=/ = /g'  > ${tempfile[0]}
#通过awk格式化上步得到内容并保存到临时文件中
awk '/^[^[:space:]]/{a[$1]=$3}END{for(i in a){printf""i"=%s\n",a[i]};}' ${tempfile[0]}  > ${tempfile[1]}
#定义局部变量保存dir项的路径
local dir=$(sed -n 's/^dir=//p' ${tempfile[1]})
#配置文件中$dir代替了dir的路径,还原为其真实路径,并保存在临时文件中
sed -i "s@[$]dir@$dir@g"  ${tempfile[1]}
echo "The current OpenSSL configuration"
cat ./ca_value.txt
echo "#################################"
#把配置文件中查找到的属性信息保存到关联数组中
for((i=0;i<${#var[*]};i++));do
        ca["${var[$i]}"]=$(awk -F"="  '{if($1~/^'${var[$i]}'$/){print $2}}' ${tempfile[1]})
done
}
#创建私钥
creat_private_key(){
        #取文件所在目录名,如果目录不存在则创建
        analyse_file_dir ${1%/*} ||  creat_dir ${1%/*}   || return 1
        #创建私钥,大小为4096,并将创建的私钥文件的权限设置为只有当前用户可读写
        (umask 077; openssl genrsa -out $1 4096)
        #分析私钥是否创建完成
        analyse_file_dir $1 &> /dev/null  && echo -e "\033[32mcreat private key  successful\033[0m "  || return 1
        echo "ok"
        return 0
}
#生成自签证书
creat_cacert(){
        local info
        #生成签发证书时要填写的信息
        for ((i=0;i<${#cainfo[*]};i++));do
                info="$info${cainfo[$i]}\n"
        done
        #签发证书
        echo -e   "$info" |  openssl req -new -x509 -key $1 -out $2  -days 3655
        #分析证书是否正常生成
        analyse_file_dir $2 &> /dev/null  && echo -e "\033[32mcreat cacert  successful\033[0m "  || return 1
}
#如果openssl.conf文件不存在直接退出
analyse_conf  $conffile || exit 1
#创建必要的文件和目录,如果创建失败则退出
for((i=0;i<${#creatfile[*]};i++));do
        analyse_file_dir ${ca[${creatfile[$i]}]} ||  creat_file ${ca[${creatfile[$i]}]} || exit 1
done
for((i=0;i<${#creatdir[*]};i++));do
        analyse_file_dir ${ca[${creatdir[$i]}]} ||  creat_dir ${ca[${creatdir[$i]}]} || exit 1
done
#向证书编号文件serial中添加编号
echo "01 >>>>>  ${ca[serial]}"
echo  "01"  > ${ca[serial]}  
#调用函数创建CA的私钥
creat_private_key ${ca[private_key]} || exit 1
#创建CA自签证书
creat_cacert  ${ca[private_key]} ${ca[certificate]} || exit 1
#查看证书内容
openssl  x509  -in ${ca[certificate]}  -noout  -serial  -subject
#清理安装过程中生成的变量、数组、和临时文件
clean_temp

脚本的运行结果如下:

wKiom1cK-FSBxwehAABzevAcUOA223.png

wKioL1cK-RGgFEfoAACNMscYOKo467.png

    时间仓促,未解释的部分,请见谅。

本文出自 “小黑” 博客,请务必保留此出处http://zww577593841.blog.51cto.com/6145493/1762491

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
深入理解 struct 在 C 语言中,我们通常使用 struct 来表示不同数据类型的结合。当然我们也可以在 struct 中定义函数,在 C++ 中,这是允许的但是不提倡使用,因为有一个比它更好使用的复杂数据类型,叫做类(这在稍后做出介绍)。 使用 struct 的时候有一个问题:在进行一个比较大的项目工程的时候,我们的数据结构的定义和使用可能在不同的文件中,当我们修改了数据结构中的某个成员,那么,使用该数据结构的函数必须修改,而我们并不知道拿下函数使用该种数据结构,这时候我们怎么做?答案很简单,在函
此篇h3c-IRF的实战配置,同样与前面华为的堆叠一样路子,我们先聊聊为啥要做这个?为什么不玩双机,要玩IRF。其实弄懂这一点,对于售前来讲,在外面做方案也是思路相当清晰的一点。 以前我们常规的双机方案如下图: 架构特点: 1.全网无单点故障,完整的解决因为单电源或者单一设备故障引起的业务不可用。 2.核心交换区-使用华为stack堆叠(前面有文章单独介绍) 3.防火墙HA(Juniper-NSRP协议,不懂度娘)(可能大家会问题,防火墙到华为交换机为什么没做lacp或者aggregate,大家注意下防火
HA专题: Corosync+Pacemaker+drbd实现MySQL高可用 大纲 前言 实验拓扑 实验环境 实验步骤 安装前准备工作 配置DRBD 配置MySQL 配置Corosync+Pacemaker 测试 我遇到的问题 总结 前言 上篇文章我们介绍了 drbd 的相关原理、编译安装、简单的实现. drbd 虽然可以保证数据的可靠性但是我们上次的实现还有很多的缺陷,这次我们将 drbd 定义为HA集群的一个资源,可以实现让多个节点自动切换 drbd 的主从模式并结合 MySQL 实现其数据的高可用

在实践中深入理解ARP协议 - 2016-04-18 15:04:18

0.说明 本文为我个人计划撰写的博客专题 《在实践中深入理解常见网络协议》 中关于ARP协议的一篇 , 有兴趣的朋友可以继续关注我的博客,我将会陆续撰写各种协议的实践分析文章。 在同一个网络(无特别说明,均指以太网络)中进行通信的主机,必须要拥有目标主机的MAC地址才能够正确地将数据发送给目标主机,那么如何知道目标主机的MAC地址呢?可以通过ARP协议。ARP协议就是用来获取目标IP地址所对应的MAC地址的,也就是说,ARP协议可以动态地在三层IP地址和二层MAC地址之间建立一种映射关系。可以用如下示意图
昨天把nginx的日志进行了切割,关于如何切割nginx日志,可以查看《 烂泥:切割nginx日志 》这篇文章。 今天打算分析下nginx日志,要分析nginx日志,我们可以通过shell脚本和第三方软件awstats进行分析,在此我们选择的是通过第三方软件awstats进行分析。 要使用awstats分析nginx日志,我们要安装awstats,而在安装awstats之前,我们需要先来介绍下awstats是什么? 一、awstats是什么 awstats是一个免费非常简洁而且强大有个性的基于Perl语言

Linux磁盘管理工具LVM2详解 - 2016-04-18 14:04:52

一、LVM简介 LVM2(LogicalVolume Manage,Version2):它是Linux环境下对 磁盘分区 进行管理的一种机制,将一个或多个底层块设备组织成一个逻辑设备。通过LVM 管理员 可以轻松管理磁盘分区,使用LVM与传统的分区方法相比有很多的优势,如:容量的分配 更加灵活、逻辑卷的扩展和缩减更加方便、使用snapshot(快照)来备份数据也非常方便。通过本文你可 以快速了 解LVM2的使用方法。 二、LVM2 使用详解 (该图片来源于网络) PV:Physical Volume 物理
前几天客户的系统做升级,需要用到 Azure CLI ,客户那边新来的小朋友根据我给的教程连了一个下午都没连上。他告诉我之后,我火速帮他查到底哪出了问题,一直把报错的截图拿过来分析。我自己试了好几次都可以连上没问题。最后的最后,当我找到问题出在哪儿的时候,我简直是一脸小动物。好了,最靠谱的永远是自己。自己写一篇给客户好了。不废话开始做。 使用 Azure CLI 连接到订阅,有一个必要条件,那就是,必须要安装 CLI 。哈哈。 关于安装 CLI 的几种方法,如何安装。可以参考 Microsoft Azur
一台生产业务的虚拟机假死,强行关机后无法POWER ON。在启动时报虚拟机文件被锁定,错误信息如下: 此时对虚机进行迁移、快照等,发现操作不可用。查看虚机状态,发现其在集群内的三台物理主机上来回飘。 解决方法: 1、首先将cluster中的HA功能关闭。如果该功能不关闭,容易造成死锁,,VM不断跳动,,不断的在不同的ESXI内循环被锁,徒劳而无功。 2、虚机磁盘文件被锁,必须要知道到底是哪台ESXI把他给锁住了,这是关键。 3、在VCenter中,把被锁的VM从Inventory中remove掉。原因很简
最近在参与负责某线上MySQL项目时,客户要求 实现SQL数据备份、复原和前滚的全自动 化。 在RHEL平台下 使用Perl语言编写脚本同时结合cron指令 来共同实现,整个过程很轻松顺利且效果也比较满意。 同时,由于所负责的另一个项目是线下DB2环境,那么在 Windows Server平台下又该如何实现DB2数据库备份、复原和前滚的自动化 呢? 因为Windows远没有Linux的命令行功能强大,所以实现起来稍微曲折些,但是基本上还是可以实现的。经过简单的编写和测试通过后,现抽空将实现思路和实验代码分

在实践中深入理解IP协议 - 2016-04-11 18:04:38

0.说明 本文为我个人计划撰写的博客专题 《在实践中深入理解常见网络协议》 中关于IP协议的一篇 ,有兴趣的朋友可以继续关注我的博客,我将会陆续撰写各种协议的实践分析文章。 TCP/IP协议栈其实当然不止有TCP和IP两个协议,但以这两个协议作为这个协议栈的统称,足以体现出其在TCP/IP协议栈中的重要性,正是因为有了IP协议,才使得不同网络间可以进行通信。当然要提及IP协议,其实还需要分析与其相关的配套协议,如ICMP、IGMP、ARP,这些协议与IP协议的关系可如下: 不过这里我们只关注于IP协议中的