1. 程式人生 > >自建 CA 中心並簽發 CA 證書

自建 CA 中心並簽發 CA 證書

目錄

文章目錄

CA 認證原理淺析

下面給出一個形象的例子來理解 CA 認證的原理與興起的緣由。

普通的介紹信

​ 假設 A 公司的張三先生要到 B 公司去拜訪,但是 B 公司的所有人都不認識他,他咋辦捏?常用的辦法是帶公司開的一張介紹信,在信中說:“茲有張三先生前往貴公司辦理業務,請給予接洽…云云”。然後在信上敲上A公司的公章。

張三先生到了 B 公司後,把介紹信遞給 B 公司的前臺李四小姐。李小姐一看介紹信上有 A 公司的公章,而且 A 公司是經常和 B 公司有業務往來的,這位李小姐就相信張先生不是歹人了。

引入中介機構的介紹信

回到剛才的話題。如果和 B 公司有業務往來的公司很多,每個公司的公章都不同,那麼前臺就要懂得分辨各種公章,非常麻煩。所以,有某中介公司 C 發現了這個商機。C 公司專門開設了一項 “代理公章” 的業務。

今後,A 公司的業務員去 B 公司,需要帶 2 個介紹信:

  • 介紹信 1:含有 C 公司的公章及 A 公司的公章。並且特地註明:C 公司信任 A 公司。

  • 介紹信 2:僅含有 A 公司的公章,然後寫上:“茲有張三先生前往貴公司辦理業務,請給予接洽…云云”。

你可能會問了,這樣不是增加麻煩了嗎?有啥好處捏?

主要的好處在於,對於接待公司的前臺,就不需要記住各個公司的公章分別是啥樣子的;他/她只要記住中介公司 C 的公章即可。當他/她拿到兩份介紹信之後,先對介紹信 1 的 C 公章,驗明正身;確認無誤之後,再比對介紹信 1 和介紹信 2 的兩個 A 公章是否一致。如果是一樣的,那就可以證明介紹信 2 是可以信任的了。再者,即使是非對稱加密系統,也不能保證公鑰的分發是可靠的。為了防範公鑰分發過程中的中間人攻擊,需要一個可信的 “始祖” 公證人,這就是 CA 機構存在的意義。

基本概念

PKI

PKI(Public Key Infrastructure,公鑰基礎設施),是一種遵循既定標準的金鑰管理平臺,它能夠為所有網路應用提供加密和數字簽名等密碼服務及所必需的金鑰和證書管理體系。簡單來說,PKI 就是利用公鑰理論和技術建立的提供安全服務的基礎設施。PKI 技術是資訊保安技術的核心,也是電子商務的關鍵和基礎技術。PKI 既不是一個協議,也不是一個軟體,它是一個標準,在這個標準之下發展出的為了實現安全基礎服務目的的技術統稱為 PKI。

CA 認證中心(證書籤發)

CA(Certificate Authority,證書授權中心)是 PKI 的 “核心”,負責管理和簽發證書的第三方機構。一般來說,CA 必須是所有行業和所有公眾都信任的、認可的。它負責管理 PKI 下的所有使用者(包括各種應用程式)的證書,把使用者的公鑰和使用者的其他資訊捆綁在一起,並在網上驗證使用者身份。除此之外,CA 還要負責使用者證書的黑名單登記和黑名單釋出。簡單來說,CA 的核心功能就是 “發放” 和 “管理” 數字證書。

X.509 標準

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 標準基礎上發展起來的

  • SSL 公鑰證書
  • 證書廢除列表 CRL(Certificate revocation lists,證書黑名單)

證書

PKI 的目的是使用公鑰機制加密技術來保護通訊的安全,而公鑰演算法涉及到很多的加密引數,同時 PKI 機制中還有對使用者身份的識別的功能。為了滿足這些需求,“證書” 就很自然的出現了。證書本質上是一個 ASCII 文字檔案,它僅是將整個公鑰機制中需要用到的各種資料都打包到一起,進行統一管理和分發。

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:
            b9:cb:1f:9a:a1:8a:cc:5d
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
        Validity
            Not Before: Nov  9 07:27:51 2018 GMT
            Not After : Nov  9 07:27:51 2019 GMT
        Subject: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cc:35:81:fb:bd:0b:85:27:c3:fc:1e:91:74:b6:
                    aa:9e:12:8c:8f:f3:53:83:77:13:cf:e0:ae:af:9f:
                    17:7d:6d:d4:27:b4:3c:27:72:2a:45:68:10:c6:6b:
                    67:53:77:15:8f:b7:2d:f3:33:ab:a1:e7:a2:02:a2:
                    a4:92:00:a1:e6:1e:37:23:ca:b4:5a:40:e6:09:42:
                    a0:6c:5b:fa:6d:15:93:13:3a:95:a1:e6:3a:e7:fb:
                    5e:32:ab:d0:3a:fb:63:2f:2f:18:68:a0:8f:10:77:
                    d9:a1:4d:a3:6e:89:41:b5:45:94:5e:32:f9:c8:36:
                    08:99:b8:aa:b5:73:56:da:21:67:6e:f1:51:b8:ad:
                    ce:7b:4e:06:97:92:f8:38:e9:dd:38:bd:88:b6:04:
                    59:0b:1b:a6:c9:0a:c8:49:8d:84:3f:44:a9:72:2e:
                    bf:4c:48:21:4b:f5:3f:ef:9f:5c:90:9f:ab:f3:fb:
                    c9:20:bc:e3:e8:e6:79:c5:75:1a:45:61:ed:47:ec:
                    56:22:52:94:40:4c:8b:ab:7a:ab:6d:68:ed:e6:09:
                    e3:4f:ef:f3:0e:8c:34:6e:6b:94:21:a1:72:d7:c5:
                    ce:d1:61:f0:bb:13:1d:1c:bf:b4:aa:64:e2:fd:a8:
                    3c:9b:17:9c:df:9d:9b:4e:84:5f:b1:df:d9:22:19:
                    e1:45
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
            X509v3 Authority Key Identifier:
                keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         4a:d2:d0:9e:a6:7e:21:25:d7:20:4b:8d:98:0e:52:15:2d:90:
         d0:bc:45:68:90:72:10:41:b2:40:3c:5d:bb:d4:32:b9:6a:ba:
         a6:95:63:4a:1e:8c:0c:f3:7e:03:d8:4b:57:f5:e8:23:49:ae:
         a7:56:22:49:fc:ee:5c:a9:73:75:06:78:a1:14:75:f1:fa:79:
         b6:7c:89:bc:ec:38:fa:0b:9f:32:0c:47:86:9e:30:3c:85:ae:
         5e:0f:5a:62:a0:b6:51:64:c4:ab:ed:f1:be:78:ff:a9:c1:6e:
         93:4c:79:a8:4b:cd:b8:29:fb:ea:df:4d:e5:09:a9:54:69:89:
         56:a4:d2:1b:74:2c:a7:6c:ac:24:34:3d:9c:1d:6c:c6:64:82:
         71:d5:cc:a7:3e:c3:a6:ae:32:19:bc:29:bb:9b:15:ad:cd:c0:
         67:20:6e:14:2b:9a:fb:82:32:30:84:73:04:65:49:3a:17:48:
         1e:e7:7d:92:e9:fb:9e:71:f0:11:48:39:18:09:7e:4e:62:cb:
         9a:90:6a:fb:27:1f:4c:f4:ac:6b:9b:4c:a7:86:e0:7d:e9:8e:
         d2:f2:d0:ec:f3:09:a7:60:ad:73:0b:1a:db:e1:21:57:cf:3d:
         22:f3:e0:be:e2:67:5d:ea:73:dd:90:7a:dc:47:ea:9f:f7:7d:
         72:e8:25:87

證書的簽發過程

  1. 服務端向第三方 CA 機構提交公鑰、組織資訊、個人資訊等資訊並申請認證;
  2. CA 通過線上、線下等多種手段驗證申請者提供資訊的真實性,如:組織是否存在、企業是否合法,是否擁有域名的所有權等;
  3. 資訊稽核通過,CA 會向申請者簽發認證檔案 — 證書。證書包含以下資訊:申請者公鑰、申請者的組織資訊和個人資訊、簽發機構 CA 的資訊、有效時間、證書序列號等資訊的明文,同時包含一個簽名;CA 使用雜湊函式計算公開的明文資訊的資訊摘要,然後,採用 CA 的私鑰對資訊摘要進行加密,密文即 “簽名”;
  4. 客戶端向服務端發出請求時,服務端響應證書檔案給客戶端;
  5. 客戶端讀取證書中的相關的明文資訊,採用相同的雜湊函式計算得到資訊摘要,然後,利用對應 CA 的公鑰解密簽名資料,對比證書的資訊摘要,如果一致,則可以確認證書的合法性,即公鑰合法;
  6. 客戶端然後驗證證書相關的域名資訊、有效時間等資訊;
  7. 客戶端會內建信任 CA 的證書資訊(包含公鑰),如果 CA 不被信任,則找不到對應 CA 的證書,證書也會被判定非法。

證書 = 公鑰 + 申請者與頒發者資訊 + 簽名

簡單的非對稱加密系統中,客戶端只需要獲得伺服器發放的公鑰即可訪問服務端。CA 體系下的客戶端則需要獲得 CA 機構簽發的伺服器證書以及 CA 機構的公鑰,首先驗證證書的可靠性之後才能獲得服務端的公鑰,繼而訪問服務端。

自建 CA 簽發證書並認證 HTTPS 網站的過程

  • CA 機構生成金鑰對:公鑰 ca.cer,私鑰 ca.key
  • 網站(Server 端)生成私鑰 cert.key
  • 網站將其公鑰及網站資訊(域名/組織 etc.)提交到 CA 機構,CA 機構結合自己的私鑰 ca.key 簽發網站證書 cert.cer
  • 網站配置 Apache/Nginx 載入 cert.key 和 cert.cer 並執行 HTTPS 模組
  • 使用者首次通過瀏覽器訪問網站,網站首先返回 cert.cer,由於 cert.cer 使用 CA 機構的私鑰簽發,因此可以通過儲存在使用者本地的公鑰 ca.cer 進行驗證

在這裡插入圖片描述

  • 使用者驗證 cert.cer 和 ca.cer 的有效性。如果驗證通過,則得到網站的公鑰並以此訪問網站;否則,提示使用者風險資訊

在這裡插入圖片描述

  • 使用者通過網站的公鑰與網站交換對稱加密共享金鑰,進行正式的 SSL 會話

**所以,使用者能夠與網站建立 SSL 通訊的關鍵在於使用者是否擁有 CA 機構的根證書 ca.cer 和網站證書 cert.cer。**使用者拿著 ca.cer 與 cert.cer 驗證,只有通過後,使用者才可以獲得網站真實的公鑰。

使用 OpenSSL 自建 CA 並簽發證書

OpenSSL:是一個強大的安全套接字層密碼庫,利用 OpenSSL 我們可以建立 X.509 證書、證書籤名請求(CSR)和 CRLs(證書回收列表)。

常用指令

  • 生成 RSA 私鑰
openssl genrsa [args] [numbits]

-des: CBC模式的DES加密
-des3: CBC模式的3DES加密
-aes128: CBC模式的AES128加密
-aes192: CBC模式的AES192加密
-aes256: CBC模式的AES256加密
-passout arg    arg為對稱加密(des、3des、aes)的密碼,使用該引數可以省去指令行互動提示輸入密碼環節
-out file       輸出證書私鑰檔案
[numbits]       金鑰長度

example 生成一個1024位的RSA私鑰,並用3DES加密(密碼為1111),儲存為server.key檔案
openssl genrsa -out server.key -passout pass:1111 -des3 1024 
  • 生成證書籤名請求(CSR)
openssl req [options] <infile> outfile

-inform arg      輸入檔案格式 DER、PEM
-outform arg     輸出檔案格式 DER、PEM
-in arg          待處理檔案
-out arg         待輸出檔案
-passin          用於簽名待生成的請求證書的私鑰檔案的解密密碼
-key file        用於簽名待生成的請求證書的私鑰檔案
-keyform arg     DER、NET、PEM
-new             新的請求
-x509            輸出一個X509格式的證書 
-days            X509證書的有效時間  
-newkey rsa:bits 生成一個bits長度的RSA私鑰檔案,用於簽發  
-[digest]        HASH演算法 md5、sha1、md2、mdc2、md4
-config file     指定openssl配置檔案
-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
  • x509 證書操作
openssl x509 [args]    

-inform arg       待處理X509證書檔案格式 DER、NET、PEM
-outform arg      待輸出X509證書檔案格式 DER、NET、PEM
-in arg           待處理X509證書檔案
-out arg          待輸出X509證書檔案
-req              表明輸入檔案是一個"請求籤發證書檔案(CSR)",等待進行簽發 
-days arg         表明將要簽發的證書的有效時間 
-CA arg           指定用於簽發請求證書的根CA證書 
-CAform arg       根CA證書格式(預設是PEM) 
-CAkey arg        指定用於簽發請求證書的CA私鑰證書檔案,預設認為私有金鑰在CA證書檔案裡有
-CAkeyform arg    指定根CA私鑰證書檔案格式(預設為PEM格式)
-CAserial arg     指定序列號檔案(serial number file)
-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
  • CA 簽名
openssl ca [options]:

-selfsign       使用對證書請求進行簽名的金鑰對來簽發證書。即"自簽名",這種情況發生在生成證書的CA客戶端與簽發證書的CA伺服器都是同一臺機器,此時我們可以使用同一個金鑰對來進行"自簽名"
-in file        需要進行處理的PEM格式的證書
-out file       處理結束後輸出的證書檔案
-cert file      用於簽發的根CA證書
-days arg       指定簽發的證書的有效時間
-keyfile arg    CA的私鑰證書檔案
-keyform arg    CA的根私鑰證書檔案格式: PEM、ENGINE 
-key arg        CA的根私鑰證書檔案的解密密碼(如果加密了的話)
-config file    配置檔案

example 利用 CA 證書 ca.crt 簽署請求證書 server.crt:
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

EXAMPLE

img

Step 1. 設定 OpenSSL CA 配置檔案

預設的配置檔案為 /etc/pki/tls/openssl.cnf,每個 CA 中心可以指定一個配置檔案。

cp /etc/pki/tls/openssl.cnf ~/openssl.cnf

修改 ~/openssl.cnf 為:

在這裡插入圖片描述

各配置的含義註釋得比較清楚,需要注意的是 CA 中心的路徑為 /root/demoCA。

Step 2. 搭建 CA 中心

所謂 CA 中心,本質是一個 dir,正如上文提到的 /root/demoCA。它有著擁有固定的目錄結構:

/*
CA 中心目錄結構
-- demoCA/
    |-- index.txt
    |-- newcerts/
    |-- private/
    |-- serial
*/
CERT_DIR=~/demoCA
mkdir -p $CERT_DIR
cd $CERT_DIR
mkdir newcerts private
chmod 700 private

# prepare files
touch index.txt
echo 01 > serial
  • newcerts dir:存放 CA 簽署(頒發)過的數字證書

  • private dir:存放 CA 的私鑰

  • serial file:存放證書序列號,可自定義第一張證書的序號(e.g. 01),之後每新建一張證書,序列號會自動加 1。

  • index.txt file:存放證書資訊

Step 3. 生成 CA 證書的 RSA 私鑰

$ openssl genrsa -passout pass:foobar -des3 -out ~/demoCA/private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
....................+++
..................................................+++
e is 65537 (0x10001)

$ ll ~/demoCA/private/cakey.pem
-rw-r--r--. 1 root root 1751 Nov  9 07:18 /root/demoCA/private/cakey.pem

$ cat ~/demoCA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,B017FD40FE243E30

QKV/gR2rC/E5gogSoDuascRfQKoVUfBekIiTtROUPKmW6R74EYh4SoxRhW1WKNQa
xtD4583SC99aCjrKCETUPrQAijX9wxuL3bSevWzH6Uxba1XX9YEUOMA8vRThR1e4
rK+HKXT/S7w39ku8+YfwjmO64DCkGVl1T35GHe+De2oXxE6gaUbpgz/KZiOuo0yV
1SRHCK03PQ6nYEqMyk67UGT0gQ1NLwEEB4eTZxHkyheTAXrCazAYrSGqTXsx5rCJ
mOU2G63/w/ktbW+YGphk7P4myhvkgNflm/Lh9JOGxrAgjAk6Ay6T7wMT17zKqKYk
j9AqLh36Ph6876PYnxnf2UFMye8yl+boxUlfnc+GA1C2SEXHcucDHcic+ae5tGwy
mltY7EeC0+MB/U1UvdeBZOK1wAoKW5nS7WW5C2Mg9ZJZ1H7FXUk8h9oLwS1sgcVN
hOwsHRJtR8k1+iutcOTnDcN07IWDaCzFQi4Z9K+w1uCIH1Zky2DYixr2HNpmbEFD
CcBDMpmqZD92ReVVW5Taa1i4TB6YgCVKCMysNmTGE9QqiMcCdZQ1jBhN3+Z0SAaR
sHCWK0gOVF6lIdYEk8y6bW1VPgINNzsKL0aX/gt44JBS9Z7xKwJlS1yCNnHVVtZQ
wRd+gwMEPxXq+U8OQsvyBFHCXZWEbLSWAYMsNGU3iH84gNEhEH54PmEtBKRSt6KJ
83BUu+P9wcXBvnc6GncDPXa7+O6xmdKHzdYKrJPLlkW8XL0zOqgnpe6/vx+WZiDN
N4f0ej83VhuwrIfhfC6vU7kTPPcM9fmS0B4NCa6MR6W/Q2Y6NIV+jI3IX6YvyLUA
aPxX2sAirahGpFgMGzAPCNw3Bsqsf7lOsw8baH3jkeCj61PCEQhBwHJRzjl2yuVu
0w3c5kKDepiqlq2hnQtx3XGScDwhrAVitGtTRBhxfZoiy1vLLvB/fye/DLbqP/z3
MnNRSM9rIxYap6Usy0rpBQGyeNAYlpWKhhl3qWQLV84OVkV8cfkp0vEhgstXyIKv
A/klaloD5gCt5WBt/iBjuFxf1W/DfzVD9FAgRG+9qL3ZZBLqs7Q6OPXSISlnaK6r
/uGTHgenPHkdVDN+eWhpMKYAPvwKiBBTq8WIz4zkBJQGxs9JVgEzKmvQXAbcafFj
HWvuykPo3WZ59ACLl59vDoPMNl+Mi11mH0Ye3jsxckWIMCzE3N+INwqdBmF90vbU
jelvO+QFyY4bpx3+T3kJydDIAJSjwRMA+4mPdYlH9hyE9rOLt4ObWY1//5fHEVuw
3SSW3Cf1FTSTsRvyuTm0ORPNogzPsIfnnUFnSoukXYBvFmbXXeWxKbbomzcubjCx
FP5O6/6LVw4V0YOl4E9CAJZ8pcHDRz6uauXM4Ig8MTpHdNyd07o0hC56bD07mTnt
0ifBucs9grQ0mxdCbIl3BNgg2J7mRYpXAtIhXDR9VyGxvoa5cgeKUsdECyAavfJp
xJgvC/0NFWNampB5fhMp9mnLRy7LzqnmHdUJpXntKzfH16Vu6MB3jE8YVORc313v
wFv5k7AiQVAplWBLEU4/opFkB97FuvRlmms5lK2umePezGjPunpobq4Qe5Gwocw2
-----END RSA PRIVATE KEY-----

可見 /root/demoCA/private/cakey.pem 就是一個 RSA 的密(私)鑰。

Step 4. 生成 CA 的根證書(公鑰)

NOTE:下述指令一併完成了 CA 證書籤名請求 & 對證書進行自簽名兩件事情。

$ openssl req -x509 -passin pass:foobar -new -nodes -key ~/demoCA/private/cakey.pem -days 365 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -out ca_01.pem

$ ll
total 8
-rw-r--r--. 1 root root 1289 Nov  9 07:27 ca_01.pem
-rw-r--r--. 1 root root    0 Nov  9 07:17 index.txt
drwxr-xr-x. 2 root root    6 Nov  9 07:17 newcerts
drwx------. 2 root root   22 Nov  9 07:19 private
-rw-r--r--. 1 root root    3 Nov  9 07:17 serial

$ cat ca_01.pem
-----BEGIN CERTIFICATE-----
MIIDizCCAnOgAwIBAgIJALnLH5qhisxdMA0GCSqGSIb3DQEBCwUAMFwxCzAJBgNV
BAYTAlVTMQ8wDQYDVQQIDAZEZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQww
CgYDVQQKDANEaXMxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTAeFw0xODExMDkw
NzI3NTFaFw0xOTExMDkwNzI3NTFaMFwxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZE
ZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQwwCgYDVQQKDANEaXMxGDAWBgNV
BAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMw1gfu9C4Unw/wekXS2qp4SjI/zU4N3E8/grq+fF31t1Ce0PCdyKkVoEMZr
Z1N3FY+3LfMzq6HnogKipJIAoeYeNyPKtFpA5glCoGxb+m0VkxM6laHmOuf7XjKr
0Dr7Yy8vGGigjxB32aFNo26JQbVFlF4y+cg2CJm4qrVzVtohZ27xUbitzntOBpeS
+Djp3Ti9iLYEWQsbpskKyEmNhD9EqXIuv0xIIUv1P++fXJCfq/P7ySC84+jmecV1
GkVh7UfsViJSlEBMi6t6q21o7eYJ40/v8w6MNG5rlCGhctfFztFh8LsTHRy/tKpk
4v2oPJsXnN+dm06EX7Hf2SIZ4UUCAwEAAaNQME4wHQYDVR0OBBYEFHPUtuHJXbnO
cJEFB6PEnC397rijMB8GA1UdIwQYMBaAFHPUtuHJXbnOcJEFB6PEnC397rijMAwG
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAErS0J6mfiEl1yBLjZgOUhUt
kNC8RWiQchBBskA8XbvUMrlquqaVY0oejAzzfgPYS1f16CNJrqdWIkn87lypc3UG
eKEUdfH6ebZ8ibzsOPoLnzIMR4aeMDyFrl4PWmKgtlFkxKvt8b54/6nBbpNMeahL
zbgp++rfTeUJqVRpiVak0ht0LKdsrCQ0PZwdbMZkgnHVzKc+w6auMhm8KbubFa3N
wGcgbhQrmvuCMjCEcwRlSToXSB7nfZLp+55x8BFIORgJfk5iy5qQavsnH0z0rGub
TKeG4H3pjtLy0OzzCadgrXMLGtvhIVfPPSLz4L7iZ13qc92QetxH6p/3fXLoJYc=
-----END CERTIFICATE-----

NOTE:-key 指定了新建證書使用的金鑰檔案;-x509 生成 x509 標準的證書。

Step 5. 檢視 CA 證書的內容

$ openssl x509 -in ca_01.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            b9:cb:1f:9a:a1:8a:cc:5d
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
        Validity
            Not Before: Nov  9 07:27:51 2018 GMT
            Not After : Nov  9 07:27:51 2019 GMT
        Subject: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cc:35:81:fb:bd:0b:85:27:c3:fc:1e:91:74:b6:
                    aa:9e:12:8c:8f:f3:53:83:77:13:cf:e0:ae:af:9f:
                    17:7d:6d:d4:27:b4:3c:27:72:2a:45:68:10:c6:6b:
                    67:53:77:15:8f:b7:2d:f3:33:ab:a1:e7:a2:02:a2:
                    a4:92:00:a1:e6:1e:37:23:ca:b4:5a:40:e6:09:42:
                    a0:6c:5b:fa:6d:15:93:13:3a:95:a1:e6:3a:e7:fb:
                    5e:32:ab:d0:3a:fb:63:2f:2f:18:68:a0:8f:10:77:
                    d9:a1:4d:a3:6e:89:41:b5:45:94:5e:32:f9:c8:36:
                    08:99:b8:aa:b5:73:56:da:21:67:6e:f1:51:b8:ad:
                    ce:7b:4e:06:97:92:f8:38:e9:dd:38:bd:88:b6:04:
                    59:0b:1b:a6:c9:0a:c8:49:8d:84:3f:44:a9:72:2e:
                    bf:4c:48:21:4b:f5:3f:ef:9f:5c:90:9f:ab:f3:fb:
                    c9:20:bc:e3:e8:e6:79:c5:75:1a:45:61:ed:47:ec:
                    56:22:52:94:40:4c:8b:ab:7a:ab:6d:68:ed:e6:09:
                    e3:4f:ef:f3:0e:8c:34:6e:6b:94:21:a1:72:d7:c5:
                    ce:d1:61:f0:bb:13:1d:1c:bf:b4:aa:64:e2:fd:a8:
                    3c:9b:17:9c:df:9d:9b:4e:84:5f:b1:df:d9:22:19:
                    e1:45
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
            X509v3 Authority Key Identifier:
                keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         4a:d2:d0:9e:a6:7e:21:25:d7:20:4b:8d:98:0e:52:15:2d:90:
         d0:bc:45:68:90:72:10:41:b2:40:3c:5d:bb:d4:32:b9:6a:ba:
         a6:95:63:4a:1e:8c:0c:f3:7e:03:d8:4b:57:f5:e8:23:49:ae:
         a7:56:22:49:fc:ee:5c:a9:73:75:06:78:a1:14:75:f1:fa:79:
         b6:7c:89:bc:ec:38:fa:0b:9f:32:0c:47:86:9e:30:3c:85:ae:
         5e:0f:5a:62:a0:b6:51:64:c4:ab:ed:f1:be:78:ff:a9:c1:6e:
         93:4c:79:a8:4b:cd:b8:29:fb:ea:df:4d:e5:09:a9:54:69:89:
         56:a4:d2:1b:74:2c:a7:6c:ac:24:34:3d:9c:1d:6c:c6:64:82:
         71:d5:cc:a7:3e:c3:a6:ae:32:19:bc:29:bb:9b:15:ad:cd:c0:
         67:20:6e:14:2b:9a:fb:82:32:30:84:73:04:65:49:3a:17:48:
         1e:e7:7d:92:e9:fb:9e:71:f0:11:48:39:18:09:7e:4e:62:cb:
         9a:90:6a:fb:27:1f:4c:f4:ac:6b:9b:4c:a7:86:e0:7d:e9:8e:
         d2:f2:d0:ec:f3:09:a7:60:ad:73:0b:1a:db:e1:21:57:cf:3d:
         22:f3:e0:be:e2:67:5d:ea:73:dd:90:7a:dc:47:ea:9f:f7:7d:
         72:e8:25:87

可見新建的 CA 證書內含了與金鑰檔案對應的公鑰資訊。

Step 6. 生成 Server 證書金鑰檔案 & 證書籤名請求

同樣應用了 RSA 機制,創建出 Server 的私鑰及 Server 證書籤名請求檔案。

$ openssl req -newkey rsa:2048 -nodes -keyout client.key -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -out client.csr
Generating a 2048 bit RSA private key
...........................................................................+++
.............................................................................................................................................................................................+++
writing new private key to 'client.key'
-----

$ ll
total 16
-rw-r--r--. 1 root root 1289 Nov  9 07:27 ca_01.pem
-rw-r--r--. 1 root root  989 Nov  9 07:57 client.csr
-rw-r--r--. 1 root root 1704 Nov  9 07:57 client.key
-rw-r--r--. 1 root root    0 Nov  9 07:17 index.txt
drwxr-xr-x. 2 root root    6 Nov  9 07:17 newcerts
drwx------. 2 root root   22 Nov  9 07:19 private
-rw-r--r--. 1 root root    3 Nov  9 07:17 serial

$ cat client.key
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDeyPWkug8CbxK9
lNdise3ta93ao7qqQ4u0kEiVvPUyMH6lWrtoIVDpcita/ycT60AvynscNX4bIwPR
vUfn19A7Y5iMZCI+PsgN+d/3B29QZUXF7ypmeC6OF/b7MAbFrtpSWG6OqS9/rh7a
P0wuYYmoRdrB2MHDpETn+aJZUe+Yj4qvQEl9sr47shfGw6Af6VCxJ8Q89CBKGAQZ
Jg2OykWaf7j8rvN5WqBtRxTuYAS52JSthQcVbd/hc35dg9xXTcRCJp/7vymw95ox
U5VyY0JWI51ih3dUhZOLXeb/ZdBAwtw23WK0wRrhxdmRpyQsOjlp3aNjN1B8y52w
KaOa6VqTAgMBAAECggEAMhAImy6wRsS8+lsjF2uSYsLVhNc8EBzDnRy7IuLmWpPp
MbE04c5yxzK/qWAi4OgBcXvXtFwU7XYt2ojlSqUFhwL3ebzasRAcln9rI7DJA9Du
H++BoKsrEwUxm/qL2wpSxyRWG7rLEK8JAdQtg1Kpw2WHJf5WdGdKkLJZGCdAZxCX
IO0/cEk90uhbCpbbagHmiByTDAenVYyGJG1klpHlt8TCBh1LCepczXw5QXDUmGsY
zlnvjwrKHXO6zzCJGMmpTOkEDKTErcWyE+IlZ7wEfS8bFvVJJIxUzJEBWqde40DR
wXuwqLvXw82sERp0O/j1TRsH48Xiw5LxD8wMq0iwaQKBgQD2NTCAoiPatHXJfaCb
JygPUh9qr1Y5vdGS49WR99s1t8LEfUkfwqziuhoMK/pMqV7GxkfLT6vbJsGvLYvK
C0yXppHkOjb4aKT13brZQr+PTeOY8qDOpZJDii0CpDt0fUej0IONW6ZgIDYb739K
yqRjA8JqQ767w9/jnlCos41jdwKBgQDnpUlnLE7Uk4WyqAPi5z6lsEL/V5QA2E+g
Nny0d7Al2KXN8bzlXwJQfCQIyFdBdJ/0yAYUI7l7DSmS6/pcbg/p3UQYHjRC+BOC
YoHjhqbOmSUNLf7R0Ia28uNdc8jdbiK9kOWXLc/aI31r2aIdlba0PXWCvlaoRTCN
eCmGZZawxQKBgCzCGqEn2LDHoaoRhoLuKWAvo7p3SYuRsGmttYOltVocn/GsfQCj
GV7WSinwTL5nA+3K2f5h63IZp5g7BXCjgTcIdvkwhBHApEx2FKOueLiKhleltAod
G2vf0LLsPEq/A6kKHQAzqxlKgcuuTEvCbwP5CPzcd+4We7sbarpgedGdAoGAEQwZ
7czV9FDy+uXge1dXRexF0fLJApLosTqxTLquLOrXsONEaoDmc7PfFwJfYYLKrsH1
qI/Ee6jJUXWqVBkJdMWC2F+IqxEEpojHVE45gmTE1EZ5RUmaUGZpkxwNQTZ0ugyq
yMhnTn9kIIbApnq5GmSXfEqzp+iHnTGlpK1fPJ0CgYAJWMcxz9ajBQV+bn07/lgY
SAwFGjnMI/kFy0E/kIuxm6+VSkJ5BC+L1qRlmXe/kg7cMvpINxZ6ySy24YO87jn1
rY4cLwqZ+nKTe6ZPbjUFcuPZRbQrvL98eOoUBzdUdrapU1z1POKVIQDB7+MD2q8c
c4VhhRAEpFJqs8xya2ANnw==
-----END PRIVATE KEY-----

$ cat client.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICoTCCAYkCAQAwXDELMAkGA1UEBhMCVVMxDzANBgNVBAgMBkRlbmlhbDEUMBIG
A1UEBwwLU3ByaW5nZmllbGQxDDAKBgNVBAoMA0RpczEYMBYGA1UEAwwPd3d3LmV4
YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3sj1pLoP
Am8SvZTXYrHt7Wvd2qO6qkOLtJBIlbz1MjB+pVq7aCFQ6XIrWv8nE+tAL8p7HDV+
GyMD0b1H59fQO2OYjGQiPj7IDfnf9wdvUGVFxe8qZngujhf2+zAGxa7aUlhujqkv
f64e2j9MLmGJqEXawdjBw6RE5/miWVHvmI+Kr0BJfbK+O7IXxsOgH+lQsSfEPPQg
ShgEGSYNjspFmn+4/K7zeVqgbUcU7mAEudiUrYUHFW3f4XN+XYPcV03EQiaf+78p
sPeaMVOVcmNCViOdYod3VIWTi13m/2XQQMLcNt1itMEa4cXZkackLDo5ad2jYzdQ
fMudsCmjmulakwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAMi72WVtaxwmgeMl
WydHUhDTcrGOKo7ncuwaEfmtH/D8sGBgYY0OFb9vtsNWLdVPt+8JGTqgaXfQLCBp
5J5BcrwbN5EikWrPNU/WdR532Eou6C3kKVoISmSGsg9xQNq1V7LLMO1iLkeP1+lr
cn1Is7He/3+TpHQjo6aF8IMPSjx22UaCaNgESbh81Xp3K7/v/BS2lhAb/HorHBt5
+emwTTrAbk0/q8X22svPUmmu55AdWZ4LZbQETENcsyx+YwmNXFnDk4FbBh1m8+f4
j0jftulqi89iGP8hayNPWqhDLy+RcNoCJ15hZeqpSudJ2xkf/NsUilRm+W4fW5lk
0avPyfs=
-----END CERTIFICATE REQUEST-----

Step 7. 簽發 Server 證書

簽發 Server 證書時,會根據該配置檔案 openssl.cnf 載入 CA 證書並集合 Server 證書籤名請求檔案來完成簽名。

NOTE:所以如果下述指令報錯,建議檢查 openssl.cnf 中各證書檔案路徑配置是否正確。

$ openssl ca -passin pass:foobar -config ~/openssl.cnf -in client.csr -out client-.pem -batch
Using configuration from /root/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Nov  9 08:04:16 2018 GMT
            Not After : Nov  9 08:04:16 2019 GMT
        Subject:
            countryName               = US
            stateOrProvinceName       = Denial
            organizationName          = Dis
            commonName                = www.example.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                B7:3D:8E:E8:2C:D3:48:58:E1:3B:E6:9B:DB:E5:98:8A:C2:12:16:44
            X509v3 Authority Key Identifier:
                keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3

Certificate is to be certified until Nov  9 08:04:16 2019 GMT (365 days)

Write out database with 1 new entries
Data Base Updated

$ cat client-.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
        Validity
            Not Before: Nov  9 08:04:16 2018 GMT
            Not After : Nov  9 08:04:16 2019 GMT
        Subject: C=US, ST=Denial, O=Dis, CN=www.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:de:c8:f5:a4:ba:0f:02:6f:12:bd:94:d7:62:b1:
                    ed:ed:6b:dd:da:a3:ba:aa:43:8b:b4:90:48:95:bc:
                    f5:32:30:7e:a5:5a:bb:68:21:50:e9:72:2b:5a:ff:
                    27:13:eb:40:2f:ca:7b:1c:35:7e:1b:23:03:d1:bd:
                    47:e7:d7:d0:3b:63:98:8c:64:22:3e:3e:c8:0d:f9:
                    df:f7:07:6f:50:65:45:c5:ef:2a:66:78:2e:8e:17:
                    f6:fb:30:06:c5:ae:da:52:58:6e:8e:a9:2f:7f:ae:
                    1e:da:3f:4c:2e:61:89:a8:45:da:c1:d8:c1:c3:a4:
                    44:e7:f9:a2:59:51:ef:98:8f:8a:af:40:49:7d:b2:
                    be:3b:b2:17:c6:c3:a0:1f:e9:50:b1:27:c4:3c:f4:
                    20:4a:18:04:19:26:0d:8e:ca:45:9a:7f:b8:fc:ae:
                    f3:79:5a:a0:6d:47:14:ee:60:04:b9:d8:94:ad:85:
                    07:15:6d:df:e1:73:7e:5d:83:dc:57:4d:c4:42:26:
                    9f:fb:bf:29:b0:f7:9a:31:53:95:72:63:42:56:23:
                    9d:62:87:77:54:85:93:8b:5d:e6:ff:65:d0:40:c2:
                    dc:36:dd:62:b4:c1:1a:e1:c5:d9:91:a7:24:2c:3a:
                    39:69:dd:a3:63:37:50:7c:cb:9d:b0:29:a3:9a:e9:
                    5a:93
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                B7:3D:8E:E8:2C:D3:48:58:E1:3B:E6:9B:DB:E5:98:8A:C2:12:16:44
            X509v3 Authority Key Identifier:
                keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3

    Signature Algorithm: sha256WithRSAEncryption
         be:55:53:6c:80:a6:dc:47:d9:fc:cc:0d:46:c1:48:f7:8a:da:
         74:d9:b3:c3:fe:3e:d1:60:9e:c4:64:e9:5f:9a:ec:72:cd:a7:
         d0:76:4c:96:e2:84:45:9e:f6:d9:fb:d1:c4:6f:8f:ab:95:54:
         a2:37:84:a2:ef:80:30:10:c8:60:3b:c6:76:5c:86:ca:07:84:
         ed:74:7a:41:a9:dd:a7:a4:c8:91:c4:1b:06:1b:fd:a7:59:6a:
         be:02:24:3b:c0:47:92:08:dd:72:5c:d3:d3:3f:ff:64:14:ed:
         72:d3:9c:e9:0d:5c:53:63:33:b4:3d:27:2b:15:07:2b:43:d2:
         c1:6e:8f:9f:61:23:07:f5:b7:d6:98:99:1e:37:57:a3:14:5a:
         93:97:2a:b1:2c:92:e6:c0:a2:3c:80:e4:60:2c:ca:d3:db:0d:
         86:35:19:86:e8:80:fd:30:26:71:92:29:a6:01:c9:52:9a:4a:
         33:5e:32:c9:7d:bb:7d:c5:eb:ee:eb:8d:e7:6d:34:34:73:5b:
         c1:d3:31:45:2e:f4:2b:f6:05:b2:e5:59:b0:2a:8a:64:ef:6e:
         b6:12:79:d5:ca:e1:03:bf:80:14:3a:0e:9c:56:8e:8a:69:24:
         cc:3a:b0:00:6b:b8:39:6b:6a:51:ac:6f:db:52:ac:9a:bf:e0:
         b7:95:18:3f
-----BEGIN CERTIFICATE-----
MIIDmDCCAoCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBcMQswCQYDVQQGEwJVUzEP
MA0GA1UECAwGRGVuaWFsMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEMMAoGA1UECgwD
RGlzMRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20wHhcNMTgxMTA5MDgwNDE2WhcN
MTkxMTA5MDgwNDE2WjBGMQswCQYDVQQGEwJVUzEPMA0GA1UECAwGRGVuaWFsMQww
CgYDVQQKDANEaXMxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAN7I9aS6DwJvEr2U12Kx7e1r3dqjuqpDi7SQ
SJW89TIwfqVau2ghUOlyK1r/JxPrQC/Kexw1fhsjA9G9R+fX0DtjmIxkIj4+yA35
3/cHb1BlRcXvKmZ4Lo4X9vswBsWu2lJYbo6pL3+uHto/TC5hiahF2sHYwcOkROf5
ollR75iPiq9ASX2yvjuyF8bDoB/pULEnxDz0IEoYBBkmDY7KRZp/uPyu83laoG1H
FO5gBLnYlK2FBxVt3+Fzfl2D3FdNxEImn/u/KbD3mjFTlXJjQlYjnWKHd1SFk4td
5v9l0EDC3DbdYrTBGuHF2ZGnJCw6OWndo2M3UHzLnbApo5rpWpMCAwEAAaN7MHkw
CQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2Vy
dGlmaWNhdGUwHQYDVR0OBBYEFLc9jugs00hY4Tvmm9vlmIrCEhZEMB8GA1UdIwQY
MBaAFHPUtuHJXbnOcJEFB6PEnC397rijMA0GCSqGSIb3DQEBCwUAA4IBAQC+VVNs
gKbcR9n8zA1GwUj3itp02bPD/j7RYJ7EZOlfmuxyzafQdkyW4oRFnvbZ+9HEb4+r
lVSiN4Si74AwEMhgO8Z2XIbKB4TtdHpBqd2npMiRxBsGG/2nWWq+AiQ7wEeSCN1y
XNPTP/9kFO1y05zpDVxTYzO0PScrFQcrQ9LBbo+fYSMH9bfWmJkeN1ejFFqTlyqx
LJLmwKI8gORgLMrT2w2GNRmG6ID9MCZxkimmAclSmkozXjLJfbt9xevu643nbTQ0
c1vB0zFFLvQr9gWy5VmwKopk7262EnnVyuEDv4AUOg6cVo6KaSTMOrAAa7g5a2pR
rG/bUqyav+C3lRg/
-----END CERTIFICATE-----

NOTE:-config 指定 CA 中心對應的 openssl.cnf 配置檔案的路徑。

再簡單回顧一下,自建 CA 證書的過程

  1. 自建 CA 中心並生成 CA 證書
  2. 結合 Server 公鑰和 CA 證書籤發 Server 證書
  3. Client 拿著 Server 證書、 CA 公鑰兩張 “證明” 向 Server 端發出 SSL 通訊請求