Crypt32 證書吊銷清單 (CRL) 語意
Crypt32 支援在線撤銷檢查的證書吊銷清單 (CRL) 語意。 本文提供 Crypt32 如何使用 CRL 進行在線撤銷檢查,以及如何使用 CRL 預先擷取和數據分割來改善效能的資訊。
簡介
呼叫 Crypt32 CertGetCertificateChain API 並啟用在線撤銷時,它會嘗試擷取有效的 OCSP 回應或 CRL,如下所示:
- 檢查交握中是否包含有效裝訂 OCSP 回應的時間。
- 檢查我們在使用者的 Cryptnet URL 快取中是否有有效的 OCSP 回應或 CRL。
- 檢查我們在系統存放區中是否有有效的CRL時間,例如HKLM\CA。
- 針對主體憑證 AIA 延伸模組中的 OCSP URL,嘗試從 OCSP 伺服器下載 OCSP 回應。
- 若要成功,請將 OCSP 回應新增至使用者的 Cryptnet URL 快取。
- 針對主體憑證中的CRL CDP延伸模組,嘗試從證書頒發機構單位 (CA) 的CRL伺服器下載CRL。
- 若要成功,請將CRL新增至使用者的 Cryptnet URL 快取。
針對新增至 Cryptnet URL 快取的 CRL,如果 CRL 具有下列擴展名,則會在 CRL 到期之前擷取下一個 CRL:“1.3.6.1.4.1.311.21.4” (下一個 CRL 發佈)。 藉由新增此延伸模組,只會在憑證驗證期間進行初始CRL下載。 如需 Crypt32 如何使用此延伸模組預先擷取下一個 CRL 的詳細資訊,請參閱 CRL 預先 擷取一節。
如果 CA 發出大量憑證,則 CRL 上撤銷的項目數目也可能變得很大,會增加 CRL 的大小。 若要保持 CRL 的大小保持檢查,Microsoft建議並支援透過新增至下載 CRL 的「2.5.29.28」(發行發佈點)延伸模組進行 CRL 分割。 如需 Crypt32 如何透過此延伸模組支援 CRL 分割的詳細資訊,請參閱 CRL 資料 分割一節。
CA 考慮卸除 OCSP 的支援,且僅支援 CRL 需要考慮這會對呼叫已啟用在線撤銷之 CertGetCertificateChain API 的應用程式造成的影響:
- 在第一次驗證時,呼叫端應用程式會視需要執行 CRL 下載,並封鎖 API 完成,直到下載 CRL 為止。
- 對於大量 TLS 伺服器,將會從 CA 的 CRL 伺服器進行對應的大量下載。
- 如果CRL變大,它會對能夠處理大量下載的伺服器產生直接影響。
- CRL 的大小可藉由支援分割的CRL來限制。
- 後續驗證會使用快取的CRL,直到CRL到期為止。 CRL 到期時,將會針對下一個驗證重複上述專案。
- 您可以藉由新增下一個 CRL 發佈延伸模組來避免這種隨選 CRL 下載。
下列各節提供CRL預先擷取和分割的相關信息,以改善只使用CRL的在線撤銷效能。
CRL 預先擷取
編碼的CRL有下列兩個字段,指出CRL何時發佈,以及用戶端在需要擷取下一個已發佈CRL之前可以快取的時間長度。
ThisUpdate GeneralizedTime,
NextUpdate GeneralizedTime OPTIONAL,
如果 遺漏 NextUpdate ,這是要發行的最後一個 CRL,而且永遠不會過期。
CRL 可能包含 「1.3.6.1.4.1.311.21.4」 (下一個 CRL 發佈) 延伸模組,其也會編碼為 GeneralizedTime。 當此延伸模組存在時,Crypt32 會嘗試在此 PublishTime 之後和 NextUpdate 之前預先擷取下一個已發佈的 CRL,如下所示:
給定的, PublishPeriod = NextUpdate – PublishTime
。 下列三個組態參數可用來判斷 PreFetchPeriod 的開始和結尾:
- AfterPublishPreFetchDivisor
- PreFetchPeriod 的開頭會在 PublishTime 之後延遲,方法是除以這個除數的 PublishPeriod。
- 預設值為 10
- BeforeNextUpdatePreFetchDivisor
- PreFetchPeriod 的完成會在 NextUpdate 之前,除以這個除數的 PublishPeriod。
- 預設值為 20
- MinPreFetchPeriod
- 給定的,
PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime
。 只有在 PreFetchPeriod 超過此最小值時,才會啟用預先擷取。 - 預設值為1小時
- 給定的,
根據上述計算的 PreFetchPeriod,每個客戶端都會在此 PreFetchPeriod 中挑選隨機時間,以預先擷取並下載伺服器的已發佈 CRL。
一些範例時間和對應的 PreFetchPeriod 使用預設組態值。
CRL 有效期為兩天,且每天發佈:
ThisUpdate: Nov 05 08:00
NextUpdate: Nov 07 08:00
PublishTime: Nov 06 08:00
PublishPeriod = 24 hours
PreFetchPeriodStartTime = PublishTime + 24/10 (2.4 hours)
PreFetchPeriodFinishTime = NextUpdate – 24/20 (1.2 hours)
PreFetchPeriod = Nov 06 10:24 .. Nov 07 06:48 = 20:24
Clients would randomly pre-fetch in the above PreFetchPeriod.
CRL 有效期限為八天,每四天發佈一次:
ThisUpdate: Nov 03 08:00
NextUpdate: Nov 11 08:00
PublishTime: Nov 07 08:00
PublishPeriod = 96 hours
PreFetchPeriodStartTime = PublishTime + 96/10 (9.6 hours)
PreFetchPeriodFinishTime = NextUpdate – 96/20 (4.8 hours)
PreFetchPeriod = Nov 07 17:36 .. Nov 11 03:12 = 81:36
Clients would randomly pre-fetch in the above PreFetchPeriod
注意
如果用戶端未使用預先擷取的CRL,則上述預先擷取將會停止,直到用戶端為此CRL起始新的隨選下載為止。
CRL 數據分割
本節提供 Crypt32 如何支援 CRL 分割的資訊。
範例
以下是用於CRL資料分割的常見格式化CDP和識別提供者 (IDP) 擴充功能的範例。
針對從 CA 發行之憑證的第一個分割區:
Cert CDP:
[1]CRL Distribution Point
Distribution Point Name:
Full Name:
URL=http://crl.godaddy.com/first.crl
CRL IDP:
Distribution Point Name:
Full Name:
URL=http://crl.godaddy.com/first.crl
Only Contains User Certs=No
Only Contains CA Certs=No
Indirect CRL=No
針對從 CA 發行之憑證的第二個分割區,指向 CDP 和 IDP 中的不同 CRL:
Cert CDP:
[1]CRL Distribution Point
Distribution Point Name:
Full Name:
URL=http://crl.godaddy.com/second.crl
CRL IDP:
Distribution Point Name:
Full Name:
URL=http://crl.godaddy.com/second.crl
Only Contains User Certs=No
Only Contains CA Certs=No
Indirect CRL=No
如您所見,CDP 和 IDP 中使用相同的單一 HTTP CRL URL。 此外,分割的CRL會由CA直接簽署,並同時適用於CA和用戶憑證。
下一節提供IDP和CDP延伸模組的ASN.1編碼詳細數據,以及 Crypt32 支援的內容。
詳細資料
這是發行發佈點 (IDP) 延伸模組的 ASN.1 (“2.5.29.28”):
--------------------------------------------
-- CRL Issuing Distribution Point Extension
--------------------------------------------
IssuingDistributionPoint ::= SEQUENCE {
issuingDistributionPoint [0] EXPLICIT DistributionPointName OPTIONAL,
onlyContainsUserCerts [1] IMPLICIT BOOLEAN DEFAULT FALSE,
onlyContainsCACerts [2] IMPLICIT BOOLEAN DEFAULT FALSE,
onlySomeReasons [3] IMPLICIT ReasonFlags OPTIONAL,
indirectCRL [4] IMPLICIT BOOLEAN DEFAULT FALSE
} --#public—
DistributionPointName ::= CHOICE {
fullName [0] IMPLICIT GeneralNames,
nameRelativeToCRLIssuer [1] IMPLICIT RelativeDistinguishedName
}
GeneralNames ::= SEQUENCE OF GeneralName
GeneralName ::= CHOICE {
otherName [0] IMPLICIT OtherName,
rfc822Name [1] IMPLICIT IA5STRING,
dNSName [2] IMPLICIT IA5STRING,
x400Address [3] IMPLICIT SeqOfAny,
directoryName [4] EXPLICIT NOCOPYANY, -- really Name
ediPartyName [5] IMPLICIT SeqOfAny,
uniformResourceLocator [6] IMPLICIT IA5STRING,
iPAddress [7] IMPLICIT OCTETSTRING,
registeredID [8] IMPLICIT EncodedObjectID
}
如果CRL具有IDP,Windows 用戶端將會繼續,如下所示:
- 忽略具有:
- onlySomeReasons
- indirectCRL
- 僅支援具有 fullName 選項的 IDP。
- CRL CDP 也必須有 fullName 選擇。
- 如果 onlyContainsUserCerts 或 onlyContainsCACerts:
- 使用憑證的基本條件約束延伸來判斷IDP是否適用於憑證。
這是憑證中 CDP 延伸模組的 ASN.1:
--------------------------------------------
-- CRL Distribution Points Extension
--------------------------------------------
CRLDistributionPoints ::= SEQUENCE OF DistributionPoint
DistributionPoint ::= SEQUENCE {
distributionPoint [0] EXPLICIT DistributionPointName OPTIONAL,
reasons [1] IMPLICIT ReasonFlags OPTIONAL,
cRLIssuer [2] IMPLICIT GeneralNames OPTIONAL
}
DistributionPointName see above
Windows 用戶端會:
- 逐一查看IDP的 GeneralName 序列 ,直到符合CDP名稱為止:
- 逐一查看 CDP 的 DistributionPoint 序列:
- 略過 CDP DistributionPoint 具有:
- 原因
- cRLIssuer
- 如果沒有 DistributionPointName 的完整名稱選擇,請略過 CDP DistributionPoint。
- 逐一查看 CDP 的 GeneralNames 序列:
- 檢查IDP和CDP GeneralName 是否符合
- 如果 IsSameGeneralName(),我們有相符專案,且CRL可用於主體憑證。
- 檢查IDP和CDP GeneralName 是否符合
- 略過 CDP DistributionPoint 具有:
- 逐一查看 CDP 的 DistributionPoint 序列:
IsSameGeneralName(IDP_GeneralName,CDP_GeneralName)
IDP 和 CDP 必須有相同的 GeneralName 選擇。 針對相同的選擇,請根據選擇比較 IDP 和 CDP 名稱:
- rfc822Name
- 不區分大小寫的字串比較。 沒有 % 字元正規化。
- dNSName
- 不區分大小寫的字串比較。 沒有 % 字元正規化。
- uniformResourceLocator (URL)
- 不區分大小寫的字串比較。 沒有 % 字元正規化。
- otherName
- 比較 OID 和 OID 特定的二進位值。
- registeredID
- 比較 OID。
- directoryName
- 比較編碼的名稱位元組。
- iPAddress
- 系統會比較編碼的 OCTET 位元組。
- x400Address
- 不支援。
- ediPartyName
- 不支援。
預期會使用 uniformResourceLocator GeneralName 選項。