openSSL命令、PKI、CA、SSL證書原理

轉自:http://blog.csdn.net/gui694278452/article/details/46373319html

目錄web

1. PKI、CA簡介
2. SSL證書
3. SSL證書生成、openSSL學習 
4. CA中心搭建、SSL證書生成過程

1. PKI、CA簡介算法

PKI(Public Key Infrastructure)即"公鑰基礎設施",是一種遵循既定標準的密鑰管理平臺,它可以爲全部網絡應用提供加密和數字簽名等密碼服務及所必需的密鑰和證書管理體系,簡單來講,PKI就是利用公鑰理論和技術創建的提供安全服務的基礎設施。PKI技術是信息安全技術的核心,也是電子商務的關鍵和基礎技術。數據庫

PKI是Public Key Infrastructure的縮寫,是指用公鑰概念和技術來實施和提供安全服務的具備普適性的安全基礎設施。這個定義涵蓋的內容比較寬,原則上說,任何以公鑰技術爲基礎的安全基礎設施都是PKI。固然,沒有好的非對稱算法和好的密鑰管理就不可能提供完善的安全服務,也就不能叫作PKI。也就是說,該定義中已經隱含了必須具備的密鑰管理功能。apache

PKI既不是一個協議,也不是一個軟件,它是一個標準,在這個標準之下發展出的爲了實現安全基礎服務目的的技術統稱爲PKI

PKI主要由如下組件組成vim

1. 認證中心CA(證書籤發) 
CA是PKI的"核心",即數字證書的申請及簽發機關,CA必須具有權威性的特徵,它負責管理PKI結構下的全部用戶(包括各類應用程序)的證書,把用戶的公鑰和用戶的其餘信息捆綁在一塊兒,在網上驗證用戶的身份,CA還要負責用戶證書的黑名單登記和黑名單發佈 

2. X.500目錄服務器(證書保存) 
X.500目錄服務器用於"發佈"用戶的證書和黑名單信息,用戶可經過標準的LDAP協議查詢本身或其餘人的證書和下載黑名單信息。

3. 具備高強度密碼算法(SSL)的安全WWW服務器(即配置了HTTPS的apache) 
Secure socket layer(SSL)協議最初由Netscape 企業發展,現已成爲網絡用來鑑別網站和網頁瀏覽者身份,以及在瀏覽器使用者及網頁服務器之間進行加密通信的全球化標準。

4. Web(安全通訊平臺)
Web有Web Client端和Web Server端兩部分,分別安裝在客戶端和服務器端,經過具備高強度密碼算法的SSL 協議保證客戶端和服務器端數據的機密性、完整性、身份驗證。

5. 自開發安全應用系統 自開發安全應用系統是指各行業自開發的各類具體應用系統,例如銀行、證券的應用系統等。完整的PKI包括:
    1) 認證政策的制定,包括
        1.1) 遵循的技術標準
        1.2) 各CA 之間的上下級或同級關係
        1.3) 安全策略
        1.4) 安全程度
        1.5) 服務對象
        1.6) 管理原則和框架等
    2) 認證規則
    3) 運做制度的制定
    4) 所涉及的各方法律關係內容
    5) 技術的實現等

認證中心CA做爲PKI的核心部分,CA實現了PKI 中一些很重要的功能瀏覽器

1. 接收驗證最終用戶數字證書的申請
2. 肯定是否接受最終用戶數字證書的申請-證書的審批
3. 向申請者頒發、拒絕頒發數字證書-證書的發放
4. 接收、處理最終用戶的數字證書更新請求-證書的更新
5. 接收最終用戶數字證書的查詢、撤銷
6. 產生和發佈證書廢止列表(CRL)
7. 數字證書的歸檔
8. 密鑰歸檔
9. 歷史數據歸檔

在這麼多功能中,CA的核心功能就是"發放"和"管理"數字證書,同時這也是PKI的核心安全

圖2 典型CA框架模型

典型CA框架模型 服務器

安全服務器面向普通用戶,用於提供:
    1) 證書申請
    2) 瀏覽
    3) 證書撤消列表
    4) 證書下載等安全服務
安全服務器與用戶的的通訊採起安全信道方式(如SSL的方式,不須要對用戶進行身份認證)。用戶首先獲得安全服務器的證書(該證書由CA頒發),而後用戶與服務器之間的全部通訊,包括用戶填
寫的申請信息以及瀏覽器生成的公鑰均以安全服務器的密鑰進行加密傳輸,只有安全服務器利用本身的私鑰解密才能獲得明文,這樣能夠防止其餘人經過竊聽獲得明文。從而保證了證書申請和傳輸
過程當中的信息安全性。

2. CA服務器
CA服務器是整個證書機構的核心,負責:
    1) 證書的簽發
        1.1) 產生自身的私鑰和公鑰(密鑰長度至少爲1024位)
        1.2) 而後生成根數字證書,而且將數字證書傳輸給安全服務器
    2) CA還負責爲操做員、安全服務器以及註冊機構服務器生成數字證書。安全服務器的數字證書和私鑰也須要傳輸給安全服務器
CA服務器是整個結構中最爲重要的部分,存有CA的私鑰以及發行證書的腳本文件,出於安全的考慮,應將CA服務器與其餘服務器隔離,任何通訊採用人工干預的方式,確保認證中心的安全。

3. 註冊機構RA
登記中心服務器面向登記中心操做員,在CA體系結構中起承上啓下的做用
    1) 一方面向CA轉發安全服務器傳輸過來的證書申請請求
    2) 另外一方面向LDAP服務器和安全服務器轉發CA頒發的數字證書和證書撤消列表。

4. LDAP服務器
LDAP服務器提供目錄瀏覽服務,負責將註冊機構服務器傳輸過來的用戶信息以及數字證書加入到服務器上。這樣其餘用戶經過訪問LDAP服務器就可以獲得其餘用戶的數字證書。

5. 數據庫服務器:數據庫服務器是認證機構中的核心部分,用於:
    1) 認證機構中數據(如密鑰和用戶信息等)
    2) 日誌合統計信息的存儲和管理
實際的的數據庫系統應採用多種措施,如磁盤陣列、雙機備份和多處理器等方式,以維護數據庫系統的安全性、穩定性、可伸縮性和高性能。

咱們知道,PKI的目的是使用公鑰機制加密技術來保護通訊的安全,而公鑰算法涉及到不少的加密參數,同時PKI機制中還有對用戶身份的識別的功能,爲了知足這些需求,"證書"的出現就很天然了,證書從本質上來講就是一個ASCII文本文件,它只是將整個公鑰機制中須要的各類數據都捆綁打包到了一塊兒,統一管理、分發。網絡

2. SSL證書 

"SSL證書"這個詞是一個相對較大的概念,有不少種格式的SSL證書,整個PKI體系中有不少格式標準。PKI的標準規定了PKI的設計、實施和運營,規定了PKI各類角色的"遊戲規則"。若是兩個PKI應用程序之間要想進行交互,只有相互理解對方的數據含義,交互才能正常進行,標準的做用就是提供了數據語法和語義的共同約定

PKI中最重要的標準,它定義了公鑰證書的基本結構。
X.509是國際電信聯盟-電信(ITU-T)部分標準和國際標準化組織(ISO)的證書格式標準。做爲ITU-ISO目錄服務系列標準的一部分,X.509是定義了公鑰證書結構的基本標準。1988年首次發佈,
1993年和1996年兩次修訂。當前使用的版本是X.509 V3,它加入了擴展字段支持,這極大地增進了證書的靈活性。X.509 V3證書包括一組按預約義順序排列的強制字段,還有可選擴展字段
,即便在強制字段中,X.509證書也容許很大的靈活性,由於它爲大多數字段提供了多種編碼方案。X.509 V4版已經推出。
X.509標準在PKI中起到了舉足輕重的做用,PKI由小變大,由原來網絡封閉環境到分佈式開放環境,X.509起了很大做用,能夠說X.509標準是PKI的雛形。PKI是在X.509標準基礎上發展起來的
    1) SSL公鑰證書
    2) 證書廢除列表CRL(Certificate revocation lists 證書黑名單)

2. PKCS標準(公鑰加密標準 Public Key Cryptography Standards, PKCS)
它定義了"數據通訊協議"的主要標準。這些標準定義瞭如何恰當地格式化私鑰或者公鑰,之因此須要定義PKCS標準,是由於證書的產生並非在本地用的,每每須要在網絡中進行傳輸,所以須要
有一個良好的規範來定義和保證證書在網絡中的正常傳輸
http://zh.wikipedia.org/wiki/PKCS
    1) PKCS#7 
    PKCS#7是由RSA安全體系在公鑰加密系統中交換數字證書產生的一種加密標準,PKCS#7爲"密碼信封封裝標準",描述了密碼操做(例如數字簽名和數字信封)的數據的通用語法。該語法容許
遞歸,例如一個數字信封能夠嵌套在另外一個數字信封裏面,或者一個實體能夠在一個已經封裝的數據上簽名。該語法同時容許添加任意屬性,好比簽名時間等。
    該標準和保密加強郵件(PEM)是兼容的,若是以PEM兼容形式構建,那麼被簽名後的數據和簽名後又封裝的數據內容能夠很容易地被轉化成PEM格式。
    這是一種將數據加密和簽名(enveloping)的技術標準,它描述
        1.1) 數字證書的語法
        1.2) 其餘加密消息
        1.3) 數據加密
        1.4) 數字簽名的方法
        1.5) 也包含了算法 
    常見的文件後綴有:
        1.1) .P7B 
        1.2) .p7c
    1.3) .SPC
    文件中包含:
        1) 證書
        2) CRL列表信息
        3) 沒有私鑰(注意)
    2) PKCS#12 
    它定義了一個用於保存私鑰和對應公鑰證書的文件格式,並由對稱密鑰加密保護。PKCS#12一般採用PFX,P12做爲文件擴展名。PKCS#12文件能夠存放多個證書,並由密碼保護,一般用於
WINDOWS IIS,也可以被看成Java Keysotre文件使用,用於Tomcat,Resign,Weblogic,Jboss等,不能被用於Apache.
    常見的文件後綴有:
        2.1) .PFX 
        2.2) .p12
    文件中包含: 
    1) 證書(公鑰)
        2) 私鑰(受密碼保護(可選))
        3) 完整的證書鏈信息
 
3. X.500和目錄服務標準
規定了證書撤銷列表存儲

0x1: SSL公鑰證書

版本號指明X.509證書的格式版本,如今的值能夠爲:
    1) 0: v1
    2) 1: v2
    3) 2: v3
也爲未來的版本進行了預約義

2. 證書序列號(Serial Number)
序列號指定由CA分配給證書的惟一的"數字型標識符"。當證書被取消時,其實是將此證書的序列號放入由CA簽發的CRL中,這也是序列號惟一的緣由。

3. 簽名算法標識符(Signature Algorithm)
簽名算法標識用來指定由CA簽發證書時所使用的"簽名算法"。算法標識符用來指定CA簽發證書時所使用的:
    1) 公開密鑰算法
    2) hash算法
example: sha1WithRSAEncryption
須向國際知名標準組織(如ISO)註冊

4. 簽發機構名(Issuer)
此域用來標識簽發證書的CA的X.500 DN(DN-Distinguished Name)名字。包括:
    1) 國家(C)
    2) 省市(ST)
    3) 地區(L)
    4) 組織機構(O)
    5) 單位部門(OU)
    6) 通用名(CN)
    7) 郵箱地址

5. 有效期(Validity)
指定證書的有效期,包括:
    1) 證書開始生效的日期時間
    2) 證書失效的日期和時間
每次使用證書時,須要檢查證書是否在有效期內。

6. 證書用戶名(Subject)
指定證書持有者的X.500惟一名字。包括:
    1) 國家(C)
    2) 省市(ST)
    3) 地區(L)
    4) 組織機構(O)
    5) 單位部門(OU)
    6) 通用名(CN)
    7) 郵箱地址

7. 證書持有者公開密鑰信息(subject PublicKey Info)
證書持有者公開密鑰信息域包含兩個重要信息:
    1) 證書持有者的公開密鑰的值
    2) 公開密鑰使用的算法標識符。此標識符包含公開密鑰算法和hash算法。
8. 擴展項(extension)
X.509 V3證書是在v2的基礎上一標準形式或普通形式增長了擴展項,以使證書可以附帶額外信息。標準擴展是指由X.509 V3版本定義的對V2版本增長的具備普遍應用前景的擴展項,任何人都
能夠向一些權威機構,如ISO,來註冊一些其餘擴展,若是這些擴展項應用普遍,也許之後會成爲標準擴展項。

9. 簽發者惟一標識符(Issuer Unique Identifier)
簽發者惟一標識符在第2版加入證書定義中。此域用在當同一個X.500名字用於多個認證機構時,用一比特字符串來惟一標識簽發者的X.500名字。可選。

10. 證書持有者惟一標識符(Subject Unique Identifier)
持有證書者惟一標識符在第2版的標準中加入X.509證書定義。此域用在當同一個X.500名字用於多個證書持有者時,用一比特字符串來惟一標識證書持有者的X.500名字。可選。

11. 簽名算法(Signature Algorithm)
證書籤發機構對證書上述內容的簽名算法
example: sha1WithRSAEncryption

12. 簽名值(Issuer's Signature)
證書籤發機構對證書上述內容的簽名值

0x2: 證書廢除列表CRL

證書廢除列表CRL(Certificate revocation lists)爲應用程序和其它系統提供了一種檢驗證書有效性的方式。任何一個證書廢除之後,證書機構CA會經過發佈CRL的方式來通知各個相關方

    1) 0: 表示X.509 V1 標準
    2) 1: 表示X.509 V2 標準
    3) 2: 表示X.509 V3標準
目前經常使用的是V3標準

2. 簽名算法:包含:
    1) 算法標識
    2) 算法參數
用於指定證書籤發機構用來對CRL內容進行簽名的算法。

3. 證書籤發機構名:簽發機構的DN名,由
    1) 國家(C)
    2) 省市(ST)
    3) 地區(L)
    4) 組織機構(O)
    5) 單位部門(OU)
    6) 通用名(CN)
    7) 郵箱地址

4. 這次簽發時間:這次CRL簽發時間,遵循ITU-T X.509 V2標準的CA在2049年以前把這個域編碼爲UTCTime類型,在2050或2050年以後年以前把這個域編碼爲GeneralizedTime類型。

5. 下次簽發時間:下次CRL簽發時間,遵循ITU-T X.509 V2標準的CA在2049年以前把這個域編碼爲UTCTime類型,在2050或2050年以後年以前把這個域編碼爲GeneralizedTime類型。

6. 用戶公鑰信息,其中包括:
    1) 廢除的證書序列號: 要廢除的由同一個CA簽發的證書的一個惟一標識號,同一機構簽發的證書不會有相同的序列號
    2) 證書廢除時間 

7. 簽名算法:對CRL內容進行簽名的簽名算法。

8. 簽名值:證書籤發機構對CRL內容的簽名值。

3. SSL證書生成、openSSL學習 

OpenSSL是一個強大的安全套接字層密碼庫,整個軟件包大概能夠分紅三個主要的功能部分

1. 密碼算法庫
2. 經常使用的密鑰和證書封裝管理功能
3. SSL通訊API接口
4. 豐富的應用程序供測試或其它目的使用

使用openSSL開發套件,咱們能夠完成如下功能

2. 創建 X.509 證書、證書籤名請求(CSR)和CRLs(證書回收列表) 
3. 計算消息摘要 
4. 使用各類 Cipher加密/解密 
5. SSL/TLS 客戶端以及服務器的測試 
6. 處理S/MIME 或者加密郵件 

openssl提供了不少不一樣的命令,每一個子命令有不少的選項和參數,咱們來逐一學習一下

    1) asn1parse: asn1parse用於解釋用ANS.1語法書寫的語句(ASN通常用於定義語法的構成) 
    2) ca: ca用於CA的管理 
    openssl ca [options]:
        2.1) -selfsign
        使用對證書請求進行簽名的密鑰對來簽發證書。即"自簽名",這種狀況發生在生成證書的客戶端、簽發證書的CA都是同一臺機器(也是咱們大多數實驗中的狀況),咱們可使用同一個
密鑰對來進行"自簽名"
        2.2) -in file
        須要進行處理的PEM格式的證書
        2.3) -out file
        處理結束後輸出的證書文件
        2.4) -cert file
        用於簽發的根CA證書
        2.5) -days arg 
        指定簽發的證書的有效時間
        2.6) -keyfile arg   
        CA的私鑰證書文件
        2.7) -keyform arg
        CA的根私鑰證書文件格式:
            2.7.1) PEM
            2.7.2) ENGINE 
        2.8) -key arg   
        CA的根私鑰證書文件的解密密碼(若是加密了的話)
        2.9) -config file    
        配置文件
    example1: 利用CA證書籤署請求證書
    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key  

    3) req: X.509證書籤發請求(CSR)管理
    openssl req [options] <infile >outfile
        3.1) -inform arg
        輸入文件格式
            3.1.1) DER
            3.1.2) PEM
        3.2) -outform arg   
        輸出文件格式
            3.2.1) DER
            3.2.2) PEM
        3.3) -in arg
        待處理文件
        3.4) -out arg
        待輸出文件
        3.5) -passin        
        用於簽名待生成的請求證書的私鑰文件的解密密碼
        3.6) -key file
        用於簽名待生成的請求證書的私鑰文件
        3.7) -keyform arg  
            3.7.1) DER
            3.7.2) NET
            3.7.3) PEM
        3.8) -new
        新的請求
        3.9) -x509          
        輸出一個X509格式的證書 
        3.10) -days
        X509證書的有效時間  
        3.11) -newkey rsa:bits 
        生成一個bits長度的RSA私鑰文件,用於簽發  
        3.12) -[digest]
        HASH算法
            3.12.1) md5
            3.12.2) sha1
            3.12.3) md2
            3.12.4) mdc2
            3.12.5) md4
        3.13) -config file   
        指定openssl配置文件
        3.14) -text: text顯示格式
    example1: 利用CA的RSA密鑰建立一個自簽署的CA證書(X.509結構) 
    openssl req -new -x509 -days 3650 -key server.key -out ca.crt 
    example2: 用server.key生成證書籤署請求CSR(這個CSR用於以外發送待CA中心等待簽發)
    openssl req -new -key server.key -out server.csr
    example3: 查看CSR的細節
    openssl req -noout -text -in server.csr

    4) genrsa: 生成RSA參數
    openssl genrsa [args] [numbits]
        [args]
        4.1) 對生成的私鑰文件是否要使用加密算法進行對稱加密:
            4.1.1) -des: CBC模式的DES加密
            4.1.2) -des3: CBC模式的3DES加密
            4.1.3) -aes128: CBC模式的AES128加密
            4.1.4) -aes192: CBC模式的AES192加密
            4.1.5) -aes256: CBC模式的AES256加密
        4.2) -passout arg: arg爲對稱加密(des、3des、aes)的密碼(使用這個參數就省去了console交互提示輸入密碼的環節)
        4.3) -out file: 輸出證書私鑰文件
        [numbits]: 密鑰長度
    example: 生成一個1024位的RSA私鑰,並用3DES加密(密碼爲1111),保存爲server.key文件
    openssl genrsa -out server.key -passout pass:1111 -des3 1024 

    5) rsa: RSA數據管理
    openssl rsa [options] <infile >outfile
        5.1) -inform arg
        輸入密鑰文件格式:
            5.1.1) DER(ASN1)
            5.1.2) NET
            5.1.3) PEM(base64編碼格式)
         5.2) -outform arg
         輸出密鑰文件格式
            5.2.1) DER
            5.2.2) NET
            5.2.3) PEM
        5.3) -in arg
        待處理密鑰文件 
        5.4) -passin arg
        輸入這個加密密鑰文件的解密密鑰(若是在生成這個密鑰文件的時候,選擇了加密算法了的話)
        5.5) -out arg
        待輸出密鑰文件
        5.6) -passout arg  
        若是但願輸出的密鑰文件繼續使用加密算法的話則指定密碼 
        5.7) -des: CBC模式的DES加密
        5.8) -des3: CBC模式的3DES加密
        5.9) -aes128: CBC模式的AES128加密
        5.10) -aes192: CBC模式的AES192加密
        5.11) -aes256: CBC模式的AES256加密
        5.12) -text: 以text形式打印密鑰key數據 
        5.13) -noout: 不打印密鑰key數據 
        5.14) -pubin: 檢查待處理文件是否爲公鑰文件
        5.15) -pubout: 輸出公鑰文件
    example1: 對私鑰文件進行解密
    openssl rsa -in server.key -passin pass:111 -out server_nopass.key
    example:2: 利用私鑰文件生成對應的公鑰文件
    openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key

    6) x509:
    本指令是一個功能很豐富的證書處理工具。能夠用來顯示證書的內容,轉換其格式,給CSR簽名等X.509證書的管理工做
    openssl x509 [args]    
        6.1) -inform arg
        待處理X509證書文件格式
            6.1.1) DER
            6.1.2) NET
            6.1.3) PEM
        6.2) -outform arg   
        待輸出X509證書文件格式
            6.2.1) DER
            6.2.2) NET
            6.2.3) PEM
        6.3) -in arg 
        待處理X509證書文件
        6.4) -out arg       
        待輸出X509證書文件
        6.5) -req            
        代表輸入文件是一個"請求籤發證書文件(CSR)",等待進行簽發 
        6.6) -days arg       
        代表將要簽發的證書的有效時間 
        6.7) -CA arg 
        指定用於簽發請求證書的根CA證書 
        6.8) -CAform arg     
        根CA證書格式(默認是PEM) 
        6.9) -CAkey arg      
        指定用於簽發請求證書的CA私鑰證書文件,若是這個option沒有參數輸入,那麼缺省認爲私有密鑰在CA證書文件裏有
        6.10) -CAkeyform arg  
        指定根CA私鑰證書文件格式(默認爲PEM格式)
        6.11) -CAserial arg   
        指定序列號文件(serial number file)
        6.12) -CAcreateserial 
        若是序列號文件(serial number file)沒有指定,則自動建立它     
    example1: 轉換DER證書爲PEM格式
    openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
    example2: 使用根CA證書對"請求籤發證書"進行簽發,生成x509格式證書
    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    example3: 打印出證書的內容
    openssl x509 -in server.crt -noout -text 

    7) crl: crl是用於管理CRL列表 
    openssl crl [args]
        7.1) -inform arg
        輸入文件的格式
            7.1.1) DER(DER編碼的CRL對象)
            7.1.2) PEM(默認的格式)(base64編碼的CRL對象)
        7.2) -outform arg
        指定文件的輸出格式 
            7.2.1) DER(DER編碼的CRL對象)
            7.2.2) PEM(默認的格式)(base64編碼的CRL對象)
        7.3) -text: 
        以文本格式來打印CRL信息值。
        7.4) -in filename
        指定的輸入文件名。默認爲標準輸入。
        7.5) -out filename
        指定的輸出文件名。默認爲標準輸出。
        7.6) -hash
        輸出頒發者信息值的哈希值。這一項可用於在文件中根據頒發者信息值的哈希值來查詢CRL對象。
        7.7) -fingerprint
        打印CRL對象的標識。
        7.8) -issuer
        輸出頒發者的信息值。
        7.9) -lastupdate
        輸出上一次更新的時間。
        7.10) -nextupdate
        打印出下一次更新的時間。 
        7.11) -CAfile file
        指定CA文件,用來驗證該CRL對象是否合法。 
        7.12) -verify
        是否驗證證書。        
    example1: 輸出CRL文件,包括(頒發者信息HASH值、上一次更新的時間、下一次更新的時間)
    openssl crl -in crl.crl -text -issuer -hash -lastupdate –nextupdate 
    example2: 將PEM格式的CRL文件轉換爲DER格式
    openssl crl -in crl.pem -outform DER -out crl.der  

    8) crl2pkcs7: 用於CRL和PKCS#7之間的轉換 
    openssl crl2pkcs7 [options] <infile >outfile
    轉換pem到spc
    openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
    https://www.openssl.org/docs/apps/crl2pkcs7.html

    9) pkcs12: PKCS#12數據的管理
    pkcs12文件工具,能生成和分析pkcs12文件。PKCS#12文件能夠被用於多個項目,例如包含Netscape、 MSIE 和 MS Outlook
    openssl pkcs12 [options] 
    http://blog.csdn.net/as3luyuan123/article/details/16105475
    https://www.openssl.org/docs/apps/pkcs12.html

    10) pkcs7: PCKS#7數據的管理 
    用於處理DER或者PEM格式的pkcs#7文件
    openssl pkcs7 [options] <infile >outfile
    http://blog.csdn.net/as3luyuan123/article/details/16105407
    https://www.openssl.org/docs/apps/pkcs7.html
 
2. openssl list-message-digest-commands(消息摘要命令)
    1) dgst: dgst用於計算消息摘要 
    openssl dgst [args]
        1.1) -hex           
        以16進制形式輸出摘要
        1.2) -binary        
        以二進制形式輸出摘要
        1.3) -sign file    
        以私鑰文件對生成的摘要進行簽名
        1.4) -verify file    
        使用公鑰文件對私鑰簽名過的摘要文件進行驗證 
        1.5) -prverify file  
        以私鑰文件對公鑰簽名過的摘要文件進行驗證
        verify a signature using private key in file
        1.6) 加密處理
            1.6.1) -md5: MD5 
            1.6.2) -md4: MD4         
            1.6.3) -sha1: SHA1 
            1.6.4) -ripemd160
    example1: 用SHA1算法計算文件file.txt的哈西值,輸出到stdout
    openssl dgst -sha1 file.txt
    example2: 用dss1算法驗證file.txt的數字簽名dsasign.bin,驗證的private key爲DSA算法產生的文件dsakey.pem
    openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

    2) sha1: 用於進行RSA處理
    openssl sha1 [args] 
        2.1) -sign file
        用於RSA算法的私鑰文件 
        2.2) -out file
        輸出文件愛你
        2.3) -hex   
        以16進制形式輸出
        2.4) -binary
        以二進制形式輸出  
    example1: 用SHA1算法計算文件file.txt的HASH值,輸出到文件digest.txt
    openssl sha1 -out digest.txt file.txt
    example2: 用sha1算法爲文件file.txt簽名,輸出到文件rsasign.bin,簽名的private key爲RSA算法產生的文件rsaprivate.pem
    openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

3. openssl list-cipher-commands (Cipher命令的列表)
    1) aes-128-cbc
    2) aes-128-ecb
    3) aes-192-cbc
    4) aes-192-ecb
    5) aes-256-cbc
    6) aes-256-ecb
    7) base64
    8) bf
    9) bf-cbc
    10) bf-cfb
    11) bf-ecb
    12) bf-ofb
    13) cast
    14) cast-cbc
    15) cast5-cbc
    16) cast5-cfb
    17) cast5-ecb
    18) cast5-ofb
    19) des
    20) des-cbc
    21) des-cfb
    22) des-ecb
    23) des-ede
    24) des-ede-cbc
    25) des-ede-cfb
    26) des-ede-ofb
    27) des-ede3
    28) des-ede3-cbc
    29) des-ede3-cfb
    30) des-ede3-ofb
    31) des-ofb
    32) des3
    33) desx
    34) rc2
    35) rc2-40-cbc
    36) rc2-64-cbc
    37) rc2-cbc
    38) rc2-cfb
    39) rc2-ecb
    40) rc2-ofb
    41) rc4
    42) rc4-40

4. CA中心搭建、SSL證書生成過程

咱們知道,用openSSL這個套件能夠完成CA的搭建、SSL證書從生成到簽發的所有過程,在使用openssl的指令的時候,咱們須要記住幾點:

使用這些特定的文件擴展名只是爲了遵循某些約定俗稱的規範,讓人能一目瞭然。

2. openssl的指令之間具備一些功能上的重疊,因此咱們會發現完成一樣一個目的(例如SSL證書生成),每每可使用看似不一樣的指令組達到目的

3. 理解CA、SSL證書最重要的不是記住這些openssl指令,而是要理解CA的運行機制,同時理解openssl指令的功能,從原理上去理解整個流程,就不會以爲模糊了

下面咱們來一塊兒學習一下怎麼用openssl來完成一個CA的功能,而且簽發一個apache可使用的SSL證書

0x1: CA認證中心準備

咱們首先要明白,要進行一個證書的簽發工做,第一步要作的就是進行CA認證中心的準備工做,CA負責對請求證書(CSR)進行簽名,有兩種選擇

1. 選擇市場上公認的權威性的CA中心

http://www.webtrust.net/

2. GlobalSign
http://cn.globalsign.com/
http://globalsign.tbs-certificats.com/

3. GTE
http://certificate.fyicenter.com/335_Root_CA_GTE_CyberTrust_Global_Root_GTE_CyberTrust_Solutions.html

4. Nortel
http://www.nortel.com/

5. Verisign
http://www.verisign.com/

選擇權威的CA進行證書籤發的好處就是目前大多數的瀏覽器都會預裝內置了這些權威CA的公鑰證書,這樣,在使用這些權威CA簽發過的證書的時候,瀏覽器通常不會報風險提示

相反,若是咱們的證書的簽發機構不是一個權威機構,瀏覽器在訪問的時候就會報風險提示

2. 本機搭建CA認證中心

咱們一樣可使用openssl在本機搭建CA認證中心

/*
1. 創建CA目錄結構
按照OpenSSL的默認配置創建CA,須要在文件系統中創建相應的目錄結構。相關的配置內容通常位於/usr/ssl/openssl.cnf內
-- demoCA/
    |-- index.txt
    |-- newcerts/
    |-- private/
    |-- serial
2. 生成CA證書的RSA密鑰對
咱們知道,要利用公鑰機制,必要須要先創建密鑰文件
3. 生成CA證書請求
4. 對CA證書請求進行自簽名
(三、4兩步能夠合併執行)
*/
mkdir -p ./demoCA/{private,newcerts}
touch ./demoCA/index.txt
echo 01 > ./demoCA/serial
cp /usr/lib/ssl/openssl.cnf ./
openssl genrsa -out ./demoCA/private/cakey.pem 2048
openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem
..按照提示填寫申請者身份信息..
//openssl中有些指令能夠爲一條指令(三、4步驟能夠合併到如下一步完成)
openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

0x2: 服務端證書準備

要配置apache的SSL通訊,須要爲apache配置服務端的"服務器根證書"

/*
1. 生成服務端證書的RSA密鑰對
和根CA同樣,生成服務端證書一樣也是使用RSA機制,天然也須要爲服務端生成一個RSA私鑰文件(但不能和CA的同樣)
2. 生成服務端證書請求
4. 查看剛纔生成的請求籤發證書
3. 使用CA根書對"服務端請求籤發證書文件"進行簽名 
*/
openssl genrsa -out serverkey.pem
openssl req -new -days 3650 -key serverkey.pem -out serverreq.pem
..填寫證書申請者的身份信息..(common name不能爲空,申請證書的countryName必須和CA的countryName相同)
openssl req -noout -text -in serverreq.pem
openssl ca -in serverreq.pem -out servercert.pem -config openssl.cnf
(若是在簽發的時候遇到異常,記獲得openssl.cnf配置文件中查看是不是配置項出了問題)

0x3: 配置apache的SSL證書

/*
1. 加載SSL模塊
2. 配置apache的ports.conf文件
3. 設置site-enabled
4. 修改配置文件
5. 重啓APACHE
*/
sudo a2enmod ssl
這條命令至關於
sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled
若是沒有a2enmod指令,也可直接在apache2.conf中設置SSL模塊加載:
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

vim /etc/apache2/ports.conf
加入443端口 
Listen 443

ln -s /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/001-ssl

vim /etc/apache2/sites-enabled/001-ssl
把端口改成443,在<Virtualhost>下加入SSL認證配置,其它的根據須要本身定製 與普通配置無異
NameVirtualHost *:443 
<VirtualHost *:443> 
SSLEngine on 
SSLCertificateFile /etc/apache2/ssl/servercert.pem
SSLCertificateKeyFile /etc/apache2/ssl/server.key
ServerAdmin webmaster@localhost 
DocumentRoot /var/www 
ServerName myServerName 
<Directory /> 
    Options FollowSymLinks 
    AllowOverride All 
</Directory> 
<Directory /var/www/> 
    Options FollowSymLinks MultiViews 
    AllowOverride None 
    Order allow,deny 
    allow from all 
# This directive allows us to have apache2's default start page 
# in /apache2-default/, but still have / go to the right place 
#RedirectMatch ^/$ /apache2-default/ 
</Directory>
</VirtualHost> 

cd /etc/apache2/ssl/
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out servercert.pem 

/etc/init.d/apache2 restart

0x4: 配置客戶端的SSL證書

客戶端證書並不必定須要,只有在服務端配置了一個"驗證客戶端選項"的時候,才須要配置客戶端證書,在大多數狀況下都不須要客戶端證書

整個CA架構以下圖所示

相關文章
相關標籤/搜索