Crypt32 証明書失効リスト (CRL) セマンティクス
Crypt32 では、オンライン失効チェック用の証明書失効リスト (CRL) セマンティクスがサポートされています。 この記事では、Crypt32 がオンライン失効チェックに CRL を使用する方法と、CRL のプリフェッチとパーティション分割を使用してパフォーマンスを向上させる方法について説明します。
はじめに
Crypt32 CertGetCertificateChain API がオンライン失効を有効にして呼び出されると、次のように有効な時刻の OCSP 応答または CRL の取得が試みられます。
- 有効なホチキス止めされた OCSP 応答がハンドシェイクに含まれているかどうかを確認します。
- ユーザーの Cryptnet URL キャッシュに時間有効な OCSP 応答または CRL があるかどうかを確認します。
- HKLM\CA などのシステム ストアに時間有効な CRL があるかどうかを確認します。
- サブジェクト証明書の AIA 拡張機能の OCSP URL の場合は、OCSP サーバーから OCSP 応答のダウンロードを試みます。
- 成功するには、ユーザーの Cryptnet URL キャッシュに OCSP 応答を追加します。
- サブジェクト証明書の CRL CDP 拡張機能の場合は、証明機関 (CA) の CRL サーバーから CRL のダウンロードを試みます。
- 成功するには、CRL をユーザーの Cryptnet URL キャッシュに追加します。
Cryptnet URL キャッシュに追加された CRL の場合 CRL の拡張子が "1.3.6.1.4.1.311.21.4" (次の CRL 発行) の場合、次の 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 ダウンロードを実行し、CRL がダウンロードされるまで API の完了をブロックします。
- 大量の TLS サーバーの場合、CA の CRL サーバーから対応する大量のダウンロードが行われます。
- CRL が大きくなると、大量のダウンロードを処理できるサーバーに直接影響します。
- CRL のサイズは、パーティション分割された CRL をサポートすることによって制限できます。
- 以降の検証では、CRL の有効期限が切れるまで、キャッシュされた CRL が使用されます。 CRL の有効期限が切れると、次の検証のために上記が繰り返されます。
- このオンデマンド CRL のダウンロードは、次の CRL 発行拡張機能を追加することで回避できます。
以降のセクションでは、CRL のみを使用するオンライン失効のパフォーマンスを向上させるために、CRL のプリフェッチとパーティション分割について説明します。
CRL プリフェッチ
エンコードされた CRL には、CRL が公開された日時と、次に公開された CRL を取得する前にクライアントがキャッシュできる期間を示す次の 2 つのフィールドがあります。
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
。 次の 3 つの構成パラメーターを使用して、 PreFetchPeriodの開始と終了を決定します。
- AfterPublishPreFetchDivisor
- PreFetchPeriod の開始は、PublishTime PublishPeriod をこの除数で除算することによって遅延します。
- 既定値は 10
- BeforeNextUpdatePreFetchDivisor
- PreFetchPeriodの終了は、NextUpdatePublishPeriod をこの除数で除算することによって発生します。
- 既定値は 20
- MinPreFetchPeriod
- 指定すると、
PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime
。 プリフェッチは、 PreFetchPeriod がこの最小値を超えた場合にのみ有効になります。 - 既定値は 1 時間
- 指定すると、
上記の計算 PreFetchPeriodでは、クライアントごとにこの PreFetchPeriod 内でランダムな時間が選択され、公開された CRL がサーバーからプリフェッチおよびダウンロードされます。
既定の構成値を使用した時刻の例と対応する PreFetchPeriod 。
CRL は 2 日間有効であり、毎日発行されます。
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 は 8 日間有効で、4 日ごとに公開されます。
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
Note
プリフェッチされた CRL がクライアントによって使用されていない場合、クライアントがこの CRL の新しいオンデマンド ダウンロードを開始するまで、上記のプリフェッチは停止されます。
CRL パーティション分割
このセクションでは、Crypt32 が CRL パーティション分割をサポートする方法について説明します。
例
CRL パーティション分割に使用される一般的にフォーマットされた CDP および ID プロバイダー (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 から発行された証明書の 2 番目のパーティションでは、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 の両方で同じ 1 つの http CRL URL が使用されています。 また、パーティション分割された CRL は CA によって直接署名され、CA とエンド ユーザー証明書の両方に適用されます。
次のセクションでは、IDP および CDP 拡張機能の ASN.1 エンコードと、Crypt32 でサポートされる内容について詳しく説明します。
詳細
これは、発行元配布ポイント (IDP) 拡張機能 ("2.5.29.28") の ASN.1 です。
--------------------------------------------
-- 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 クライアントは次のように処理します。
- 次の IDP を無視します。
- 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 クライアントは次の手順を実行します。
- CDP 名と一致するまで、IDP の GeneralNames のシーケンスを反復処理します。
- CDP の一連の DistributionPoints を反復処理します:
- CDP DistributionPoint をスキップします 次の内容が含まれます。
- reasons
- cRLIssuer
- CDP DistributionPoint をスキップfullName がない場合はDistributionPointNameに選択します。
- CDP の一連の GeneralNames を反復処理します:
- IDP と CDP GeneralName が一致するかどうかを確認する
- IsSameGeneralName()場合、一致があり、サブジェクト証明書に CRL を使用できます。
- IDP と CDP GeneralName が一致するかどうかを確認する
- CDP DistributionPoint をスキップします 次の内容が含まれます。
- CDP の一連の DistributionPoints を反復処理します:
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 の選択が使用されることを想定しています。