CA 証明書はルート証明書ストアにないため、RemoteCertificateValidationCallback()内にSslPolicyErrors.RemoteCertificateChainErrorsのエラー フラグが設定されます。ローカルストアを使用していないため、独自のX509Certificate2Collectionに対して証明書チェーンを明示的に検証する可能性があります。
if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
{
X509Chain chain0 = new X509Chain();
chain0.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
// add all your extra certificate chain
chain0.ChainPolicy.ExtraStore.Add(new X509Certificate2(PublicResource.my_ca));
chain0.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;
isValid = chain0.Build((X509Certificate2)certificate);
}
また、コールバックで渡されたチェーンを再利用し、余分な証明書をExtraStoreコレクションに追加し、信頼されていない証明書をチェーンに追加するために必要なAllowUnknownCertificateAuthorityフラグで検証することもできます。
また、信頼できるルート ストアに CA 証明書をプログラムで追加することで、元のエラーを防ぐこともできます (もちろん、新しい信頼できる CA ルートをグローバルに追加することはセキュリティ上の大きな問題であるため、ポップアップが開きます)。
var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
X509Certificate2 ca_cert = new X509Certificate2(PublicResource.my_ca);
store.Add(ca_cert);
store.Close();
EDIT:あなたのCAでチェーンを明確にテストしたい人のために:
もう 1 つの可能性は、ライブラリを使用しBouncyCastle
て証明書チェーンを構築し、信頼を検証することです。オプションは明確で、エラーは理解しやすいです。成功した場合はチェーンを構築しますが、そうでない場合は例外が返されます。以下のサンプル:
// rootCerts : collection of CA
// currentCertificate : the one you want to test
var builderParams = new PkixBuilderParameters(rootCerts,
new X509CertStoreSelector { Certificate = currentCertificate });
// crls : The certificate revocation list
builderParams.IsRevocationEnabled = crls.Count != 0;
// validationDate : probably "now"
builderParams.Date = new DateTimeObject(validationDate);
// The indermediate certs are items necessary to create the certificate chain
builderParams.AddStore(X509StoreFactory.Create("Certificate/Collection", new X509CollectionStoreParameters(intermediateCerts)));
builderParams.AddStore(X509StoreFactory.Create("CRL/Collection", new X509CollectionStoreParameters(crls)));
try
{
PkixCertPathBuilderResult result = builder.Build(builderParams);
return result.CertPath.Certificates.Cast<X509Certificate>();
...