1. 程式人生 > >身份認證之PKI搭建、X.509(RFC5280)——(一)

身份認證之PKI搭建、X.509(RFC5280)——(一)

身份認證之PKI搭建、X.509(RFC5280)——(一)

一.PKI的搭建

利用openssl搭建一個功能簡單的PKI
參考文件
https://pki-tutorial.readthedocs.io/en/latest/simple/index.html

這一部分不是原創,其實就是照著英文文件實現了一下,把英文文件翻譯成了中文(如果想自己實現,最好按照這個英文文件來)

  • 概述

在這裡插入圖片描述

  • 這是一個名為Simple Inc的組織, 該組織執行一個小型PKI來保護其電子郵件和Internet流量。
  • 要構建PKI,我們首先建立根CA及其根CA證書。 然後,我們使用根CA來建立簡單簽名CA.當CA部署完成後,我們會向員工Fred頒發電子郵件保護證書,並向www.simple.org網站伺服器頒發TLS伺服器證書。最後,瞭解CA需要支援的輸出格式,並展示如何檢視我們建立的檔案的內容。
  • 開始之前要獲取Simple PKI示例檔案並切換到新目錄。
git clone https://bitbucket.org/stefanholek/pki-example-1
cd pki-example-1

1.建立根CA

1.1建立目錄

  • 建立兩個目錄,CA目錄包含了CA的相關資訊,CRL目錄裡包含了CRL的資訊。
    對CA目錄修改許可權。
mkdir -p ca/root-ca/private ca/root-ca/db crl certs
chmod 700 ca/root-ca/private

1.2建立資料庫

cp /dev/null ca/root-ca/db/root-ca.db
cp /dev/null ca/root-ca/db/root-ca.db.attr
echo 01 > ca/root-ca/db/root-ca.crt.srl
echo 01 > ca/root-ca/db/root-ca.crl.srl
  • 在使用openssl ca命令之前,資料庫檔案必須存在。
    資料庫中包含以下檔案:索引檔案,屬性檔案,證書序列號檔案,CRL號碼檔案。這些檔案的內容在附錄B中描述。

1.3 生成Root CA請求

openssl req -new \
    -config etc/root-ca.conf \
    -out ca/root-ca.csr \
    -keyout ca/root-ca/private/root-ca.key
  • 使用openssl req -new命令,我們為根CA生成私鑰和證書籤名請求(CSR)。 系統會要求輸入密碼來保護私鑰(可以隨便輸,類似於1111的簡單密碼)。openssl req命令從前文的配置檔案的[req]部分獲取其配置。

1.4生成Root CA證書

penssl ca -selfsign \
    -config etc/root-ca.conf \
    -in ca/root-ca.csr \
    -out ca/root-ca.crt \
    -extensions root_ca_ext
  • 使用openssl ca命令,我們釋出基於1.3中CSR的證書。 該命令從前文的配置檔案獲取其配置。

2.建立 Signing CA

2.1建立目錄

mkdir -p ca/signing-ca/private ca/signing-ca/db crl certs
chmod 700 ca/signing-ca/private
  • ca目錄包含CA資源,crl目錄包含CRL資源,certs目錄包含使用者證書。

2.2建立資料庫

cp /dev/null ca/signing-ca/db/signing-ca.db
cp /dev/null ca/signing-ca/db/signing-ca.db.attr
echo 01 > ca/signing-ca/db/signing-ca.crt.srl
echo 01 > ca/signing-ca/db/signing-ca.crl.srl
  • 這些檔案的內容在附錄B中描述。

2.3建立Signing CA請求

openssl req -new \
    -config etc/signing-ca.conf \
    -out ca/signing-ca.csr \
    -keyout ca/signing-ca/private/signing-ca.key
  • 使用openssl req -new命令,我們為簽名CA建立私鑰和證書生成請求CSR。 系統會要求輸入密碼來保護私鑰可以隨便輸,類似於1111的簡單密碼)。 openssl req命令從配置檔案 [req]部分獲取其配置。

2.4建立Signing CA證書

openssl ca \
    -config etc/root-ca.conf \
    -in ca/signing-ca.csr \
    -out ca/signing-ca.crt \
    -extensions signing_ca_ext
  • 使用openssl ca命令,我們釋出基於CSR的證書。 該命令從配置檔案的[ca]部分獲取其配置。 注意,頒發簽名CA證書的是根CA.

3.使用CA證書

3.1建立email請求

openssl req -new \
    -config etc/email.conf \
    -out certs/fred.csr \
    -keyout certs/fred.key
  • 使用openssl req -new命令,生成私鑰和證書籤名請求。
    request configuration file 是已經配置好的檔案。
    出現提示時輸入以下DN元件:
    DC=org,DC=simple,O=Simple Inc, CN=Fred Flintstone,
    emailAddress = [email protected]其他欄位留空。

3.2建立email證書

openssl ca \
    -config etc/signing-ca.conf \
    -in certs/fred.csr \
    -out certs/fred.crt \
    -extensions email_ext
  • 我們使用Signing CA頒發電子郵件的證書。 證書型別由我們附加的副檔名定義。 證書的副本以名稱ca / signing-ca / 01.pem儲存在證書歸檔中(01是十六進位制的證書序列號。)

3.3 TLS伺服器請求

SAN=DNS:www.simple.org \
openssl req -new \
    -config etc/server.conf \
    -out certs/simple.org.csr \
    -keyout certs/simple.org.key
  • 使用已經配置好的檔案request configuration file生成TSL伺服器證書的私鑰和CSR。
    出現提示時輸入以下DN元件:
    DC=org, DC=simple, O=Simple Inc, CN=www.simple.org
    必須將subjectAltName指定為環境變數。 另請注意,伺服器金鑰通常沒有密碼。

3.4生成TLS伺服器證書

openssl ca \
    -config etc/signing-ca.conf \
    -in certs/simple.org.csr \
    -out certs/simple.org.crt \
    -extensions server_ext
  • 我們使用簽名CA頒發伺服器證書。 證書型別由我們附加的副檔名定義。 證書副本以名稱ca / signing-ca / 02.pem儲存在證書歸檔中。

3.5證書的吊銷

openssl ca \
    -config etc/signing-ca.conf \
    -revoke ca/signing-ca/01.pem \
    -crl_reason superseded
  • 證書替換或私鑰丟失時,要求在證書有效期到期之前撤銷證書。 openssl ca -revoke命令將證書標記為在CA資料庫中已撤銷。 從那時起它將被包含在CA頒發的CRL中。 上面的命令撤消序列號為01(十六進位制)的證書。

3.6證書撤銷列表

openssl ca -gencrl \
    -config etc/signing-ca.conf \
    -out crl/signing-ca.crl
  • openssl ca -gencrl命令建立證書吊銷列表(CRL)。CRL包含CA資料庫中所有已撤銷但尚未過期的證書。必須定期釋出新的CRL。

4.輸出格式

4.1生成DER格式的證書

openssl x509 \
    -in certs/fred.crt \
    -out certs/fred.cer \
    -outform der
  • 所有已釋出的證書必須採用DER格式[RFC 2585#section-3]。

4.2生成DER格式的證書撤銷列表

openssl crl \
    -in crl/signing-ca.crl \
    -out crl/signing-ca.crl \
    -outform der
  • 所有已釋出的CRL必須採用DER格式[RFC 2585#section-3]

4.3 生成PKCS#7 bundle

openssl crl2pkcs7 -nocrl \
    -certfile ca/signing-ca.crt \
    -certfile ca/root-ca.crt \
    -out ca/signing-ca-chain.p7c \
    -outform der
  • PKCS#7用於繫結兩個或多個證書。 格式也允許CRL,但它們在實踐中不使用。

4.4生成PKCS#12 bundle

openssl pkcs12 -export \
    -name "Fred Flintstone" \
    -inkey certs/fred.key \
    -in certs/fred.crt \
    -out certs/fred.p12
  • PKCS#12用於繫結證書和私鑰。 可以新增其他證書,通常是包含直到根CA的鏈的證書

4.5生成PEMbundl

cat ca/signing-ca.crt ca/root-ca.crt > \
    ca/signing-ca-chain.pem

cat certs/fred.key certs/fred.crt > \
    certs/fred.pem

  • PEM包是通過連線其他PEM格式的檔案建立的。 最常見的形式是"cert chain",“key + cert"和"key + cert chain”。OpenSSL支援PEM包,大多數軟體基於它(例如Apache mod_ssl和stunnel。)

5.檢視結果

5.1檢視請求的結果

openssl req \
    -in certs/fred.csr \
    -noout \
    -text
  • openssl req命令可用於顯示CSR檔案的內容。

5.2檢視證書

openssl x509 \
    -in certs/fred.crt \
    -noout \
    -text
  • openssl x509命令可用於顯示證書檔案的內容
  • 結果如下圖
    在這裡插入圖片描述

在這裡插入圖片描述

5.3檢視CRL

openssl crl \
    -in crl/signing-ca.crl \
    -inform der \
    -noout \
    -text
  • openssl crl命令可用於檢視CRL檔案的內容。
  • 結果如下圖:
    在這裡插入圖片描述

5.4檢視PKCS#7 bundle

openssl pkcs7 \
    -in ca/signing-ca-chain.p7c \
    -inform der \
    -noout \
    -text \
    -print_certs
  • openssl pkcs7命令可用於顯示PKCS#7的內容。

5.4檢視PKCS#12 bundle

openssl pkcs12 \
    -in certs/fred.p12 \
    -nodes \
    -info
  • openssl pkcs12命令可用於顯示PKCS#12的內容。

二.PKI的基本概念

1.定義

  • PKI:公鑰基礎設施 Public Key Infrastructure
  • PKI的目的:解決網上身份認證、電子資訊的完整性和不可抵賴性等安全問題,為網路應用提供可靠的安全服務。
  • PKI的任務:確立可信任的數字身份。

2.PKI的組成

  • 證書機構CA,註冊機構RA,證書釋出庫,金鑰備份與恢復,證書撤銷機構

  • 數字認證中心(CA)

    (1)負責發放和管理數字證書

    (2)提供網路身份認證服務、負責證書籤發及簽發後證書生命週期中的所有方面的管理

    (3)維護證書檔案和證書相關的審計
    證書機構的功能:
    在這裡插入圖片描述

  • 註冊機構

    註冊機構(RA)是數字證書註冊審批機構,是認證中心的延伸。

    RA按照特定政策與管理規範對使用者的資格進行審查。
    註冊機構的功能
    在這裡插入圖片描述

  • 證書釋出庫

    用於集中存放CA頒發證書和證書撤銷列表。支援分散式存放,以提高查詢效率。

    LDAP目錄服務支援分散式存放,是大規模PKI系統成功實施的關鍵,也是建立高效的認證機構的關鍵技術。

  • 金鑰備份與恢復

    金鑰備份和恢復只能針對加/解密金鑰,而無法對簽名金鑰進行備份。數字簽名是用於支援不可否認服務的,有時間性要求,因此不能備份/恢復簽名金鑰。

    如果註冊宣告公/私鑰對是用於資料加密的,則CA即可對該使用者的私鑰進行備份。當用戶丟失金鑰後,可通過可信任的金鑰恢復中心或CA完成金鑰恢復。

  • 證書撤銷的兩種實現方法

    (1)證書撤銷列表
    (CRL, Certificate Revocation List)

    (2)線上證書狀態協議
    (OCSP,Online Certificate Status Protocol)

三.數字證書及認證路徑

1.數字證書

1998年,v1版本

1993年,v2版本,比v1版本增加了2個欄位

1996,v3版本(v3格式通過新增其他擴充套件欄位的規定來擴充套件v2格式)。

2.數字證書認證路徑

在這裡插入圖片描述

在這裡插入圖片描述

3.Certificate Revocation證書撤銷

  • 在證書有效期中間,該證書可能無效,如:私鑰丟失
    身份資訊發生變化。應該阻止訂戶停止使用該證書,CA要撤銷該證書。
  • (1)Certificate Revocation List證書撤銷列表
    也要CA進行數字簽名,以實現資料完整性、資料來源鑑別、非否認。
    下圖為已被撤銷的證書資訊
    在這裡插入圖片描述
  • (2)Online Certificate Status Protocol聯機證書撤銷狀態檢查
    在這裡插入圖片描述
    由於CRL的更新是有周期的,所以在證書已經被撤銷,但是CRL還沒有更新的情況下就無法查詢到最新狀態,此時應該使用ocsp來進行實時的查詢。
    請求-應答
    請求:“證書序列號等於****”的狀態如何?
    應答:未撤銷/撤銷/未知
    應答訊息需要伺服器的數字簽名

4.Operational Protocols

  • 需要協議來向使用證書的客戶端系統提供證書和CRL。
    公開證書的方式:
    HTTP/FTP/LDAP/Email等等

5.Management Protocols管理協議

管理協議來支援PKI使用者和管理實體之間的線上互動

  • (a)註冊:這是在CA為該使用者頒發證書或證書之前,使用者首先使CA(直接或通過RA)知道自己的過程。
  • (b)初始化:在客戶端系統可以安全執行之前,必須安裝與儲存在基礎結構中其他位置的金鑰具有適當關係的金鑰材料。例如,客戶端需要使用公鑰和可信CA的其他保證資訊進行安全初始化,以用於驗證證書路徑。此外,客戶端通常需要使用自己的金鑰對進行初始化。
  • (c)認證:這是CA為使用者的公鑰頒發證書,並將該證書返回給使用者的客戶端系統和/或將該證書釋出到儲存庫中的過程。
  • (d)金鑰對恢復:作為選項,使用者客戶端金鑰材料(例如,用於加密目的的使用者私鑰)可以由CA或金鑰備份系統備份。如果使用者需要恢復這些備份的金鑰材料(例如,由於忘記密碼或丟失的金鑰鏈檔案),則可能需要線上協議交換來支援這種恢復。
  • (e)金鑰對更新:所有金鑰對需要定期更新,即用新金鑰對替換,並頒發新證書。
  • (f)撤銷請求:被授權人員向CA通知需要撤銷證書的異常情況。
  • (g)交叉認證:兩個CA交換用於建立交叉證書的資訊。交叉證書是由一個CA頒發給另一個CA的證書,其中包含用於頒發證書的CA簽名金鑰。

四.證書

1.數字證書的具體內容

在這裡插入圖片描述

2.數字證書的整體結構

  • 證書的整體結構:證書內容、簽名演算法、簽名結果。
    用ASN.1語法描述如下:
    在這裡插入圖片描述
  • 簽名演算法為CA對tbsCertificate進行簽名所使用的演算法;型別為AlgorithmIdentifier,其ASN.1語法描述如下
    在這裡插入圖片描述
  • 簽名結果是CA對tbsCertificate進行簽名的結果,型別為BIT STRING。
  • version
    版本號
    版本(version)為整數格式。證書格式的版本只有v1、v2、v3,分別用整數0、1、2表示。其型別Version的ASN.1描述如下:
    Version::=INTEGER {v1(0),v2(1),v3(2)}
  • issuer
    證書的簽發者(issuer):簽發證書的CA實體
  • subject
    證書主體(subject) :證書持有者實體
    證書的簽發者和證書主體用X.509 DN表示,DN是由RDN構成的序列。RDN用“屬性型別=屬性值”的形式表示。常用的屬性型別名稱以及簡寫如下:
  • Serial number
    RFC 3280標準要求證書序列號必須是正整數, 且長度不應該大於20位元組
  • Signature algorithm identifier
    CA簽發證書時所使用的數字簽名演算法, 它的型別與signatureAlgorithm的型別相同, 都為AlgorithmIdentifier,它們的值必須一致,否則該證書無效
  • validity
    包含起、止兩個時間值。 時間值可以使用UTCTime或者GeneralizedTime的形式表示。
  • Subject publickey information
    給出了證書所繫結的加密演算法和公鑰
  • issuerUniqueID
    給出了證書籤發者的唯一識別符號
  • subjectUniqueID
    給出了證書主體的唯一識別符號

3.數字證書的簽名

在這裡插入圖片描述

4.數字證書的驗證

在這裡插入圖片描述

五.數字證書的擴充套件

1.Authority Key Identifier 認證中心金鑰標識

在這裡插入圖片描述

  • CA有多種功能:與RA通訊,簽發訂戶證書,簽發CRL等。不同功能需要不同的證書
  • 認證中心金鑰的作用:標識用來指定CA簽發證書所用私鑰對應的公鑰,也就是指定 了驗證證書時所用的CA證書,有助於證書驗證者更快地找到證書
  • 擴充套件值的ASN.1描述
    在這裡插入圖片描述

2.Subject Key Identifier 主體金鑰標識

  • 訂戶會進行不同安全要求的業務,需要多個金鑰/證書來對應不同的應用。

  • 主體金鑰標識的作用:區分訂戶的各個金鑰/證書對,也就是區分各個公鑰

  • ASN.1描述
    在這裡插入圖片描述

該欄位需要包含在所有證書中

3.Key Usage 金鑰用法

  • 金鑰用法擴充套件的作用:實體擁有多個金鑰證書對,該擴充套件指定證書所對應金鑰的允許用途。
  • ASN.1描述
    在這裡插入圖片描述
  • 具體用法

4.Certificate Policies 證書策略

  • X.509證書是用於安全服務的,應該在證書中區分其安全等級的不同
    (1)安全等級主要是體現在:
    證書產生過程:資訊審查是不是嚴格
    證書使用:所使用領域的安全要求不同
  • (1)證書策略就是用來區分不同證書的安全等級的
    簡稱CP,以OID的形式
    (2)證書策略擴充套件的作用:以OID的形式區分不同證書的安全級別
  • 建立CA時就確定CA所能簽發的證書的CP,如果想要在CA執行中間增加支援新的CP很困難。將CA證書中OID設為2.5.29.32.0,即any-policy
  • CA位置不同,意義不同
    (1)CP出現在CA證書
    CA證書中有5個CP(ABCDE)
    表示該CA可以簽發具有這種CP的訂戶證書
    (2)CP出現在訂戶證書
    Bob證書中的CP是A級
    就說明了Bob證書具有此CP對應的安全等級
  • (1)1個CA可以具有幾種不同的CP。1個CA可以支援多種不同的證書籤發流程,簽發的證書可用於多種安全等級的範圍。
    (2)1個訂戶證書,可以具有幾種不同的CP。簽發流程自然只有1種,但可用於多種安全等級的範圍應用系統檢查的需要。

5.Certificate Mapping 證書對映

在這裡插入圖片描述

6.Subject Alternative Name&&issuer Alternative Name

  • 以上擴充套件用於表示CA/證書主體非X.500 DN形式的身份資訊和名稱表示(如IP地址,電子郵件)
  • 一般情況下設定為非關鍵性擴充套件
    subject和issuer欄位為空時,或者含有重要的需要使用者識別的名稱形式時需設為關鍵欄位

7.Subject Directory Attributes 主體目錄屬性

主體目錄屬性用於表示證書主體在X.500目錄中的屬性

8.Basic Constraint基本限制

  • 基本限制擴充套件用來區分該證書是CA證書還是末端實體證書
  • CA證書給出最大路徑深度,為關鍵性擴充套件
  • 末端實體證書,關鍵或非關鍵擴充套件

*注:x.509 剩餘部分將由身份認證小組其他同學來補充