2010-11-23 93 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

太棒了,它現在完美。你說得對,我正在使用自簽名證書。修復此錯誤的另一關鍵技巧是使用Microsoft Service Configuration Editor在app.config中將「NegotiateServiceCredential」切換爲「false」。 – Contango 2010-11-23 16:18:37

+0

請原諒我的無知 - 這條線應該放在客戶端還是服務器端?並在哪個部分的app.config? – 2010-12-27 12:38:36

+3

@Shaul節是serviceBehaviors/behavior/serviceCredentials/clientCertificate您應該將此添加到服務器的app.config – 2010-12-27 14:37:26

34

我通過關閉驗證在我的代碼是這樣解決了這一問題:

client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = 
System.ServiceModel.Security.X509CertificateValidationMode.None; 

client是我服務的參考實例。

3

我在這個相同的問題上遇到了一些困難。我正在使用WIF SDK中的CustomToken-VS2010示例。

該示例沒有app.config,我覺得知道代碼是如何工作的非常有用,所以我花了一些時間來研究這一點。我覺得我應該在這裏展示我的結果。我希望這個信息是有幫助的。

我有同樣的問題。我遇到的問題是「我在哪裏設置此模式?」我很難找到具有這個屬性的對象,這個對象實際上是正確的對象。我終於找到了它作爲的ChannelFactory的一部分:

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

因此,要設置這個地方是的ChannelFactory對象。

運行Visual Studio 2010爲本地管理員,我能得到樣品的工作(有也跑了所有的樣本有關的批處理文件來創建證書等之後)

再次,這不是在生產環境中要做的事情,但知道如何設置服務證書身份驗證模式可能是瞭解整體情況的一件好事。

7

要做的正確的事情是setup your own Dev/Test Trusted Root Certificate並用此簽名您的客戶端和服務證書。

在開發/測試環境中繞過鏈式信任可能「有效」,但您的開發/測試環境現在配置與生產不同,這不是一個好主意,因爲您可能會發現某些測試會產生誤報或漏報。

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> 
0

(以爲我會分享這個以防萬一它可以節省有人在那裏一段時間),我遇到了這個問題,同時運行在WIF的Web應用程序。我解決了我的問題,將我正在使用的x.509證書的副本從「證書/個人/證書」文件夾移動到證書存儲區內的「受信任的根證書頒發機構/證書」文件夾。您可以通過運行Microsoft管理控制檯執行此操作

0

繼上面Aseiu的評論之後,我發現當服務器中的可信存儲缺少證書時,會輸出上述完全相同的錯誤。在研究這個問題時,我還發現,通過查看Windows下的事件查看器,日誌/應用程序將包含一個錯誤,詳細說明它遇到問題的證書。您還可以將活動日誌與服務的SVC日誌中的條目關聯起來。

1

當停用revocationMode幫助時,很可能您錯過了您的根CA的客戶端撤銷列表

makecert -crl -n "CN=CARoot" -r -sv CARoot.pvk CARoot.crl 

這也需要導入到受信任的根證書頒發機構。另見my answer here