如果你對X509證書有深入的理解,請舉手。既然沒有人舉手,讓我們改變這種情況。
證書是一個複雜的話題,通常不被很好理解。本教程旨在通過展示X509證書示例、演示PKI證書等方式改變這種情況。
在本文中,您將獲得對X509證書的良好概述。到最後,您將對它們的工作原理有一個高層次的理解。您不會在一篇文章中成為專家,但到本文結束時,您至少會熟悉正確的術語。
相關文章: 使用Windows證書管理員和PowerShell管理證書
公鑰和私鑰:保護資產
解釋X509證書的任何信息都不完整,如果不首先提到鑰匙。當提到私鑰和公鑰鑰匙等術語時,你可能已經聽說過鑰匙的概念。但是什麼是鑰匙,它又與證書有什麼關係?
為了更容易理解,讓我們通過一個老式的門鎖來解釋鑰匙的概念。
當你購買一把新的門鎖時,該鎖將附帶一把門鑰匙。該鑰匙是唯一的,只有它能打開該鎖。
將鎖本身視為公鑰。安裝後,你、你的家人或路人可以看到門上的鎖。任何人都可以自由地看到它,甚至嘗試打開它,但他們不會成功。要打開它,他們需要插入最初隨鎖附送的獨特門匙。隨鎖附送的獨特門匙是私鑰
。私鑰和公鑰一起被稱為密鑰對。
密鑰交換
當門匙插入鎖中時,你可以將該操作視為交換鑰匙。私鑰(門匙)需要與公鑰(鎖)交換,才能打開門。
在密碼學世界中,你會自由地公開一個公鑰,並保留私鑰給自己。畢竟,你不在乎誰看到了鎖,但你肯定在乎誰能夠打開它(交換鑰匙)。
有幾種不同的鑰匙交換方式,稱為鑰匙交換算法。鑰匙交換算法專注於推導和安全傳輸一個獨特的共享密鑰。
你可能聽說過的兩種流行的鑰匙交換算法是Diffie-Hellman(DH)和橢圓曲線Diffie-Hellman(ECDH)。
鑰匙信任
如果你需要讓某人通過門進入,你會給他們鑰匙(或原始的獨特鑰匙的副本)。你只會把鑰匙給你信任的人。持有私鑰(門匙)的人被信任可以打開門鎖(公鑰)。
鑰匙使用
密鑰用途定義了 X509 憑證的目的,這與憑證將使用的算法相一致。擴展金鑰用途(EKU)定義了公鑰在金鑰用途之外的預期用途。
X509 憑證:公鑰 “容器”
私鑰和公鑰與 X509 憑證的概念有何關聯?把憑證看作是一個公鑰。憑證是 “容器”,它包含了一個公鑰以及關於該公鑰的其他一些信息,例如公鑰發給誰,誰簽署了該鑰匙等等。憑證以 文件 的形式存儲。
稍後我們將介紹一些好的 X509 憑證示例。
您是否曾經見過一個帶有 PEM 或 CER 憑證文件擴展名的文件?那些就是憑證(公鑰)。稍後您將更多地了解這些格式。
單獨的公鑰本身不一定是一個憑證的定義。它是公鑰和相關屬性數據的結合體,才能定義一個憑證。
A certificate provides a standardized and secure format to communicate with specific systems along with the attributes to help validate a key pair trust. How certificates are built are defined within the X.509 standards, as you will read about later.
指紋:憑證的唯一識別符
每個 X509 憑證旨在提供單個主體的識別。憑證應確保每個公鑰都具有唯一識別性。
A certificate thumbprint or fingerprint is a way to identify a certificate, that is shorter than the entire public key. Technically, a serial number is as well but you’ll learn about that when it comes to certification authorities (CAs). The thumbprint is a hash of a DER-encoded certificate in Windows.
用較小的唯一識別符來識別較大的數據集的概念是指紋識別的一般計算主題。 Morgan Simonson’s blog 深入探討了指紋識別。
主题:定义重要的X509证书属性
每个X509证书不仅需要有一个唯一的标识符,还需要回答以下问题。证书主体应该恰好做到这一点。
- 谁应该使用这个证书?
- 应该信任哪个组织?
- 哪个用户应该提供这个证书?
主题可以说是证书中最重要的部分。主题旨在具有由X.500定义的属性,表示证书发给谁或什么。它以专有名称(DN)格式表示。
A certificate subject is a string value that has a corresponding attribute type. For example, the DN for State or Province is st. This attribute type contains the full name of the state or province the subject resides in (e.g. ST=California).
这些属性类型和值格式由ITU-T X.520建议定义。RFC 4519是关于属性类型和值格式的具体建议。
由于X509证书标准不仅仅是规则,而是强烈建议,许多人在定义主题时使用自己的判断。主题应该明确标识您信任的终端实体。如果主题不能代表这一点,那么您如何能够信任使用该公钥的任何内容呢?
换句话说,如果您让多个人使用相同的用户名访问系统,您就无法追究任何特定人员的行为责任。这种做法使证书旨在与之相符的信任模型变得复杂。
您可以在下面的截圖中看到 Windows 如何表示 X509 證書,更具體地說是證書主題。

使用 Cryptext.dll 查看證書的屬性。
主體替代名稱(SAN)
A SAN is a certificate extension that allows you to use one certificate for multiple subjects that’s typically identified with a Subject Key Identifier (SKI). The example below shows some of the SANs Google uses. Adding more domains to a certificate essentially tells the certificate to trust each subject to use the same private key.
A SAN can also have several types other than DNS names called GeneralNames. GeneralNames require the client reading the certificate to support SANs using GeneralNames. Most clients such as web browsers only focus on the DNS name SAN.
您可以在此 X509 證書示例中看到 SAN。

與 Google 證書相關的一些 SAN 屬性。
了解編碼
我們使用許多語言來彼此交流,同樣地,計算機也有它們自己的語言。這種語言是二進制的,不同的編碼方法使得二進制對其他人更易用,就像我們將英語翻譯成其他語言一樣。
編碼具有特定的目的。編碼允許將可讀的擴展值以計算機也可以使用的方式存儲。編碼格式使得計算機更容易存儲和傳輸 X509 證書,同時也允許我們讀取其內容。
計算機擅長處理整數,編碼使您可以將數值轉換為字母數字值或二進制數據。這種轉換對於與計算機一起工作至關重要,證書依賴編碼來正確傳達與計算機相關的正確信息。編碼格式定義了執行這些轉換的標準。
- ASN.1 – 抽象語法表示一(Abstract Syntax Notation One)是證書中每個字段的序列化格式。
- ASCII – ASCII(美國資訊交換標準代碼)為大多數人類可讀通訊中使用的每個計算機控制字符和可打印字符定義了二進制值。
- Base64 – Base64定義了一種在ASCII字符集內編碼二進制內容的方案。這些是您可以在文本編輯器中打開並看到“BEGIN CERTIFICATE”或其他參考文本的證書。
- DER – Distinguished Encoding Rules(DER)定義了另一種專門用於ASN.1數據的連續八位元組的編碼方案。重要的是,DER的編碼輸出不可視為ASCII。
您可以在下面看到編碼方案的差異。請注意,首先顯示的certificate.crt文件具有“——-BEGIN CERTIFICATE——-”的標記,然後是一堆隨機字母和數字,最後以“——-END CERTIFICATE——-”結束。所有字符都是可讀的。第一個證書是Base64編碼的。
現在看看certificate.cer文件的第二個示例。這個文件的內容與Base64證書大不相同。這個X509證書是DER編碼的。

Base64和DER編碼文件的差異。
理解X509證書文件類型
請記住,憑證只是一個公鑰,其包含一些元數據,以文件形式表示。您會在各種類型的文件中找到不同類型的憑證。每種文件類型都由其文件擴展名區分。例如,當我們提到一個KEY文件時,我們指的是其文件擴展名。
下面是您可能需要處理的常見憑證類型及其用途。
在下面的列表中,您會注意到對PKCS的各種引用。PKCS或公鑰密碼學標準是一套定義如何創建各種憑證的標準。欲了解更多信息,請參閱這篇充滿信息的維基百科文章。
- PFX – 這些最常見於Windows環境中,但無論操作系統如何,都是一種標準格式。PFX文件包含一個憑證,公鑰和擴展,以及使用密碼加密的私鑰。PFX由PKCS#12標準定義。
- P12 – 類似於PFX,P12由PKCS#12標準定義。形式上,PKCS#12是PFX格式的後繼者,但在現代加密實現中,兩種文件類型表示的是相同的格式。
- P7B – 一個包含ASN.1憑證的容器,特別是用於證書機構鏈的所有層級的公鑰,正如下面您將了解到的。PKCS#7文件提供了一個單一文件來分發多個公鑰,通常用於在私有PKI中手動建立與CA的信任關係。
- P7C – P7C 文件類型在功能上與 P7B 相同,只是另一個常見的擴展名,用於表示 PKCS #7 文件。
- DER – DER 文件是 DER 編碼的公鑰。
- CER – 公鑰可以是 DER 或 Base64 編碼。CER 文件通常是 DER 編碼的。
- CRT – CRT 通常是 Base64 編碼的,但不能保證。
- KEY – KEY 文件通常是 Base64 編碼的私鑰,無論是否加密。
- PEM – 一個指向 Base64 編碼的證書的引用,雖然多個密鑰可以在單個 PEM 文件中,但通常認為 PEM 文件包含私鑰。最常用於 PEM Base64 編碼的私鑰文件 – 加密或未加密都可以。
- CSR – 用於提交公鑰給 CA 以簽署並發出其他字段,例如序列號,由 PKCS #10 定義。在大多數情況下,CSR 將包含以 Base64 編碼的請求的 ASN.1 結構。
- REQ – 在 Windows 中用於指定生成 CSR 時使用的登錄策略設置。
- CRL – CRL 是一個特定的文件,列出了 CA 撤銷的證書、撤銷狀態和撤銷原因。
公鑰基礎設施(PKI):X509 Cert 生態系統
回想一下之前有人拿著門鎖的鑰匙。在那種情況下,只有一扇門。但是如果你突然發現自己成為數十個或數百個公寓的房東,管理所有的門鎖鑰匙將變得混亂不堪!
而且,租戶不會永遠留在那間公寓。有些人會保留鑰匙或未經授權複製。你需要更換門鎖以防止他們進入。你不再信任前任租戶。
如果你必須管理數百個經常進出的公寓,你該如何應對?答案是建立一個公鑰基礎結構(PKI)。
PKI是一個圍繞管理公鑰的角色、政策和程序的整個生態系統。PKI代表了一套包括分發、使用、管理和移除X509憑證的多個不同關注領域。它基本上包含了在大規模上正確處理和管理憑證所需的一切。
在接下來的部分中,我們將分解PKI的許多常見組件,並解釋每個組件的角色。
證書授權機構(CAs):你的父母
A PKI is primarily built around the concept of managing trust. But since it’s not economical to directly manage hundreds or thousands of trust relationships, you need a mediator.
你需要一個已經經過原始方的支持的第三方。這些第三方調解人被稱為證書授權機構(CAs),由用於簽署給定證書的公鑰衍生的權威密鑰識別(AKI)擴展進行識別。
將你想像成一個孩子,就像一個X509憑證一樣。很可能你的父母教你不要相信陌生人。但是如果你的父母(你信任的人)把你介紹給一個陌生人並告訴你可以相信他們呢?你可能會跟著他們一起並相信這個陌生人。畢竟,如果你的父母相信他們,你也可以相信。
A CA plays the role of your parents. You trust your parents (a CA) and they introduce you to strangers. They do so by signing the stranger’s public key to let you know that you can trust them.
CA的主要角色是充當可信的仲裁者。
發行X509憑證:建立信任
作為一個被廣泛認可的可信實體,CA使間接方之間建立了信任。為了實現方之間的信任,CA會”發行”憑證。當我們談到CA的發行時,實際上指的是CA正在驗證所請求的擴展並附加CA生成的擴展以創建憑證。
當CA發行一個X509憑證時,它將使用自己的私鑰對憑證的公鑰進行數字簽名。通過簽名過程,CA以一種方式標記憑證,告訴每個人它信任這個公鑰。DocuSign提供了關於這個特定概念的很好的概述,並附有一個很好的圖表。這裡有一個很好的概述。
CA生成擴展的另一個例子是每個憑證的序列號,每個序列號根據RFC設計規範必須是唯一的。這是RFC設計規範所要求的。
現代新聞中意外信任的一個例子是惡意使用帶有惡意軟件的PKI。創作者獲得了有效的證書,這些證書在大多數系統中被隱式信任,使得您的系統更難將惡意二進制文件識別為惡意。
撤銷X509證書:取消信任
CA還負責撤銷不再受信任的X509證書。這些撤銷信息由CA發布到證書撤銷列表(CRL)中。撤銷是CA主動使證書失效的一種方式,而不是等待有效期過期。
信任是證書正常運作所必需的關鍵組成部分。分發點通過提供一個參考點來確保信任,用戶可以從發行者那裡下載證書和撤銷列表,並與您正在使用的證書進行比較。
A CRL Distribution Point (CDP) supplies the protocols and locations to obtain CRLs. Updating CRLs is a passive revocation validation method, with pulling updates at scheduled intervals. Online Certificate Status Protocol (OCSP) actively requests the revocation status of a specific certificate by maintaining caches of the CRLs.
儘管CRL或OCSP的撤銷驗證是可用的,但其實施需要客戶端的支持和執行,而這並不總是情況。
分層
A PKI can be made up of multiple CAs or a single CA, these are commonly referred to as tiers.
X509證書鏈接
正如您在上面了解到的,信任是使用證書時的一個主要焦點。相關方必須能夠信任或驗證由可信CA發行的證書。
A great example of how this scales is the The United States Federal PKI public documents. These provide a great reference into maintaining an inter-organization trust relationship using CAs.
X509證書簽名
你經常會聽到一個概念叫做證書簽署,但這到底是什麼意思呢?正如你已經了解的那樣,證書與信任有關。為了建立信任,一個 X509 證書會被一個 CA 簽署。簽署一個證書會給證書分配一個唯一的加密哈希,告訴所有讀取它的各方可以信任它。這是由一個受信任的 CA 簽署的。
在 PKI 階層中,證書是由 CA 簽署的,但這些證書的使用方式取決於由什麼類型的 CA 簽署。
如果一個 PKI 中只有一個 CA,那麼該 CA 就是根 CA。由於沒有其他 CA 存在,該 CA 必須生成自己的自簽證書。然後,該 CA 發行由自己的證書簽署的證書。
如果一個 PKI 中有多個 CA,則所有 CA 都由根 CA 或連接到根 CA 的中間 CA 簽署。
通常,當設備在生成 X509 證書時使用與公鑰對應的私鑰時,這被稱為自簽證書。然而,你也可以請求 CA 使用它自己的私鑰來簽署你的證書。
簽署算法
簽署算法主要用於驗證來自遠程對等方的消息的真實性。數字簽名是一個使用發送者的私鑰加密的哈希函數的消息摘要。接收者使用發送者的公鑰解密數字簽名。然後,接收者可以將接收到的消息的摘要與從數字簽名解密的摘要進行比較。當摘要匹配時,消息的真實性有效。
非對稱加密是能夠生成密文而不需要先知道密鑰的能力。密鑰交換演算法與簽名演算法的結合是非對稱加密的基礎。
以下是數位簽章中常用的主要演算法。
- RSA(Rivest–Shamir–Adleman)
- DSA(Digital Signature Algorithm)
- ECDSA(Elliptic Curve DSA)
CSR(Certificate Signing Requests)
頒發憑證的憑證授權機構(CA)使用憑證簽署請求(CSR),允許客戶提交公鑰以獲得憑證。CA接受CSR並基於配置的發行政策簽發一個簽署的X509憑證。這意味著,您信任的每個CA都隱含著對其簽署的公鑰的信任。
雜湊
雜湊是一個復雜的主題,在這篇文章中我不會詳細介紹它。Computerphile團隊在他們的YouTube頻道上有一個很好的概述。雜湊專注於將輸入對象轉換為唯一的輸出雜湊值。輸出的雜湊值稱為摘要。這意味著即使是微小的改變輸入對象,也會產生一個不同的唯一且不相關的摘要。
現代實現將專注於安全雜湊演算法(SHA)2演算法。需要注意的是,SHA 256、SHA 384和SHA 512被稱為SHA 2。
以下是您可能會見到的常見雜湊演算法列表。
- SHA 256
- SHA 384
- SHA 512
- 消息摘要(MD)5
憑證策略
憑證策略(CP)擴展提供了維護CA的組織的參考,記錄了他們對於特定PKI的實際政策,並應與證書實踐聲明(CPS)對齊,提供維護特定PKI的組織政策。
分發點
證書中識別的另一類分發點是權威信息訪問(AIA)。這些AIA提供了獲取證書簽發者信息的協議和位置,最常見的是簽發CA的公鑰。
摘要
希望現在,當你被問到像本文開頭的問題時,你會更加自信地舉手。但說實話,希望本文能幫助你了解X509證書的複雜性,以及Windows對這些標準的實現。同時幫助你理解一些基本組件,這將有助於你未來處理證書。
至少現在當有人要求你的證書的公鑰時,你可以確認他們是要DER編碼還是Base64編碼,而且他們不會知道,所以你仍然會將兩者都發送給他們。