0

ルート証明書とリーフがあります。リーフには、有効なオンライン ロケーションを指す CRL URL OID 拡張子があります。これを行う:

certutil -verify .\leaf.cer

で失敗します

エラー: 返されたリーフ証明書失効ステータスの検証中 失効サーバーがオフラインだったため、失効関数は失効を確認できませんでした。0x80092013 (-2146885613 CRYPT_E_REVOCATION_OFFLINE)

私がこれを行う場合:

certutil -verify .\leaf.cer .\root.cer

その後、検証に合格し、CRL が Fiddler でオンラインから取得されていることがわかります。

私の C# コードでは、次のようにします。

X509Chain childCertChain = new X509Chain();
childCertChain.ChainPolicy.ExtraStore.Add(rootCert);
childCertChain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
childCertChain.ChainPolicy.UrlRetrievalTimeout = TimeSpan.FromSeconds(10);
if (!childCertChain.Build(childCert))
        {
            // The root cert is not in the windows certificate store, that is fine
            if (childCertChain.ChainStatus.Length != 1 || childCertChain.ChainStatus.First().Status != X509ChainStatusFlags.UntrustedRoot)
            {
                throw new Exception("Certificate validation error.");
            }
        }

これにより例外が発生し、chainElements に 2 つの証明書が正しく入力されていても、ChainStatus には次のように表示されます。

OfflineRevocation、RevocationStatusUnknown

また、Fiddler に Web リクエストが表示されません。URL を指定してプログラムで CRL をダウンロードできるので、私のデバッグ環境ではありません。x509Chain.Build を成功させる方法はありますか?

4

1 に答える 1

0

あなたのコードを PC から読んだところ、何が起きているかわかりました。あなたのルート証明書はあなたのシステムで信頼されていません。CERT_E_UNTRUSTEDROOTルート証明書が信頼されていない場合、Windows CryptoAPI がスローします。これに伴い、CryptoAPI は失効チェックを終了し、失効チェックがスキップされたため、CRYPT_E_NO_REVOCATION_CHECKとの 2 つの追加エラーをスローします。CERT_E_UNTRUSTEDROOT信頼されていないルートに加えて、CryptoAPI は他のチェック (制約など) をスキップしますが、それらを報告しません。すべてが正しく、期待どおりです。

信頼されていないルートを許可しようとしていますが、これは間違っています。この方法では (前の段落で述べたように) 他のチェックをスキップし、ロジックが脆弱になるためです。

チェーン設定で信頼されていないルート例外を除外し、CryptoAPI に強制的に検証を続行させ、他のエラーが見つからない場合は成功を返すようにすることができますが、そうしないことを強くお勧めします。

次の 2 つのオプションがあります。

  1. マシン (ローカル システム) によって信頼されるルート証明書を作成します。これは不可能な場合があります。
  2. 関数を直接呼び出しCertCreateCertificateChainEngine、ルート証明書を構造体hRestrictedTrustのメンバーに入れますCERT_CHAIN_ENGINE_CONFIG

Windows を使用している場合は、2 番目の方法が最も安全で信頼性があります。現在、.NETX509Chainはこの機能を実装していません。追加のコーディングが必要ですが、代替手段はあまりありません。

于 2020-04-08T20:48:35.787 に答える