2010-11-23 18 views
36

WCFクライアントとサーバーの対話を試みているときにこのエラーが表示されます。WCFエラー:「X.509証明書CN = localhostチェーンビルディングに失敗しました...」

The X.509 certificate CN=localhost 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 processed, but terminated in a root certificate which is not trusted by the trust.

SSL証明書をオフにするとすべてが正常に動作します。

答えて

30

証明書に問題があります(自分で署名した証明書を使用していると思われます)。WCFはすべての発行者のチェーンを検証しようとしますが、結局そのチェーンはルートの信頼できる権限で終了します。このチェックを無効にするには、app.configブランチにそのような行を追加します。しかし、この「松葉杖」は生産にserviceBehaviors/behavior/serviceCredentials/clientCertificate

 
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" /> 
+2

偉大な、それは今完全に動作します。あなたは正しいです、私は自己署名証明書を使用していました。このエラーを解決するもう1つの重要な方法は、Microsoftサービス構成エディタを使用してapp.configの "NegotiateServiceCredential"を "false"に切り替えることでした。 – Contango

+0

私の無知 - クライアントやサーバー側に行こうとしている行ですか?そして、app.configのどの部分に? –

+3

@ShaulセクションはserviceBehaviors/behaviour/serviceCredentials/clientCertificateです。これをServerのapp.configに追加する必要があります –

34

を使用すべきではない、私はこのように私のコードで検証をオフにすることで、問題を修正しました:

clientは私のサービス参照のインスタンスである
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = 
System.ServiceModel.Security.X509CertificateValidationMode.None; 

+5

これは私にとってもやっていることです。これは決してあなたのプロダクション環境に入るべきではないことに注意してください! – stvn

+0

あなたのコードではこれをどこに入れましたか? – Jarrette

+6

クライアントプロジェクトに参照 "System.IdentityModel"を追加してコンパイルする必要がありました – Softec

3

私はこの同じ正確な問題でいくつかの問題がありました。私はWIF SDKのCustomToken-VS2010サンプルを使用していました。

サンプルにはapp.configがありません。コードの仕組みがわかっていると感じましたので、私はこれを調査するために時間を費やしました。ここに結果を示すべきだと思う。この情報が役立つことを願っています。

私は同じ問題がありました。私が持っていた問題は「どこでこのモードを設定するのですか?」でした。実際に正しいオブジェクトだったこのプロパティを設定したオブジェクトを見つけるのは困難でした。

using System.ServiceModel.Security; 
: 
ChannelFactory<IEcho> echoChannelFactory = new ChannelFactory<IEcho>(...) 
echoChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 

ので、これを設定する場所がするChannelFactoryオブジェクトである:私は最終的にのChannelFactoryの一部としてそれを発見しました。ローカル管理者としてのVisual Studio 2010を実行して

、私は(など、証明書を作成するために、すべてのサンプルに関連したバッチファイルを実行しても、した後)再び

サンプルが仕事を得ることができた、これは実稼働環境で行うものではありませんしかし、サービス証明書認証モードを設定する方法が分かっているのはおそらく、全体を知るのにかなり良いことです。

+0

'ChannelFactory .Credentials'か' ClientBase .ClientCredentials'のどちらを使うべきかは、チャンネルファクトリ(ダイナミックプロキシを含む)を明示的に使うのか、ある種のコードジェネレータによって作成されたプロキシを(例えばサービスVS-GUIを介した参照)。 – CodeFox

7

正しいことはsetup your own Dev/Test Trusted Root Certificateになり、これでクライアントとサービス証明書に署名します。

Dev/Test環境でのバイパスチェーンの信頼性は "うまくいくかもしれませんが、Dev/Test環境がProductionと異なって設定されています。これは誤検出や偽陰性を引き起こすテストがあります。

3

クライアントアプリケーション(たとえば、App.config)でエンドポイントの動作を追加し、エンドポイントで追加した動作設定を設定します。

<behaviors> 
      <endpointBehaviors> 
      <behavior name="certificateEndpointBehavior"> 
       <clientCredentials> 
       <serviceCertificate>    
        <authentication certificateValidationMode="None" revocationMode="NoCheck"/> 
       </serviceCertificate> 
       </clientCredentials>  
      </behavior> 
      </endpointBehaviors> 
     </behaviors> 

<endpoint address="http://localhost/Invoice.svc" binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_ACKS" contract="Invoice" name="Invoice" 
     behaviorConfiguration="certificateEndpointBehavior" > 

</endpoint> 
+1

これは適切な解決策です。あなたは 'certificateValidationMode'の設定について心配する必要はありません。失効モードのみが必要です。サーバー側の値を設定しても機能しません。コード内のすべてのクライアントエンドポイントをハッキングすることは、あまりにも多くの作業です。 –

0

(思想は、私がこれを共有するだけの場合には、それはそこにいくつかの時間を誰かを節約できます)WIF上のWebアプリケーションを実行している間、私はこの問題にに走りました。私は "証明書/個人/証明書"フォルダから証明書ストア内の "信頼されたルート証明機関/証明書"フォルダに作業していたx.509証明書のコピーを移動することで問題を解決しました。マイクロソフトの管理コンソールを実行することでこれを行うことができます

0

上記のAseiuのコメントに続いて、証明書がサーバーの信頼できるストアから見つからない場合、上記と全く同じエラーが出力されます。この問題の調査では、Windows Logs/Applicationの下のイベントビューアを見ると、問題がある証明書の詳細を示すエラーが含まれていることがわかりました。アクティビティログは、サービスのSVCログのエントリと相互に関連付けることもできます。

1

revocationModeを無効にすると、ルートCAののクライアント無効化リストが失われている可能性が高くなります。

これもまた、信頼されたルート証明機関にインポートする必要があります。 my answer hereも参照してください。

関連する問題