2011-08-25 15 views
7

私はストアを使用するのではなく、プログラムで証明書を使用しようとしています。私はX509Certificate2のファイル名とパスワードを作成しています。WCF証明書チェーン、プログラムで確認

これは、信頼された人物の証明書ストアにルート証明書を手動で追加したときにうまく動作します。しかし、私はむしろすべての展開でそれを行う必要はありません - 私はむしろそれもプログラムで対処したいと思います。

証明書ストアからルート証明書を削除すると例外が発生します。

私が読んだことはすべて、証明書ストアにルート証明書を手動で追加する必要があると思われます。そうしないと、信頼チェーンが機能しません。

質問:プログラムを使用してトラストチェーンを設定する方法はありますか?手動で行う必要はありません。私はクライアントを使用しようとするとoccures

 var serverCert = new X509Certificate2("FullPathToMyCertificate.cer", "Password"); 
     Client.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert; 

例外、次のとおりです:

コードは次のようになります

System.IdentityModel.Tokens.SecurityTokenValidationException 

The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US is not in the trusted people store. 
The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority. 

答えて

4

使用コンポーネントは、デフォルトではチェーンを検証 - ときチェーンその例外が発生したことを確認することはできません。 あなたはコード内のチェーンの検証を含むすべてのものをしたいなら、あなたはimplement "custom validation" and integrate that into the WCF Hostする必要があります:

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.Custom; 
Client.ServiceCertificate.Authentication.CustomCertificateValidator = 
    new MyCertificateValidator(); 

別のオプションを完全に検証を無効にするだろう(生産のためをしない!!!

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.None; 

EDIT - コメントの後:

検証しますあなた自身がチェーンX509ChainX509Storeを見てみるべきです - そのようなチェーン検証がどのように実装されるかを知るにはのVerifyを参照してください...基本的にFindメソッドを使用して、X509Certificate2Collectionを親として検索しますカスタム検証付きの検証基準はあなた次第です(有効な署名、期限切れではありません...)。 MSDNで

いくつかの参照リンク:迅速な対応、ヤヒアのために非常に多くの

+0

感謝。それで、** CustomCertificateValidator **を使用しないときに発生するデフォルト動作を模倣するが、ルート証明書を信頼できる人の証明書ストアに手動で追加した** CustomCertificateValidator **を実装したいとします。 ** CustomCertificateValidator **には何を入れますか?おそらく、デフォルトの動作では、Trusted Peopleのルート証明書に対して** serverCert **が評価され、OKが決定され、クライアントは応答を受信します。この評価をするにはどうすればよいですか?もう一度おねがいします、スティーブ。 – Steve

+0

ここでクライアントは何を参照していますか(たとえばClient.ServiceCertificate。)、naespaceしてください。どうもありがとう。 – iTSrAVIE

+1

これは名前空間ではありません。このコードでは、System.ServiceModel.ClientBase <>から派生したクラスに属していることを前提としています。この "ClientBase"は、単に '.ServiceCertificate'、 '.Authentication' then 'を実行できる' ClientCredentials 'プロパティを公開しています。あなたが正確に知る必要がある場合、ServiceCertificateはクラスX509CertificateRecipientClientCredentialです – quetzalcoatl

関連する問題