天天看點

openSSL指令、PKI、CA、SSL證書原理[絕對是個好文章] 轉

[url]http://www.cnblogs.com/littlehann/p/3738141.html[/url]

複制代碼

http://baike.baidu.com/view/7615.htm?fr=aladdin

http://www.ibm.com/developerworks/cn/security/se-pkiusing/index.html?ca=drs

http://www.ibm.com/developerworks/cn/security/s-pki/

http://en.wikipedia.org/wiki/X.509

http://zh.wikipedia.org/wiki/PKCS

http://blog.csdn.net/rztyfx/article/details/6919220

http://weekend.blog.163.com/blog/static/7468958201131591422649/

http://linux.chinaunix.net/techdoc/beginner/2009/06/29/1120721.shtml

http://www.360doc.com/content/12/0414/19/3725126_203594495.shtml

http://blog.sina.com.cn/s/blog_436fe8b10100r5p3.html

http://blog.csdn.net/allwtg/article/details/4982507

http://rhythm-zju.blog.163.com/blog/static/310042008015115718637/

http://www.mike.org.cn/articles/ubuntu-config-apache-https/

複制代碼

目錄

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。也就是說,該定義中已經隐含了必須具有的密鑰管理功能。

PKI既不是一個協定,也不是一個軟體,它是一個标準,在這個标準之下發展出的為了實作安全基礎服務目的的技術統稱為PKI

PKI主要由以下元件組成

複制代碼

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. 安全伺服器:

安全伺服器面向普通使用者,用于提供:

1) 證書申請

2) 浏覽

3) 證書撤消清單

4) 證書下載下傳等安全服務

安全伺服器與使用者的的通信采取安全信道方式(如SSL的方式,不需要對使用者進行身份認證)。使用者首先得到安全伺服器的證書(該證書由CA頒發),然後使用者與伺服器之間的所有通信,包括使用者填

寫的申請資訊以及浏覽器生成的公鑰均以安全伺服器的密鑰進行加密傳輸,隻有安全伺服器利用自己的私鑰解密才能得到明文,這樣可以防止其他人通過QIETING得到明文。進而保證了證書申請和傳輸

過程中的資訊安全性。

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應用程式之間要想進行互動,隻有互相了解對方的資料含義,互動才能正常進行,标準的作用就是提供了資料文法和語義的共同約定

複制代碼

1. X.509标準

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公鑰證書

複制代碼

1. 證書版本号(Version)

版本号指明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)

證書簽發機構對證書上述内容的簽名值

複制代碼

example:

複制代碼

Certificate:

Data:

Version: 3 (0x2)

Serial Number:

b7:90:fc:87:f2:27:ec:1e

Signature Algorithm: sha1WithRSAEncryption

Issuer: C=ZH, ST=JS, L=WX, O=JN, OU=IOT, CN=LittleHann/[email protected]

Validity

Not Before: May 7 05:25:14 2014 GMT

Not After : May 4 05:25:14 2024 GMT

Subject: C=ZH, ST=JS, L=WX, O=JN, OU=IOT, CN=LittleHann/[email protected]

Subject Public Key Info:

Public Key Algorithm: rsaEncryption

RSA Public Key: (1024 bit)

Modulus (1024 bit):

00:c3:f2:9b:b8:20:3f:9e:c0:be:1d:18:a8:64:c0:

47:79:71:bb:32:2e:63:43:af:da:01:bc:f3:f5:74:

f8:29:4d:a8:ad:68:30:a4:bf:0a:42:71:8d:5f:58:

c0:b1:97:a2:ae:e7:be:1e:6a:a7:d8:4a:14:f1:8f:

67:f4:b3:64:45:88:a6:fa:ed:8f:9a:49:20:33:ca:

dc:15:22:39:d9:40:02:1c:5f:4f:5b:1d:2c:ca:3d:

30:8b:bc:07:0b:0f:58:03:6f:52:c7:0b:c4:54:59:

cc:12:2a:4b:23:c6:98:fe:d3:80:a9:3f:d9:c0:1f:

36:47:25:5a:72:fe:88:94:81

Exponent: 65537 (0x10001)

X509v3 extensions:

X509v3 Subject Key Identifier:

88:11:74:9F:7C:12:9C:92:FD:81:33:18:D0:2C:04:64:0F:00:1D:64

X509v3 Authority Key Identifier:

keyid:88:11:74:9F:7C:12:9C:92:FD:81:33:18:D0:2C:04:64:0F:00:1D:64

DirName:/C=ZH/ST=JS/L=WX/O=JN/OU=IOT/CN=LittleHann/[email protected]

serial:B7:90:FC:87:F2:27:EC:1E

X509v3 Basic Constraints:

CA:TRUE

Signature Algorithm: sha1WithRSAEncryption

a1:6b:be:44:ba:2c:6f:88:c4:15:2d:27:0d:d7:60:0a:6a:c4:

6d:6f:1c:83:b4:0f:af:af:be:f9:f1:3e:9c:1b:d7:0a:e2:7b:

2b:70:96:d5:7e:90:51:1a:01:a3:36:7f:c3:2a:06:7a:f5:b1:

dd:c9:c5:fc:f1:98:f6:45:f6:40:ce:8a:93:4a:4e:1d:8f:9e:

2c:9f:8a:5c:d5:72:5a:0a:3e:f5:96:4b:2f:3d:ae:bf:55:50:

99:14:4a:63:34:43:41:5a:41:6e:b1:ec:7f:9d:4b:f6:d8:18:

ee:7a:10:5a:bc:d6:4b:5b:c4:0d:15:e3:23:cb:b2:63:03:62:

48:af

複制代碼

0x2: 證書廢除清單CRL

證書廢除清單CRL(Certificate revocation lists)為應用程式和其它系統提供了一種檢驗證書有效性的方式。任何一個證書廢除以後,證書機構CA會通過釋出CRL的方式來通知各個相關方

複制代碼

1. 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内容的簽名值。

複制代碼

example:

複制代碼

Certificate Request:

Data:

Version: 0 (0x0)

Subject: C=zh, ST=wx, L=js, O=jn, OU=iot, CN=littleHANN/[email protected]

Subject Public Key Info:

Public Key Algorithm: rsaEncryption

RSA Public Key: (2048 bit)

Modulus (2048 bit):

00:be:2c:a4:fc:9f:f7:b3:2a:6b:c8:2f:ec:8d:59:

ba:12:ed:8e:c1:82:e0:6b:5d:12:99:ff:a1:54:3f:

64:d5:31:7f:26:b6:70:95:a7:1e:7f:89:77:3b:c9:

cd:00:7c:9a:cc:32:c9:2f:56:f5:36:8d:2b:65:d9:

73:0c:a8:6f:03:46:1e:97:76:66:5c:93:a4:2c:00:

99:0e:b0:38:e5:43:22:ae:6e:c6:0c:f7:b5:ef:59:

9b:c8:d3:af:5a:35:9b:78:1d:e3:bd:c5:7e:08:9e:

fc:de:73:fd:2a:fc:f6:11:97:ca:60:30:f4:37:0f:

e7:d6:b7:36:d4:84:3e:e2:81:02:27:24:96:16:6d:

da:97:7c:d9:bf:5b:79:51:f1:ba:4e:e9:17:44:1e:

7c:fe:2d:b3:ec:62:34:2b:4d:ce:84:49:9f:0a:ec:

1e:fe:ee:69:60:e5:14:73:cd:8f:3d:75:d7:d9:c5:

b3:dc:c6:d7:d2:df:e6:ba:3a:a3:da:97:dd:24:cf:

6b:e4:00:df:64:13:22:da:25:e2:4b:47:d3:12:39:

60:0e:ab:a3:bc:54:c9:c3:36:80:9d:e5:f0:be:83:

d4:b5:d4:73:70:15:42:6e:74:04:06:ab:12:3e:02:

45:1f:02:20:79:fd:b5:00:48:b1:78:f0:a7:76:a5:

94:2f

Exponent: 65537 (0x10001)

Attributes:

a0:00

Signature Algorithm: sha1WithRSAEncryption

82:1a:93:02:7d:42:02:91:7f:59:31:75:84:49:8a:d4:4a:90:

ec:ad:c9:f7:3b:75:68:23:f4:d0:9b:de:ab:0e:4e:60:7c:46:

be:26:35:38:68:6b:1e:d0:61:19:86:b2:b6:a6:94:5e:8a:c1:

90:01:63:df:a7:c2:b0:79:75:bd:01:72:30:9a:08:21:83:82:

51:e7:79:07:7b:c8:27:9d:fa:5d:38:89:3a:97:87:87:21:65:

a7:00:3d:4b:c6:2f:ac:0c:45:57:8c:1a:bd:89:78:2b:7a:00:

4d:48:09:c5:55:22:9e:92:6b:f9:c8:dd:8f:de:5c:61:c7:3d:

20:6a:a3:6b:e5:32:00:2f:dd:68:d8:a5:66:be:19:fb:95:e1:

e2:cc:18:1e:96:2e:e5:2f:58:d9:4c:f8:d5:92:1d:34:ed:79:

52:a2:3d:02:2e:58:2f:86:d3:29:b7:5c:66:27:25:61:d3:0e:

5e:86:77:12:0f:4f:12:3c:bf:95:85:5c:b7:77:05:11:9e:bb:

06:ac:f8:cc:c3:42:84:f7:a7:84:b3:6c:fe:fe:66:92:31:32:

dc:47:8d:a2:04:e0:2e:43:74:de:9f:03:c6:7e:f0:90:1d:0f:

8a:f3:bc:5c:2c:5c:0b:db:d9:7d:69:05:31:a9:13:f4:18:1f:

7d:69:f4:26

複制代碼

3. SSL證書生成、openSSL學習

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

1. 密碼算法庫

2. 常用的密鑰和證書封裝管理功能

3. SSL通信API接口

4. 豐富的應用程式供測試或其它目的使用

使用openSSL開發套件,我們可以完成以下功能

複制代碼

1. 建立 RSA、DH、DSA key 參數

2. 建立 X.509 證書、證書簽名請求(CSR)和CRLs(證書回收清單)

3. 計算消息摘要

4. 使用各種 Cipher加密/解密

5. SSL/TLS 用戶端以及伺服器的測試

6. 處理S/MIME 或者加密郵件

複制代碼

openssl提供了很多不同的指令,每個子指令有很多的選項和參數,我們來逐一學習一下

複制代碼

1. openssl list-standard-commands(标準指令)

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的指令的時候,我們需要記住幾點:

複制代碼

1. 在生成過程中有很多檔案擴充名(.crt、.csr、.pem、.key等等),從本質上講,擴充名并不具有任何強制限制作用,重要的是這個檔案是由哪個指令生成的,它的内容是什麼格式的。

使用這些特定的檔案擴充名隻是為了遵循某些約定俗稱的規範,讓人能一目了然。

2. openssl的指令之間具有一些功能上的重疊,是以我們會發現完成同樣一個目的(例如SSL證書生成),往往可以使用看似不同的指令組達到目的

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

複制代碼

下面我們來一起學習一下怎麼用openssl來完成一個CA的功能,并且簽發一個apache可以使用的SSL證書

0x1: CA認證中心準備

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

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

複制代碼

1. WebTrust

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認證中心

複制代碼

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中有些指令可以為一條指令(3、4步驟可以合并到以下一步完成)

openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

複制代碼

0x2: 服務端證書準備

要配置apache的SSL通信,需要為apache配置服務端的"伺服器根證書"

複制代碼

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證書

複制代碼

http://www.metsky.com/archives/561.html

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 [email protected]

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架構如下圖所示

繼續閱讀