X509 又稱 X509，是密碼學裡公鑰證書的格式標準。X509 證書已應用在包括 TLSSSL 在內的眾多網路協議裡，同時它也用在很多非線上應用場景裡，比如電子簽名服務。X509 證書裡含有公鑰、身份資訊（比如網路主機名，組織的名稱或個體名稱等）和簽名信息（可以是證書籤發機構 CA 的簽名，也可以是自簽名）。 X509 還附帶了證書吊銷列表和用於從最終對證書進行簽名的證書籤發機構直到最終可信點為止的證書合法性驗證演算法。X509 是 ITUT 標準化部門基於他們之前的 ASN1 定義的一套證書標準。 歷史及使用情況 X509 最早與 X500 一起釋出於 1988 年 7 月 3 日。它假設有一套嚴格的層次化的證書頒發機構（CA）。X500 系統僅由主權國家實施，以實現國家身份資訊共享條約的實施目的；而 IETF 的公鑰基礎設施（X509）簡稱 PKIX 工作組將該標準制定成適用於更靈活的網際網路組織。而且事實上 X509 認證指的是 RFC5280 裡定義的 X509 v3，包括對 IETF 的 PKIX 證書和證書吊銷列表，通常也稱為公鑰基礎設施（PKI）。 證書 在 X509 裡，組織機構透過發起（CSR）來得到一份簽名的證書。首先需要生成一對金鑰對，然後用其中的私鑰對 CSR 進行數碼簽署（簽名），並安全地儲存私鑰。CSR 進而包含有請求發起者的身份資訊、用來對此請求進行驗真的公鑰以及所請求證書專有名稱。CSR 裡還可能帶有 CA 要求的其它有關身份證明的資訊。然後 CA 對這個 CSR 進行簽名。 組織機構可以把受信的根證書分發給所有的成員，這樣就可以使用公司的 PKI 系統了。瀏覽器（如 Firefox）或作業系統預裝有可信任的根證書列表，所以主流 CA 釋出的 TLS 證書都直接可以正常使用。瀏覽器的開發者直接影響著它的使用者對 CA 的信任。X509 也定義了 CRL 實現標準。另一種檢查合法性的方式是 OCSP。 證書組成結構 證書組成結構標準用 ASN1（一種標準的語言）來進行描述 X509 v3 數字證書結構如下： 證書 版本號 序列號 簽名演算法 頒發者 證書有效期 此日期前無效 此日期後無效 主題 主題公鑰資訊 公鑰演算法 主題公鑰 頒發者唯一身份資訊（可選項） 主題唯一身份資訊（可選項） 擴充套件資訊（可選項） 證書籤名演算法 數字簽名 所有擴充套件都有一個 ID，由物件識別碼來表達。它是一個集合，並且有一個標記用與指示這個擴充套件是不是決定性的。證書使用時，如果發現一份證書帶有決定性標記的擴充套件，而這個系統並不清楚該擴充套件的用途，那麼要拒絕使用它。但對於非決定性的擴充套件，不認識可以予以忽略。 RFC 1422 給出了 v1 的證書結構 ITUT 在 v2 裡增加了頒發者和主題唯一識別符號，從而可以在一段時間後可以重用。重用的一個例子是當一個 CA 破產了，它的名稱也在公共列表裡清除掉了，一段時間之後另一個 CA 可以用相同的名稱來註冊，即使它與之前的並沒有任何瓜葛。不過 IETF 並不建議重用同名註冊。另外 v2 在 Internet 也沒有多大範圍的使用。 v3 引入了擴充套件。CA 使用擴充套件來發布一份特定使用目的的證書（比如說僅用於程式碼簽名） 所有的版本中，同一個 CA 頒發的證書序列號都必須是唯一的。 擴充套件指定了證書的用途 （及後續版本）定義了一些擴充套件用來指定證書的用途。 它們的多數都來源於 jointisoccitt 2 ds 5 idce 29 OID。在 421 裡定義的幾個常用擴充套件定義如下： Basic Constraints，idce 19， 用於指定一份證書是不是一個 CA 證書。 Key Usage，idce 15，指定了這份證書包含的公鑰可以執行的密碼操作。作為一個例子，它可以指定只能用於簽名，而不能用來進行加密操作。 Extended Key Usage，idce 37，典型用法是用於葉子證書中的公鑰的使用目的。它包括一系列的 OID，每一個都指定一種用途。比如 idpkix 3 1 表示用於伺服器端的 TLSSSL 連線，而 idpkix 3 4 用於 email 的安全操作。 通常情況下，一份證書有多個限制用途的擴充套件時，所有限制條件都應該滿足才可以使用。RFC 5280 裡有對一個同時含有 keyUsage 和 extendedKeyUsage 的證書的例子，這樣的證書只能用在兩個擴充套件中都指定了的用途。比如網路安全服務決定證書用途時會同時對這兩個擴充套件進行判斷 證書副檔名 X509 有多種常用的副檔名。不過其中的一些還用於其它用途，就是說具有這個副檔名的檔案可能並不是證書，比如說可能只是儲存了私鑰。 pem 格式，通常是 Base64 格式的。 cer crt der 通常是二進位制格式的。 p7b p7c PKCS7 SignedData structure without data just certificate s or CRL s p12 PKCS12 格式，包含證書的同時可能還包含私鑰 pfx PFX，PKCS12 之前的格式（通常用 PKCS12 格式，比如由網際網路資訊服務產生的 PFX 檔案） PKCS7 是簽名或加密資料的格式標準，官方稱之為容器。由於證書是可驗真的簽名資料，所以可以用 SignedData 結構表述。 P7C 檔案是退化的 SignedData 結構，沒有包括簽名的資料。 PKCS12 由 PFX 進化而來的用於交換公共的和私有的物件的標準格式。 證書鏈和交叉認證 證書鏈（也就是 RFC 5280 裡的證書路徑）是從終端使用者證書後跟著一系列的 CA 證書，而通常最後一個是自簽名證書，並且有如下關係： 在證書鏈上除最後一個證書外，證書頒發者等於其後一個證書的主題。 除了最後一個證書，每個證書都是由其後的一個證書籤名的。 最後的證書是信任主題，由於是透過可信過程得到的，你可以信任它。 證書鏈用於檢查目標證書（證書鏈裡的第一個證書）裡的公鑰及其它資料是否屬於其主題。檢查是這麼做的，用證書鏈中的下一個證書的公鑰來驗證它的簽名，一直檢查到證書鏈的尾端，如果所有驗證都成功透過，那個這個證書就是可信的。 下面是對 RFC 5280 裡定義的證書路徑合法性演算法的一個簡要介紹，包括對證書的有效期、CRL 等其它額外的檢查。 對於具體的證書來說，有一點需要注意的是它可能存在於很不一樣的兩條或多條證書鏈中，並且都是合法的。這是因為 CA 證書可以來自多個頒發者，或者來自相同頒發者但用不同的私鑰簽發，這樣在 CA 證書上會出現分叉，從而可以出現多條證書鏈。這也是 PKI 之間交叉認證和其它應用的關鍵所在。 看下面的例子： 在這兩個圖裡： 方塊代表證書，加黑的是證書的主題名字。 A B 表示「A 是由 B 簽發的」（更確切地說，A 是由 B 中所載公鑰對應的私鑰簽署的） 相同顏色（透明色和白色除外）的證書具有相同的公鑰 例 1 兩個 PKI 之間的根證書交叉認證 為了讓 PKI2 的使用者證書也得到 PKI1 的信任，CA1 生成一包含 CA2 公鑰的證書 cert21 這時候 cert2 和 cert21 具體相同的主題及公鑰，cert22 User 2 就有了兩條合法的證書鏈：cert22 cert2 and cert22 cert21 cert1。 CA2 也可以生成類似的包含有 CA1 公鑰的證書 cert11，以便 PKI1 的使用者 比如 User 1 的證書能在 PKI2 得到認證。 例 2 CA 證書更新 假設 cert1 和 cert3 具有相同的公鑰，對於 cert5 來說有兩條合法的證書鏈，cert5 cert1 和 cert5 cert3 cert2 cert6 的情況也類似。這樣就允許老的使用者證書可以在新舊兩個根證書之間平滑轉移。 X509 證書樣例 下面是 GlobalSign 頒發的用於 wikipediaorg 以及一些其它 Wikipedia 網站 X509 證書。證書頒發者填在頒發者 Issuer 欄位，主題內容裡是組織機構 Wikipedia 的描述，主題備用名稱是那些採用該證書的伺服器的主機名。主題公鑰裡的資訊表明採用的是橢圓曲線公共金鑰，位於最後的簽名演算法表示它是由 GlobalSign 用其私鑰並採用帶 RSA 加密的 SHA256 演算法進行簽名的。 最終實體證書（或者叫葉子證書） 認證 版本 3 0x2 序號 10e6fc62b7418ad5005e45b6 簽章演演算法 sha256WithRSAEncryption 發行者 CBE OGlobalSign nvsa CNGlobalSign Organization Validation CA SHA256 G2 有效期開始時間 Nov 21 080000 2016 GMT 有效期結束時間 Nov 22 075959 2017 GMT 主體 CUS STCalifornia LSan Francisco OWikimedia Foundation Inc CNwikipediaorg 主體公鑰資訊 subject public key info 公鑰演算法 idecPublicKey 256 位的公鑰 04c92269318ad66ceadac37f2caca5 afc002ea81cb65b9fd0c6d465bc91e edb2ac2a1b4aec807be71a51e0dff7 c74a207b914b200721cecf68658cc6 9d3befd5c1 ASN1 OID prime256v1 NIST CURVE P256 額外資訊 extension 金鑰使用 敏感訊息 critical 是 公鑰用途：數位簽章，金鑰協商 Key Agreement 授權相關訊息 敏感訊息 critical 否 頒發者 URIhttpsecureglobalsigncomcacertgsorganizationvalsha2g2r1crt 線上憑證狀態協定 OCSP URIhttpocsp2globalsigncomgsorganizationvalsha2g2 證書原則 Certificate Policies 敏感訊息 critical 否 policy ID1 1361414146120 CPS URI httpswwwglobalsigncomrepository policy ID2 223140122 基本限制 CAFALSE 憑證撤銷中心 X509v3 CRL Distribution Points 敏感訊息 critical 否 URIhttpcrlglobalsigncomgsgsorganizationvalsha2g2crl 主體備用名稱 敏感訊息 critical 否 DNSwikipediaorg DNSmmediawikiorg DNSmwikibooksorg DNSmwikidataorg DNSmwikimediaorg DNSmwikimediafoundationorg DNSmwikinewsorg DNSmwikipediaorg DNSmwikiquoteorg DNSmwikisourceorg DNSmwikiversityorg DNSmwikivoyageorg DNSmwiktionaryorg DNSmediawikiorg DNSplanetwikimediaorg DNSwikibooksorg DNSwikidataorg DNSwikimediaorg DNSwikimediafoundationorg DNSwikinewsorg DNSwikiquoteorg DNSwikisourceorg DNSwikiversityorg DNSwikivoyageorg DNSwiktionaryorg DNSwmfusercontentorg DNSzerowikipediaorg DNSmediawikiorg DNSwwiki DNSwikibooksorg DNSwikidataorg DNSwikimediaorg DNSwikimediafoundationorg DNSwikinewsorg DNSwikiquoteorg DNSwikisourceorg DNSwikiversityorg DNSwikivoyageorg DNSwiktionaryorg DNSwmfusercontentorg DNSwikipediaorg 在額外訊息中的 金鑰使用目的 敏感訊息 critical 否 目的 1TLS Web 伺服器鑑定 目的 2TLS Web 客戶端鑑定 主體金鑰識別程式碼 Subject Key Identifier 敏感訊息 critical 否 金鑰 id 282A262A578B3BCEB4D6AB54EFD738212C495C36 授權金鑰識別程式碼 X509v3 Authority Key Identifier 敏感訊息 critical 否 金鑰 id96DE61F1BD1C1629531CC0CC7D3B830040E61A7C 簽章演算法 sha256WithRSAEncryption 數位簽章 8bc3edd19d396faf4072bd1e185e30542335 要驗證這個證書，我們需要一個跟該證書頒發者及授權金鑰識別符號 頒發者 CBE OGlobalSign nvsa CNGlobalSign Organization Validation CA SHA256 G2 授權金鑰識別符號 96DE61F1BD1C1629531CC0CC7D3B830040E61A7C 都匹配的中間證書 配置正確的伺服器可以在 TLS 連線建立的握手階段同時提供其中間證書。但是也有可能需要根據證書裡頒發者的 URL 去取得中間證書。 中間證書 下面是證書頒發機構的證書示例。該證書是由下例根證書籤名的用於頒發上例最終實體證書的證書。當然它的主題識別符號跟上例證書的授權金鑰識別符號是相匹配的。 證書 版本 3 0x2 序列號 040000000001444ef04247 簽名演算法 sha256WithRSAEncryption 頒發者 CBE OGlobalSign nvsa OURoot CA CNGlobalSign Root CA 此前無效 Feb 20 100000 2014 GMT 此後無效 Feb 20 100000 2024 GMT 主題 CBE OGlobalSign nvsa CNGlobalSign Organization Validation CA SHA256 G2 主題公鑰資訊 公鑰演算法 rsaEncryption 2048 位的公鑰 00c70e6c3f23937fcc70a59d20c30e 指數 65537 0x10001 X509 v3 擴充套件 X509v3 金鑰使用 關鍵：是 用於：證書籤名，CRL 簽名 基本約束 關鍵：是 證書頒發機構：是 路徑長度限制：0 主題金鑰識別符號 關鍵：否 金鑰 96DE61F1BD1C1629531CC0CC7D3B830040E61A7C 96DE61F1BD1C1629531CC0CC7D3B830040E61A7C 證書策略 關鍵：否 策略 1 任何策略識別符號 CPS URI httpswwwglobalsigncomrepository CRL 分發點 關鍵：否 URIhttpcrlglobalsignnetrootcrl 授權相關資訊 關鍵：否 線上證書狀態協議 OCSP URIhttpocspglobalsigncomrootr1 授權金鑰識別符號 關鍵：否 金鑰：607B661A450D97CA89502F7D04CD34A8FFFCFD4B 簽名演算法 sha256WithRSAEncryption 數字簽名：462aee5ebdae0160373111867174b64649c8 根證書 下面是證書頒發機構的自簽名根證書。它的頒發者和主題是相同的，可以用自身的公鑰進行合法認證。證書認證過程也將在此終止。如果應用已經在它的可信公鑰存貯裡已經含有該公鑰證書，那麼 TLS 連線時的那個最終實體證書是可信的，否則就是不可信的。 證書 版本 3 0x2 序列號 040000000001154b5ac394 Signature Algorithm sha1WithRSAEncryption Issuer CBE OGlobalSign nvsa OURoot CA CNGlobalSign Root CA Validity Not Before Sep 1 120000 1998 GMT Not After Jan 28 120000 2028 GMT Subject CBE OGlobalSign nvsa OURoot CA CNGlobalSign Root CA Subject Public Key Info Public Key Algorithm rsaEncryption PublicKey 2048 bit Modulus 00da0ee6998dcea3e34f8a7efbf18b Exponent 65537 0x10001 X509v3 extensions X509v3 Key Usage critical Certificate Sign CRL Sign X509v3 Basic Constraints critical CATRUE X509v3 Subject Key Identifier 607B661A450D97CA89502F7D04CD34A8FFFCFD4B Signature Algorithm sha1WithRSAEncryption d673e77c4f76d08dbfecbaa2be34c52832b5 安全性 布魯斯施奈爾、彼得古特曼及其他安全專家已經發布了很多 PKI 的安全問題。 架構的弱點 採用黑名單方式的證書吊銷列表 CRL 和線上證書狀態協議 OCSP 如果客戶端僅信任在 CRL 可用的時候信任證書，那就失去離線信任的需求。因此通常客戶端會在 CRL 不可用的情況下信任證書，因而給了那些可以控制通道的攻擊者可乘之機。如谷歌的 Adam Langley 所說，對 CRL 的檢查就像在關鍵時刻斷開的安全帶 在大範圍及複雜的分佈模式下選用 CRL 並不明智 OCSP 由於沒有吊銷狀態的歷史記錄也會出現歧義 聚合問題 代表問題：證書頒發機構沒辦法限制其下屬頒發的證書作出名字及屬性方面的限制。而且在 Internet 上存在著相當多的證書頒發機構，想對他們進行分類和策略上的限制是一項不可能完成的任務。 分佈問題：證書鏈引的下屬頒發機構，橋接頒發機構以及交叉認證使得證書驗證變得非常複雜，需要付出很大的代價。層次式的第三方信任模型作為一種唯一的模型的話，路徑驗證也可能出現含糊不明的情況岐義，這對於已經建立雙邊信任也很不方便。 釋出一個對主機名的擴充套件驗證並不能防止再發佈一個驗證要求低一些的適用於同一個主機名的證書。這就造成了不能對中間人攻擊的有效保護 證書頒發機構問題 即使主題實體購買了擴充套件驗證的證書，他的付出也並不能得到相應的回報，因為這並不能阻止透過更便宜的證書頒發機構購買相同主題內容的證書的行為 證書頒發機構不能給使用者提供主題甚至組織團體上的擔保，無法阻止同名證書 證書有效期應該限制在金鑰強度可保護的範圍內。但這個欄位卻被證書頒發機構誤用為收費依據從而讓使用者處於金鑰可能被破解的情況下 「如果使用者透過一種未定義的證書請求協議去獲得子一個地址不明的，不存在於任何目錄下的證書，那麼你也沒辦法吊銷這個證書。」 參考文獻 外部連結 ITUT Recommendation X509 Information technology Open Systems Interconnection The Directory Publickey and attribute certificate frameworks Category 密碼學標準 Category 加密協議 CategoryITUT 建議書 Category 公鑰密碼學