Linux運維之加密/解密原理、自建CA及搭建基於https的Apache

【本次博文的主要內容】html

  • 加密解密基礎;
    web

  • 典型的數據加密算法及加密原理;算法

  • 數字證書及PKIshell

  • 經過Openssl實現私有CA
    vim

  • 自建CA/證書籤署腳本centos


1、加密解密基礎:瀏覽器

一、問題的引入:文件加密的過程是怎樣的?安全

【答】文件加密的過程就是對原來爲明文的文件或數據按照某種算法進行處理,使其成爲不可讀的一段代碼,一般稱爲「密文」。該過程的的逆過程稱爲「解密」。bash

二、網絡安全的三個關鍵目標(CIA):
服務器

spacer.gifwKiom1V5ar6ixKCUAAEYLlRutRk006.jpg

說明:

(1)機密性(Confidentiality):信息不泄露給非受權用戶、實體或過程,或供其利用的特性。

(2)完整性(Integrity):數據未經受權不能進行改變的特性。即信息在存儲或傳輸過程當中保持不被修改、不被破壞和丟失的特性;

(3)可用性(Availability):可被受權實體訪問並按需求使用的特性。即當須要時可否存取所需的信息。例如網絡環境下拒絕服務、破壞網絡和有關係統的正常運行等都屬於對可用性的***;

三、文件加密和數字簽名的應用:

按做用的不一樣,文件加密和數字簽名技術主要分爲以下幾類:

(1)數據傳輸加密技術:對傳輸中的數據流加密,經常使用的方法有線路加密和端對端加密兩種。

(2)數據存儲加密技術:目的是防止在存儲環節上的數據失密,可分爲密文存儲和存取控制兩種。

(3)數據完整性鑑別技術:對介入信息的傳送、存取、處理的人的身份和相關數據內容進行驗證,達到保密的要求(通常包括口令、密鑰、身份、數據等項的鑑別)。

(4)密鑰管理技術:以上三種數據加密技術一般是運用密鑰對數據進行加密,這就涉及了一個密鑰的管理方面。由於用密鑰軟件進行加密時,所用的密鑰一般達到64bit,有的達到256bit。通常不可能徹底用大腦來記住,只能保存在一個安全的地方,這就涉及到了密鑰的管理技術。

四、常見的加密技術:

(1)對稱加密:同時運用一個密鑰進行加密和解密(依賴於密鑰來實現,算法是公開的);

(2)非對稱加密:加密和解密所用的密鑰不同,它有一對密鑰,稱爲「公鑰」和「私鑰」,這一對密鑰必須配對使用(即公鑰加密的文件必須用相應的私鑰才能解密,反之亦然)。最流行的非對稱加密技術是PGP。

經過數學函數來實現(費馬定理、歐拉定理);有興趣的朋友能夠到網上搜索相關資料,這裏不具體闡述。


2、典型的數據加密算法及各自的加密原理:

目前流行的加密標準有4種:DES、MD五、SHA-一、RSA。能夠概括爲兩大類:一、基於「信息摘要」的算法;二、「對稱/非對稱密鑰」;下面進行簡單介紹:

一、基於「信息摘要」的算法:

(1)定義:「信息摘要(Message Digest)是一種能產生特殊輸出格式的算法。這種加密算法的特徵是不管輸入什麼長度的原始數據,通過計算後輸出的密文都是固定長度的。

(2)原理:根據必定的運算規則對原數據進行某種形式的提取,這種提取就是「摘要」,也叫「特徵碼」

(3)特性:單向加密僅支持從明文-->密文,提取數據特徵碼

  • 不管輸入是多大的數據,其輸出是定長的;      

  • 若是輸入的數據同樣,其結果必定同樣;反之,輸入數據微小改變,將引發結果的巨大改變,這種現象稱之爲「雪崩效應」;      

(4)常見的基於「信息摘要」的 算法:md5(message digest),SHA(Secure Hash Algorithm)

  • md5: 不管輸入是多長,輸出爲定長128bits  

  • SHA1: 不管輸入是多長,輸出爲定長160bits      

  • SHA-256: 不管輸入是多長,輸出爲定長256bits      

  • SHA-512: 不管輸入是多長,輸出爲定長512bits 

(5)應用場合:數字簽名(發送方使用單向取得數據特徵碼,並使用本身的私鑰加密此段特徵碼的操做);保證數據的完整性。

MD5應用舉例:Linux系統上的典型應用--保存在/etc/shadow中的用戶密碼  

[root@rhel5 home]# openssl passwd -1 -salt 12345678 redhat
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/
[root@rhel5 home]# openssl passwd -1 -salt 12345678 redhat    
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/  #能夠看到,兩次輸入的salt相同,加密後生成的密碼是相同的哈
[root@rhel5 home]# openssl passwd -1 -salt 12345698 redhat    
$1$12345698$jX8ffqc5lSEfqT.NXmyP2.  #這裏能夠看到,兩次輸入的salt有細微的差異,則生成的密碼差異甚大

二、「對稱/非對稱密鑰」加密算法:

因爲「信息摘要」算法加密的數據僅僅能做爲一種身份驗證的憑據使用,若是咱們要對整個文檔數據進行加密,就不能採用這種「單向加密」的算法。

(1)對稱加密:加密和解密使用同一個密鑰;

最多見的爲:DES(Data Encryption Standard),3DES(3輪DES加密), AES(Advanced Encrption Standard);密鑰管理及分發功能不好;   

【對稱加密的特性】:

  • 不能保證可用性;

  • 不能防止中間人*** ;        

  • 可以保證數據機密性;

問題引入:非對稱加密的必要性--Bob和Alice從未謀面,他們須要在互聯網上進行機密通訊,用對稱加密能夠實現嗎?

答:不能實現哈,這時非對稱加密機制就應運而生了。

(2)非對稱加密:RSA,DSS,ECC

採用DH(密鑰交換算法)算法實現加密;

公鑰是從私鑰提取而來

私鑰加密的數據-->只能經過與之配對的公鑰解密

公鑰加密的數據-->只能經過與之配對的私鑰解密

思考:

Bob使用本身的私鑰加密,其公鑰是公開的,誰都能得到,那有意義嗎?

答:有意義,可以實現身份驗證(該數據用Bob的公鑰加密,只有Bob的私鑰才能解密,即能用公鑰解密則能夠證實該段數據必定是Bob加密的)。

Bob用Alice的公鑰加密,那只有Alice的私鑰才能解密有什麼意義?

答:數據的機密性獲得保證。

RSA:最流行的公鑰加密算法,使用長度可變的密鑰。它是第一個既能用於數據加密也能用於數字簽名的算法。

功能:身份驗證,密鑰交換,機密性

說明:非對稱加密是經過數學函數來實現的,效率較對稱加密低三個數量級


三、公鑰分發(DH算法)原理:wKiom1V5fcORGlCSAAFDkfvsv3Q646.jpg

【算法】:

一、Bob和Alice協商生成公開的兩個大素數q和a;

二、Bob用Xm計算a^Xm%q,結果發給Alice;

三、Alice用Xn計算a^Xn%q,結果發給Bob;

四、Bob用Alice發來的結果計算出結果:(a^Xn%q)^Xm%q=^XnXm%q

五、Alice用Bob發來的結果計算出結果:(a^Xm%q)^Xn%q=^XmXn%q

能夠看到最終的計算結果是相同的。

說明:

  • 在網上傳輸的數據有:兩個素數q、a及中間結果a^Xm%q、a^Xn%q

  • Xm、Xn是私有的,不在網上傳輸(由中間結果逆推出Xm、Xn是不可能的)

  • 此算法的缺陷--沒法防止中間人***。


四、一次完整的傳輸加密解密過程:spacer.gif

wKiom1V-frqSWIKkAAISgOlLo9I240.jpg

發送方:

(1)發送方使用選定的單向加密算法計算原始數據的特徵碼;

(2)發送方使用本身的私鑰加密特徵碼,附加於原始數據後面(數字簽名);

(3)發送方生成一次性對稱密鑰,並使用此密鑰加密數據(原始數據+加密後的特徵碼);

(4)發送方使用接收方的公鑰加密一次性對稱密鑰,附加於加密數據後面

(5)發送;

接收方:

(1)接收方使用本身的私鑰解密加密的一次性對稱密鑰;

(2)使用對稱密鑰解密數據,獲得加密的特徵碼和原始數據;

(3)使用發送方的公鑰解密加密的特徵碼;

(4)使用與發送方相同的單向加密算法從新計算數據的特徵碼,並與解密出的特徵碼作比較

說明:

這個傳輸過程的缺陷是:公鑰在網絡上傳輸時,沒法驗證其可信度,容易被劫持或假裝,所以須要第三方權威認證機構(即CA)


3、數字證書及PKI:

一、數字證書:

(1)數字證書是什麼?

證書其實就是一種數字簽名的聲明,它將公鑰綁定到持有對應私鑰的我的、設備或服務的身份。目前最流行的版本:x.509v3

(2)數字證書的結構:

    版本號(version)

    序列號():證書自己在CA中唯一標識;

    簽名算法標誌

    發行者名稱

    有效期

    證書主體名稱:(組織(主機),我的)

    證書主體公鑰信息

    發行商唯一標誌

    證書主體的唯一標誌

    擴展信息

    簽名

二、PKI(公鑰基礎結構):

(1)PKI是什麼?

Public Key Infrastructure PKI是一種規範,它是使用公開密鑰技術和數字證書來確保系統信息安全,並負責驗證數字證書持有者身份的一種體系。

(2)PKI的組成:

    端實體(申請者)

    註冊機構(RC)

    簽證機構(CA)-->簽證機構(CA):完成交叉信任

    證書撤消列表(CRL)發佈機構

    證書存取庫 

 說明:PKI與CA的關係

不少小夥伴搞不清楚PKI與CA,這裏具體來闡述下:

PKI是一種規範(相似於OSI參考模型),相似於DNS的分佈式結構,以下圖所示:

wKioL1V-geezHKQLAAFFFY7nqaQ874.jpg

CA是PKI的一個機構,專門負責證書的簽署(頒發)。


4、經過Openssl實現私有CA:

互聯網上大多數協議都是明文傳輸的(例如:HTTP、SMTP、POP三、IMAP四、TELNET、FTP等),那如何保證數據傳輸是密文傳輸的呢?

各類加密傳輸技術應運而生:SSL/TLS、SSH、HTTPS、×××等,這些都是面向OSI參考模型不一樣層實現的加密技術。

【各類經常使用協議對應的加密協議】

    http: 80/tcp   https: 443/tcp(在傳輸層之上加了半層)    

    smtp: 25/tcp   smtps: 465/tcp

    pop3: 110/tcp  pops: 995/tcp    

一、SSL/TLS協議:

SSL: Secure Socket Layer(安全套接字層:由網景公司建立),經過一種機制在互聯網上提供密鑰傳輸。其主要目標是保證兩個應用間通訊數據的保密性和可靠性,可在服務器端和用戶端同時支持的一種加密算法。目前主流版本SSLV二、SSLV3(經常使用)。

TLS:Transport Lanyer Security:因爲網景公司的沒落,IETF將SSL進行標準化,1999年公佈了TLS標準文件。

經常使用的版本:TLS v1(與SSL v3基本相同)

【經常使用證書協議】

x509v3: IETF的證書標準

x.500:目錄的標準

SCEP:  簡單證書申請協議,用http來進行申請,數據有PKCS#7封裝,數據其實格式也是PKCS#10的

PKCS#7:  是封裝數據的標準,能夠放置證書和一些請求信息

PKCS#10:  用於離線證書申請的證書申請的數據格式,注意數據包是使用PKCS#7封裝這個數據

PKCS#12:  用於一個單一文件中交換公共和私有對象,就是公鑰,私鑰和證書,這些信息進行打包,加密放在存儲目錄中,CISCO放在NVRAM中,用戶能夠導出,以防證書服務器掛掉能夠進行相應恢復。思科是.p12,微軟是.pfx

二、SSL/TLS的工做原理:

wKiom1V-iNGgk7hDAACdhvk_N70592.jpg

【SSL的會話過程】:

以下圖所示:

wKioL1V-gtqjQdyiAAIL1PAjjkU174.jpg

說明:前提服務器端在本地經過非對稱加密算法生成一對密鑰,並將公鑰信息發送給CA證書頒發機構,CA給服務器端頒發數字證書,並將證書發送至服務器端。    

SSL會話創建過程:   

第一步:客戶端向服務器端創建鏈接請求(TCP/IP);  

第二步:當TCP/IP創建完成後,客戶端和服務器之間協商使用哪一種加密算法,經常使用的如(TSLv1/SSLv2/SSLv3);   

第三步:協商完成後,服務器將公鑰發送給客戶端,客戶端接收公鑰信息;

第四步:客戶端到CA證書頒發機構下載CA公鑰信息,並對服務器端發送的證書作驗證;    

第五步:隨後,客戶端在本地經過對稱加密算法生成密鑰,而後用服務器端發送的公鑰進行對這段密鑰進行加密,發送至服務器端,其保證了數據的機密性;    

第六步:服務器用本身的私鑰對這段數據進行解密,獲得密鑰,而後將客戶端的請求數據進行加密發送給客戶端;

第七步:客戶端接到響應,並用密鑰進行機密,獲得數據;

第八步:通訊結束後,斷開會話通道(TCP/IP) ; 


三、SSL/TLS的開源實現:openssl

(1)openssl的rpm包及命令行工具:

OpenSSL:SSL的開源實現       
    libcrypto:通用加密庫,提供了各類加密函數       
    libssl:TLS/SSL協議的實現,基於會話的、實現了身份認證、數據機密性和會話完整性的TLS/SSL庫       
    openssl:多用途的命令行工具;可以實現私有證書頒發機構;即在公司內部實現身份的驗證;  
openssl:openssl命令行工具       
    genrsa:經過RSA算法,生成密鑰(私鑰和公鑰)       
    req:申請和生成證書       
        -new:生成新的證書      
        -x509:互聯網經常使用的一種標準 
        -in:證書的位置(簽署證書及證書請求經常用到)       
        -out:證書的存放位置       
        -days:證書的有效期限

(2)openssl的配置文件:

[root@Centos CA]# rpm -qc openssl
/etc/pki/tls/openssl.cnf    #配置文件所在位置
[root@Centos CA]# vim /etc/pki/tls/openssl.cnf 
[ CA_default ]
  
dir             = /etc/pki/CA           # CA的默認工做目錄
certs           = $dir/certs            # 所生成的客戶端證書的存放位置
crl_dir         = $dir/crl              # 證書吊銷列表所在位置(這裏的證書都是無效的)
database        = $dir/index.txt        # 存放客戶端的相關證書信息
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # 新頒發證書的存放位置
  
certificate     = $dir/cacert.pem       # CA證書存放的位置
serial          = $dir/serial           # 所頒發證書的序列號
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# CA私鑰的存放位置
RANDFILE        = $dir/private/.rand    # private random number file    
  
x509_extensions = usr_cert              # The extentions to add to the cert

(3)如何申請證書:

一、生成一個私鑰;
    # (umask 077; openssl genrsa -out /path/to/private_key 2048) 
二、製做一個證書籤署請求;
    # openssl req -new -key /path/to/private_key -out /paht/to/certificate.csr 
三、由CA負責簽署證書;
    # openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt -days 365

四、openssl實現私有CA的過程:

【實驗環境】

兩臺虛擬機:一臺CentOS6.4作爲服務器(提供DNS服務、Web服務和CA證書頒發)

CA證書頒發機構並提供HTTP功能     centos6.4     192.168.1.58/24   192.168.1.60/24(用於HTTPS)

客戶端    win7    192.168.1.201/24      DNS指向192.168.1.58

【準備工做】

(1)在CentOS虛擬機上安裝好httpd2.2和DNS服務;

(2)DNS的區域解析庫文件/var/named/webtest.com.zone的內容以下:

wKioL1V-hC6hBdgzAACQnw-sAjE089.jpg

(3)啓動DNS服務;


【如何自建CA】:

# cd /etc/pki/CA/
step1:爲CA生成一個私鑰:
    # (umask 077; openssl genrsa -out private/cakey.pem 2048)
step2:生成自簽證書:
    # openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
    # touch index.txt
    # echo 01 > serial
step3:簽署證書:
    # openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt -days 365
專用客戶端測試工具:
# openssl s_client -connect HOST:PORT -CAfile /path/to/cacertfile|-CApath /paht/to/cacertfiles_dir/ -ssl2|-ssl3|-tls1

【實驗步驟】

step1:用yum安裝openssl:

yum install -y openssl

step2:在CentOS虛擬機上,使用Openssl生成一對密鑰(私鑰和公鑰):

[root@Centos CA]# cd /etc/pki/CA/   
[root@Centos CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)  #建立私鑰,並將權限改成600(一對括弧表示經過子shell執行命令)

step3: 生成自簽證書:

[root@Centos CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650  #生成自簽證書(注意:兩個.pem文件是在配置文件中指定的,名稱不能改)
#說明:
####openssl中有以下後綴名的文件####
    .key格式:私有的密鑰
    .crt格式:證書文件,certificate的縮寫
    .csr格式:證書籤名請求(證書請求文件),含有公鑰信息,certificate signing request的縮寫
    .crl格式:證書吊銷列表,Certificate Revocation List的縮寫
    .pem格式:用於導出,導入證書時候的證書的格式,有證書開頭,結尾的格式

wKioL1V-ilDg9T2AAADdg5ctBAk901.jpg

step4:爲CA準備目錄及文件:

[root@Centos CA]# cd /etc/pki/CA/   
[root@Centos CA]# mkdir -pv certs crl newcerts   #證書存放目錄
[root@Centos CA]# ls
cacert.pem  certs  crl  newcerts  private
[root@Centos CA]# touch index.txt serial crlnumber  #相關證書信息文件
[root@Centos CA]# ls
cacert.pem  certs  crl  crlnumber  index.txt  newcerts  private  serial
[root@Centos CA]# echo 01 > serial  #所頒發證書的序列號
[root@Centos CA]# cat serial 
01

step5:爲Apache2.2安裝mod_ssl模塊提供TLS/SSL功能:

##一、https是經過mod_ssl實現的,所以檢查並安裝mod_ssl:
[root@Centos ~]# ls /etc/httpd/modules/ | grep "mod_ssl"   #默認沒有安裝mod_ssl
[root@Centos ~]# yum list all mod_ssl   #查看mod_ssl的安裝包信息
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
mod_ssl.x86_64                  1:2.2.15-26.el6.centos    
[root@Centos ~]# yum install -y mod_ssl  #安裝mod_ssl
##二、檢查mod_ssl是安裝結果
[root@Centos ~]# rpm -qc mod_ssl
/etc/httpd/conf.d/ssl.conf      #mod_ssl的配置文件存放位置

step6:編輯httpd.conf文件,新建基於IP的虛擬主機,並提供默認主頁面:

##一、編輯httpd.conf,註釋中心主機:
#DocumentRoot "/var/www/html"    #註釋該行
##二、編輯httpd.conf,新建基於IP的虛擬主機:
<VirtualHost 192.168.1.58:80>
        ServerName httpd.webtest.com
        DocumentRoot  /website/httpd/
</VirtualHost>
##三、建立站點目錄:
[root@Centos ~]# mkdir -pv /website/httpd/
mkdir: created directory `/website/httpd/'
[root@Centos ~]# ll -d /website/httpd/
drwxr-xr-x. 2 root root 4096 Jun 12 00:01 /website/httpd/  #成功建立了站點目錄了哈
##四、提供默認主頁面:
[root@Centos ~]# vim /website/httpd/index.html
<h2>httpd.webtest.com:192.168.1.58</h2>   
##五、重啓httpd服務:
[root@Centos ~]# service httpd restart

step7:在win7客戶端瀏覽器中驗證結果:

wKiom1V-hHSQR9LZAADSuG-R8Iw624.jpg

能夠看到,Apache服務正常運行。

step8:爲Apache服務器端配置密鑰並生成證書籤署請求文件:

##一、爲Apache服務器端配置密鑰
[root@Centos ~]# mkdir -pv /etc/httpd/ssl
mkdir: created directory `/etc/httpd/ssl'
[root@Centos ~]# ls /etc/httpd
conf  conf.d  logs  modules  run  ssl   #已然建立了ssl目錄
[root@Centos ~]# cd /etc/httpd/ssl
[root@Centos ssl]# (umask 077;openssl genrsa -out httpd.key 1024)   #爲Apache服務器生成密鑰
[root@Centos ssl]# ls
httpd.key    #密鑰生成了哈(該密鑰文件名可自定義)
##二、生成證書籤署請求文件:
[root@Centos ssl]# openssl req -new -key httpd.key -out httpd.csr  #.csr證書請求文件名可自定義

wKiom1V-iISQiE8WAAFxsBmMm30853.jpg

step9:CA爲Apache服務簽署數字證書:

[root@Centos ~]# cd /etc/httpd/ssl/
[root@Centos ssl]# openssl ca -in httpd.csr -out httpd.crt -days 3650  #CA簽署證書

wKiom1V-hTOjHnxGAAIletLTFIY852.jpg

step10:查看CA的頒發的證書信息:

wKiom1V-iGCh8jyuAADUhGCAbJs918.jpg

step11:配置SSL的主配置文件(/etc/httpd/conf.d/ssl.conf),並在相應的DocumentRoot目錄下建立默認主頁面意:https不支持基於主機名的虛擬主機,僅能支持基於IP的虛擬主機)

##一、找到<VituralHost>虛擬主機配置段,配置以下:
<VirtualHost 192.168.1.60:443>
    DocumentRoot  /website/https
    ServerName    https.webtest.com
##二、找到Server Certificate服務器認證段,配置以下:
SSLCertificateFile /etc/httpd/ssl/httpd.crt  #認證文件改成咱們前面建立的
##三、找到Server Private Key服務器私鑰存放段,配置以下:
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key  #私鑰文件改成咱們前面建立的

step12:重啓httpd服務,並查看相應的443端口是否屬於正常打開狀態:

wKioL1V-h4exhLs8AACXvIZWB9I029.jpg

step13:將CA的公鑰信息下載到win7客戶端並重命名爲cacert.crt,並安裝此證書而後在瀏覽器中測試結果:

wKiom1V-hmSTC9_XAAAviS4V6ug671.jpg


wKiom1V-hjiTXNRVAAKw7Ns-zrg710.jpg

wKioL1V-h-mD2gQpAAGm06tQBPA994.jpg

而後使用https://https.webtest.com驗證是否能夠正常訪問:

wKioL1V-iEWx890aAAEiofT3cgo975.jpg



小結:

一、以一張圖來總結下本次博文的主要內容(該圖片來源於小小忍者的博文:http://xxrenzhe.blog.51cto.com/4036116/1370114

wKiom1V-hviCpIhZAAL0XOoZOzE862.jpg

特別注意:https不支持基於主機名的虛擬主機,僅能支持基於IP的虛擬主機(這是SSL/TLS固有的缺陷)。


二、給出自建CA和證書籤署的腳本(此腳本通過本人測試可用,不盡完善的地方歡迎你們指正!~~):

*********************************自建CA的Shell腳本**************************************************

#!/bin/bash
#########################################################################
# File Name: MakeCA.sh
# Author: 土豆呼叫地瓜
# Email: 229293602@qq.com
# Created Time: 2015年06月15日 星期一
#########################################################################
#設定CA工做目錄
dir=${dir:-/etc/pki/CA}
certs=${certs:-$dir/certs }
crl_dir=${crl_dir:-$dir/crl}
private_key_dir=${private_key_dir:-$dir/private}
new_certs_dir=${new_certs_dir:-$dir/newcerts}   
#自簽證書相關的3個文件
database=${database:-$dir/index.txt}
serial=${serial:-$dir/serial}
crlnumber=${crlnumber:-$dir/crlnumber} 
#私鑰文件(根密鑰)
private_key=${private_key:-$private_key_dir/cakey.pem}
#自簽證書
certificate=${certificate:-$dir/cacert.pem}
#生成CA
makeCA() {
    [ ! -d $dir ] && mkdir -p $dir
    [ ! -d $private_key_dir ]  && mkdir -p $private_key_dir
    # 建立CA私鑰
    if [ ! -f $private_key ];then 
        (umask 077; openssl genrsa -out $private_key 2048)
    fi
    # 生成自簽證書
    if [ ! -f $certificate ];then
        openssl req -new -x509 -key $private_key -out $certificate -days 3650
    fi
    # 生成三個目錄
    [ ! -d $certs -a ! -d $crl_dir -a ! -d $new_certs_dir ] && mkdir -p $certs $crl_dir $new_certs_dir
    # 生成自簽證書相關的3個文件
    touch $database $serial $crlnumber  && echo 01 > $serial
}
makeCA
echo "Make CA successfully.The newCA is $new_certs_dir."

********************************證書籤署的Shell腳本***************************************************

#!/bin/bash
#########################################################################
# File Name: CA_Signed.sh
# Author: 土豆呼叫地瓜
# Email: 229293602@qq.com
# Created Time: 2015年06月15日 星期一
#########################################################################
#Where is the crt saved
read -p "Plz input a path to save the certifacate:" crtDir
#簡單判斷用戶給的目錄名稱是否合法
if [[ ! "$crtDir" =~ ^/.*[[:alnum:]]$ ]];then
    echo "$crtDir is the invalid path."
    echo "The Path should be such as '/path/to/somedir"
    exit 10
fi
#Where is the key saved
cakey=${cakey:-$crtDir/cakey.key}
#Where is the csr saved
csr=${csr:-$crtDir/certreq.csr}
#Where is the crt saved
crt=${crt:-$crtDir/cacert.crt}
#General a private key
if [ ! -d $crtDir ];then
mkdir -p $crtDir
else if [ ! -f $cakey ];then
        (umask 077; openssl genrsa -out $cakey 1024)
     fi
fi
#General .csr file
if [ ! -f $csr ];then
    openssl req -new -key $cakey -out $csr
fi
#Make the certficate
if [ ! -f $crt ];then
    retval=0
    openssl ca -in $csr -out $crt -days 3650
    [ $retval -nt 0 ] && echo "The certificate is created failure." && rm -f $crt
    echo "$crt is created successfully. It is placed in $crtDir."
else
    find $crt -size 0 | xargs rm -f
    echo "$crt is bad, try to create it again."
fi

三、OPENSSL 生成證書的報錯處理:

(1)生成證書報錯爲:

Error:Serial number 01 has already been issued,check the database/serial_file for corruption the matching entry has the fallowing details;

這個錯誤主要是服務器上產生多個證書,須要修改生成證書的序列號;

查看這些信息存放目錄,在文件openssl.cnf文件中

vim /etc/pki/tls/openssl.cnf
[ CA_default ]
dir = /etc/pki/CA

在這個目錄下:serial內容爲00 須要修改當前的數字,使用16進制數字 如 echo 「0E」 > serial 

(2)生成證書錯誤爲:

filed to update database
TXT_DB error number 2

該錯誤解決方法有2種:(1)在CA目錄下,將index.text.addr 中的 unique_subject = yes 修改成 unique_subject = no;(2) 是刪除 index.txt 而後建立一個新的index.txt

相關文章
相關標籤/搜索