5

認証にスマートカードを使用しています。

SecurityTokenService (認証サービス) は私のマシンでのみホストされています。スマート カードには有効な証明書があり、そのルート証明書もマシンのローカル コンピューター ストアにインストールされています。

メソッドを使用X509Certificate2.Verifyしてサービスで証明書を検証すると、常に が返されfalseます。

X509Certificate2.Verify() メソッドが常に false を返す理由を誰かが理解するのを手伝ってくれますか?

注:X509Chainすべてのフラグ ( X509VerificationFlags.AllFlags) を使用して確認しました。チャニンをビルドすると、 as で返されtrueます。ChainStatusRevocationStatusUnknown


編集1:

Windowsフォームアプリケーションでこのコードを書くと、X509Certificate2.Verify() メソッドが返されることがわかりました。サービス側のコードでのみtrue返されます。falseなんでそうなの?奇妙ですが本当です!

4

2 に答える 2

2

X509VerificationFlags 値は抑制であるため、X509VerificationFlags.AllFlags実際に指定すると、ほとんどの状況で Build が false を返すのを防ぐことができます。

RevocationStatusUnknown応答は特に関連性があるようです。失効していないことを確認できないと報告している証明書はどれでも。Verifyメソッドは次のようにモデル化できます。

public bool Verify()
{
    using (X509Chain chain = new X509Chain())
    {
        // The defaults, but expressing it here for clarity
        chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
        chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
        chain.ChainPolicy.VerificationTime = DateTime.Now;
        chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

        return chain.Build(this);
    }
}

アサートしていないため、X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknownまたはX509VerificationFlags.IgnoreEndRevocationUnknown以外の X509RevocationMode を要求しているためNone、失敗します。

まず、チェーン内のどの証明書が失敗しているかを特定する必要があります。

using (X509Chain chain = new X509Chain())
{
    // The defaults, but expressing it here for clarity
    chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
    chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
    chain.ChainPolicy.VerificationTime = DateTime.Now;

    chain.Build(cert);

    for (int i = 0; i < chain.ChainElements.Count; i++)
    {
        X509ChainElement element = chain.ChainElements[i];

        if (element.ChainElementStatus.Length != 0)
        {
            Console.WriteLine($"Error at depth {i}: {element.Certificate.Subject}");

            foreach (var status in element.ChainElementStatus)
            {
                Console.WriteLine($"  {status.Status}: {status.StatusInformation}}}");
            }
        }
    }
}

Windows CertUI (エクスプローラーまたは証明書 MMC スナップインで .cer をダブルクリック) で失敗した証明書を確認する場合は、「CRL 配布ポイント」という名前のフィールドを探します。これらは、実行時に取得される URL です。おそらく、システムには、これらの特定の値を照会することを許可しないデータ送信制限があります。いつでも Web サービスから Web 要求を発行してみて、証明書サブシステム内にあるというコンテキストなしで URL を取得できるかどうかを確認できます。

于 2016-07-06T16:21:32.483 に答える
0

問題は、プロキシ サーバーと組織のセキュリティ設定にあると思います。WinForm クライアントから機能する正当な理由と、IIS でホストされているコードから機能しない理由を説明できません。

しかし、読者に知らせたいのはVerify()、通常のドメイン外のマシンで実行されている IIS でサービスをホストしたときに、メソッドがサーバー側のコードでも機能したということです。したがって、ドメイン/組織のファイアウォール設定が邪魔になっているかどうかを確認できます。

于 2012-04-30T12:49:06.367 に答える