Keys
x509 CA 信任問題
我試圖了解 CA、信任和客戶端證書的邏輯。我有一個大致的了解,但很難彌合一些差距。
在假設的情況下,軟體系統可能由
n
機器組成。我想為這個系統生成一個自定義 CA 並讓它自簽名。CA 將由證書和私鑰組成。私鑰將(我假設)在一台機器上保持私密,僅用於製作其他證書,而不用於任何機器間通信。據我了解,以這種方式創建證書的每台機器都必須擁有 CA 的公鑰,以驗證自身以及它嘗試與之通信的其他機器。為了生成 CA 密鑰,我照常製作私鑰並對其進行自簽名。這將生成一個私鑰和一個證書。為了製作客戶端證書,我製作了一個私鑰,然後使用 CA 的證書發出了簽名請求。
以下是我對此的疑問:
- CA的證書實際上是公鑰嗎?如果沒有,它是否包含公鑰?
- 是否每台需要通信的機器都需要擁有 CA 證書的本地副本才能驗證其他證書?
- 我的假設是錯誤的還是不完整的?
感謝您的幫助和理解!
具體而言,讓我們以 RSA 為例。您生成您的密鑰 - 將包含一個公鑰 - 兩個數字(N,e)和一個私鑰(N,d),因此如果您用於
c = m^e mod N
加密 RSA 消息,您可以使用m = c^d mod N
它來解密它。(實際上它不是那麼簡單,您必須擔心混合加密、填充、恆定時間模冪運算)。證書將包含公鑰以及描述組織的數據,所有這些通常都經過加密簽名——通常由另一個受信任的實體簽名,但由他們自己的公鑰簽名的自簽名證書除外。要簽署某人的證書(我將稱之為
cert
),您需要私鑰S = Hash(cert)^d mod N
。但是,要驗證簽名是否正確,您只需要一個公鑰,通過檢查它S^e mod N
是否與原始cert
.所以回答你的問題:
- 證書不是公鑰,但包含 (1) 公鑰以及 (2) 其他辨識資訊(組織是誰,證書應該用於什麼資源),以及 (3) 來自其他受信任組織的簽名.
- 如果您想驗證 say 的證書
https://crypto.stackexchange.com
,您的瀏覽器(或作業系統)最終需要遵循一條信任鏈,以獲取它知道並信任的證書。也就是說,stackexchange 提供的證書有效,*.stackexchange.com
經驗證屬於Stack Exchange, Inc.
在紐約州紐約市以外的地區運營。它由DigiCert High Assurance CA-3
(可能驗證了 Stack Exchange 的身份)簽名。DigiCert High Assurance CA-3 中間證書頒發機構本身由DigiCert High Assurance EV Root CA
. 的公共證書DigiCert High Assurance EV Root CA
是自簽名的,您的作業系統或網路瀏覽器需要它才能信任它(例如,對於可能儲存的作業系統:/etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem
或對於網路瀏覽器/usr/share/ca-certificates/mozilla/DigiCert_High_Assurance_EV_Root_CA.crt
)。- 我想你有它的要點。您使用您廣泛共享的 CA 證書(充當公鑰 + 更多數據)創建一個 CA,而私鑰保密僅用於簽署其他證書。當您的一台機器(稱為 M)需要證書 - 私鑰對(例如,執行 SSL)時,M 創建自己的私鑰和證書籤名請求(CSR) - 基本上是未簽名的證書(技術上它是自簽名的 - 以確保它在 CA 簽名之前沒有被篡改)。CSR 使用 CA 的私鑰安全地發送到電腦,CA 對 CSR 進行簽名以創建簽名證書,然後將其發送回 M。現在 M 可以創建使用證書和自己的私鑰來設置 SSL 連接。