歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 使用Shell腳本自動構建OpenSSL的CA等

使用Shell腳本自動構建OpenSSL的CA等

日期:2017/3/3 16:12:31   编辑:關於Linux

其實此前也寫過,但當時僅實現了自動創建CA自簽發證書等文件,近來時間頗為寬裕,加上這個東東的用處又幾乎無所不在,因此,又在其基礎上做了些修修補補。

實現功能:

1、全自動創建CA私有機構和測試證書一套

2、在已有的CA自簽發證書或測試證書的基礎上,進行幾項調整或重新創建或給其他申請簽發等

考慮到代碼略多,因此本文先做詳細使用介紹,然後再粘貼代碼及上傳附件,心急代碼的同學,可以直接向下拉查看或下載附件。

環境: rhel5.8 32bit openssl為光盤yum源安裝

用法:

command [option]

可以不用選項,且選項也不多,否則就失去腳本的意義了,使用部分有詳細介紹

/etc/sysconfig/mos_ca.conf :配置文件,可做自定義調整,也可不用,腳本皆有默認值

一、獲取腳本,給執行權限,移動到系統路徑,直接執行即可生成CA自簽發和演示證書:其會在/etc/pki/CA/裡面生成自簽發所需的所有文件,會在/opt/mos_demo目錄內生成一套演示證書(其功能完全可用),操作如下:

[root@test scripts]# chmod 700 mos_ca.sh  
[root@test scripts]# ll mos_ca.sh  
-rwx------ 1 root root 3.3K Jan  8 12:24 mos_ca.sh 
[root@test scripts]# cp mos_ca.sh /bin/mos_ca 
[root@test scripts]# mos_ca     # 執行到此已OK,下列操主要就是檢查結果 
[root@test scripts]# ls /etc/pki/CA/        #查看生成的CA自簽署文件 
cacert.pem      crl/            index.txt.attr  newcerts/       serial           
certs/          index.txt       index.txt.old   private/        serial.old       
[root@test scripts]# openssl x509 -text -in /opt/mos_demo/demo.   #查看生成的演示證書 
demo.crt  demo.csr  demo.key   
[root@test scripts]# openssl x509 -text -in /opt/mos_demo/demo.crt  #查看剛才腳本簽署的證書 
Certificate: 
    Data: 
        Version: 3 (0x2) 
        Serial Number: 1 (0x1) 
        Signature Algorithm: sha1WithRSAEncryption 
        Issuer: C=CN, ST=Henan, L=Zhengzhou, O=Youguess, OU=Tech, CN=ca.mos.com/[email protected] 
        Validity 
            Not Before: Jan  8 05:54:52 2013 GMT 
            Not After : Jan  8 05:54:52 2014 GMT 
        Subject: C=CN, ST=Henan, O=Youguess, OU=Tech, CN=demo.mos.com 
.......

二、當系統已有CA自簽署和演示證書已存在時,再次執行腳本,會提示是否將原來的文件,以時間命名備份到其當前目錄,具體如下

[root@test opt]# mos_ca  
CA existe,Continue? y: Move file; n-> Quit. [y|n] y  #輸入y移動文件,n退出
Demo certificate existe, Continue? y: Move file; n: Quit. [y|n] y  #同上
[root@test opt]# ls /etc/pki/CA/ 
2013-01-08-13:54:48tmp/ crl/                    index.txt.old           serial                   
cacert.pem              index.txt               newcerts/               serial.old               
certs/                  index.txt.attr          private/                 
[root@test opt]# ls /etc/pki/CA/2013-01-08-13\:54\:48tmp/ 
cacert.pem      crl/            index.txt.attr  newcerts/       serial           
certs/          index.txt       index.txt.old   private/        serial.old 
[root@test opt]# ls /opt/mos_demo/ 
2013-01-08-13:54:51tmp/ demo.crt                demo.csr                demo.key                 
[root@test opt]# ls /opt/mos_demo/2013-01-08-13\:54\:51tmp/demo. 
demo.crt  demo.csr  demo.key

三、給一個自定義域名簽發證書,使用 -n 選項,需要注意的是,操作之前,一定要修改/etc/sysconfig/mos_ca.conf中的Dhost=“你的域名”,若直接使用 -n 的話,當前CA是無法簽發的,因為其和演示證書的域名內容相同是不被允許的,就像真正的CA不能為一個域名頒發兩個證書給不同的客戶。演示如下:

[root@test scripts]# grep -Ev "^$|^#" /etc/sysconfig/mos_ca.conf 
Dname=mos       # 新創建的證書,其名字已mos開頭 
Dhost=www.mos.com       # 為這個域名頒發 
[email protected]     # 定義其郵件地址 
[root@test scripts]# ll /opt/mos_demo/ 
[root@test scripts]# mos_ca -n 
2013-01-08-13:54:51tmp/ demo.csr                mos.crt                 mos.key                  
demo.crt                demo.key                mos.csr 
[root@test scripts]# openssl x509 -text -in /opt/mos_demo/mos.crt   #查看剛才簽發新證書 
Certificate: 
    Data: 
        Version: 3 (0x2) 
        Serial Number: 2 (0x2) 
        Signature Algorithm: sha1WithRSAEncryption 
        Issuer: C=CN, ST=Henan, L=Zhengzhou, O=Youguess, OU=Tech, CN=ca.mos.com/[email protected] 
        Validity 
            Not Before: Jan  8 06:14:00 2013 GMT 
            Not After : Jan  8 06:14:00 2014 GMT 
        Subject: C=CN, ST=Henan, O=Youguess, OU=Tech, CN=www.mos.com 
..................

四、使用 -s 選項,生成不簽署的證書,用以給向別的CA機構申請,需要在配置文件中修改其國家、省份\州、城市、公司、部分、域名、郵件。操作如下:

[root@test scripts]# grep -Ev "^$|^#" /etc/sysconfig/mos_ca.conf    #配置文件,做如下修改 
Cny=CN          #國家 
Pve=Henan       #省份/州 
Cty=Zhengzhou   #城市 
Bis=Youguess        #公司 
Bnh=Tech        #部門 
Dname=tech      #證書名字以此開頭 
Dhost=tech.test.com  # 要申請的證書域名 
[email protected]   # 其郵件地址 
[root@test scripts]# mos_ca -s
[root@test scripts]# ls /opt/mos_demo/tech. 
tech.csr  tech.key

五、使用 -o 給已有的csr證書簽發請求文件簽發,需要再配置文件中指定路徑和部分名字,例如,證書的絕對路徑為:/opt/mos_demo/tech.csr ,在配置文件中,去掉.csr即可,如:/opt/mos_demo/tech。為剛才沒簽發的證書簽發。(再提醒一下,私有CA簽發需要合csr中填寫的國家、省份、城市、公司、部門保持一致。)操作如下:

[root@test scripts]# grep Other /etc/sysconfig/mos_ca.conf 
Other=/opt/mos_demo/tech 
[root@test scripts]# mos_ca -o
[root@test scripts]# ll /opt/mos_demo/tech. 
tech.crt  tech.csr  tech.key        # 簽發後生成的crt文件已出現,查看內容如下: 
[root@test scripts]# openssl x509 -text -in /opt/mos_demo/tech.crt  
Certificate: 
    Data: 
        Version: 3 (0x2) 
        Serial Number: 3 (0x3) 
        Signature Algorithm: sha1WithRSAEncryption 
        Issuer: C=CN, ST=Henan, L=Zhengzhou, O=Youguess, OU=Tech, CN=ca.mos.com/[email protected] 
        Validity 
            Not Before: Jan  8 06:49:53 2013 GMT 
            Not After : Jan  8 06:49:53 2014 GMT 
        Subject: C=CN, ST=Henan, O=Youguess, OU=Tech, CN=tech.test.com 
...................

六、 使用CA選項,重新配置並生成CA,但不創建測試證書,需要先在配置文件中修改自簽發CA的各項屬性(國家、省份、城市、公司、部門、域名、郵件等,當然,也可不配置,仍會重新生成,舊的被移動保存)。操作如下:

[root@test mos_demo]# grep -Ev "^$|^#" /etc/sysconfig/mos_ca.conf 
Dir=/etc/pki/CA/        # 自簽發CA文件所在的目錄,一般不要改動 
Cny=CN          #國家 
Pve=Henan       #省份/州 
Cty=Zhengzhou   #城市 
Bis=Youguess        #公司 
Bnh=Tech        #部門 
Host=ca.mos.com  #私有CA中心的域名 
[email protected]   #私有CA中心的郵件地址 
[root@test mos_demo]# mos_ca CA 
CA existe,Continue? y: Move file; n-> Quit. [y|n] y     #移動原CA中心文件 
[root@test mos_demo]# ll /etc/pki/CA/       #可以看到,原CA文件,以被到時間臨時目錄內 
2013-01-08-15:01:12tmp/ certs/                  index.txt               private/                 
cacert.pem              crl/                    newcerts/               serial

七、其實沒了,但還有配置文件沒說,腳本有默認值,配置文件可以沒有,但是如果需要更詳細的調整,需要手動創建配置文件,以及裡面的具體參數。若不需要使用其相關參數,使用#注釋即可;若要使用,需刪除行首井號"#"。操作和注解如下:

[root@test mos_demo]# cat /etc/sysconfig/mos_ca.conf  
#----------------------------------# 
#Cnf=/etc/pki/tls/openssl.cnf       #openssl的配置文件,對於下面的國家,省份的信息,就是使用sed對配置文件做的修改,一般默認即可, #Dir=/etc/pki/CA/    # CA私有機構所需文件所在目錄,一般默認即可 
Cny=CN      # 國家,對CA自簽發證書剩下,也對創建申請證書生效,腳本內默認為CN 
Pve=Henan   # 省份/州,默認Henan(河南)同上 
Cty=Zhengzhou   # 城市,默認Zhengzhou(鄭州), 同上 
Bis=Youguess        # 公司名字,默認 Youguess(你猜),  同上 
Bnh=Tech        # 部門,默認Tech(技術部),同上 
#----------------------------------# 
Host=ca.mos.com     # CA私有機構的域名,其實上面已經介紹過了 
[email protected] # CA私有機構的郵箱 
#----------------------------------# 
#Ddir=/opt/mos_demo/    # 創建證書的默認位置,不存在的話,會自動創建 
#Dname=tech     # 以tech為名字創建證書相關文件 
#Dhost=tech.test.com  # 請求簽發證書的域名 
#[email protected]   # 請求簽發證書的郵箱 
#----------------------------------# 
#Other=/opt/mos_demo/tech  #申請簽發證書tech.csr所在的絕對路徑,但不包含擴展名。

代碼如下:

01.#!/bin/bash 
02.# Author: MOS
03.# Script name: mos_ca.sh
04.# Date & Time: 2013-01-06/23:05:35
05.# Version: 1.0.2
06.# Description:
07.#
08.[ -f /etc/sysconfig/mos_ca.conf ] && . /etc/sysconfig/mos_ca.conf
09.Config(){
10.Cnf=${Cnf:-/etc/pki/tls/openssl.cnf}
11.cp $Cnf $Cnf.`date +%F-%T`.bak
12.Dir=${Dir:-/etc/pki/CA/}
13.Cny=${Cny:-CN}
14.Pve=${Pve:-Henan}
15.Cty=${Cty:-Zhengzhou}
16.Bis=${Bis:-Youguess}
17.Bnh=${Bnh:-Tech}
18.sed -i "s@\(^dir.*=[[:space:]]\).*@\1$Dir@g" $Cnf
19.sed -i "s@\(^countryName_default.*=[[:space:]]\).*@\1$Cny@g" $Cnf
20.sed -i "s@\(^stateOrProvinceName_default.*=[[:space:]]\).*@\1$Pve@g" $Cnf
21.sed -i "s@\(^localityName_default.*=[[:space:]]\).*@\1$Cty@g" $Cnf
22.sed -i "s@\(^0.organizationName_default.*=[[:space:]]\).*@\1$Bis@g" $Cnf
23.sed -i "s@^#\(organizationalUnitName_default\([[:space:]]\)=\)@\1 $Bnh@g" $Cnf
24.}
25.
26.Create_CA(){
27.Dir=${Dir:-/etc/pki/CA/}
28.[ ! -d ${Dir}crl ] && mkdir -pm 700 ${Dir}crl
29.[ ! -d ${Dir}newcerts ] && mkdir -pm 700 ${Dir}newcerts
30.[ ! -d ${Dir}certs ] && mkdir -pm 700 ${Dir}certs
31.[ ! -f ${Dir}index.txt ] && touch ${Dir}index.txt
32.[ ! -f ${Dir}serial ] && echo 01 > ${Dir}serial
33.[ ! -d ${Dir}private ] && mkdir -pm 700 ${Dir}private
34.(umask 077; openssl genrsa -out ${Dir}private/cakey.pem 2048 &> /dev/null )
35.#read -p "Please input CA hostname [default:ca.mos.com]: " Host
36.Host=${Host:-ca.mos.com}
37.#read -p "Please input CA E-mail [default]:[email protected]]: " Em
38.Em=${Em:[email protected]}
39.echo -e "\n\n\n\n\n${Host}\n${Em}\n"|openssl req -x509 -new -key ${Dir}private/cakey.pem -out ${Dir}cacert.pem -days 3650 &> /dev/null
40.}
41.
42.Create(){
43.Dir=${Dir:-/etc/pki/CA/}
44.Date=`date +%F-%H:%M:%S`
45.[ ! -f /etc/pki/CA/private/cakey.pem ] && Create_CA && return 0
46.if [ -f /etc/pki/CA/private/cakey.pem ];then
47. read -p "CA existe,Continue? y: Move file; n-> Quit. [y|n] " Choice
48. if [[ "$Choice" == "y" ]];then
49. [ ! -d "$Dir""$Date"tmp ] && mkdir -p "$Dir""$Date"tmp
50. mv "$Dir"* "$Dir""$Date"tmp/ &> /dev/null
51. Create_CA
52. elif [[ "$Choice" == "n" ]];then
53. exit 0
54. else
55. echo "Error input..."
56. exit 1
57. fi
58.fi
59.}
60.
61.Create_crt(){
62.(umask 077;openssl genrsa 1024 > "$Ddir""$Dname".key) &> /dev/null
63.echo -e "\n\n\n\n\n"$Dhost"\n"$DE"\n\n\n"|openssl req -new -key "$Ddir""$Dname".key -out "$Ddir""$Dname".csr &> /dev/null
64.[[ $Set != "-s" ]] && echo -e "y\ny\n"|openssl ca -in "$Ddir""$Dname".csr -out "$Ddir""$Dname".crt -days 365 &> /dev/null && exit 0
65.[[ $Set == "-s" ]] && exit 0
66.}
67.
68.Demo_crt(){
69.Ddir=${Ddir:-/opt/mos_demo/}
70.Dname=${Dname:-demo}
71.Dhost=${Dhost:-demo.mos.com}
72.De=${De:[email protected]}
73.Date=`date +%F-%H:%M:%S`
74.[ ! -d $Ddir ] && mkdir -p $Ddir &> /dev/null
75.[[ ! -f "$Ddir""$Dname".key && ! -f "$Ddir""$Dname".csr ]] && Create_crt && exit 0
76.if [[ -f "$Ddir""$Dname".key || -f "$Ddir""$Dname".csr || -f "$Ddir""$Dname".crt ]];then
77. read -p "Demo certificate existe, Continue? y: Move file; n: Quit. [y|n] " Cie
78. if [[ "$Cie" == "y" ]];then
79.[ ! -d "$Ddir""$Date"tmp ] && mkdir -p "$Ddir""$Date"tmp && mv "$Ddir""$Dname"* "$Ddir""$Date"tmp/ &> /dev/null
80. Create_crt
81. exit 0
82. elif [[ "$Cie" == "n" ]];then
83. exit 0
84. else
85. echo "Error input..."
86. fi
87.fi
88.}
89.
90.Set=$1
91.if [[ $Set =~ (-n)|(-o)|(-s)|(CA) && -z $2 || -z $Set ]];then
92. [ -z $Set ] && Config && Create && Demo_crt && exit 0
93. [ $Set = -n ] && Demo_crt && exit 0
94. [ $Set = -s ] && Config && Demo_crt && exit 0
95. [ $Set = CA ] && Config && Create && exit 0
96. [ $Set = -o ] && echo -e "y\ny\n"|openssl ca -in "$Other".csr -out "$Other".crt -days 365 &> /dev/null
97.else
98. echo "Error,Invalid option!"
99. exit 1
100.fi

 

Copyright © Linux教程網 All Rights Reserved