2014-12-05 151 views
0

我們遇到了WCF的問題 - 嘗試連接時出現以下錯誤。對於各種配置有很多建議,嘗試過所有我們可以使用的幫助。WCF顯示403禁止使用SSL和客戶端證書

我們使用HTTPS傳輸安全性,使用我們從GoDaddy獲得的真實SSL證書。當我們瀏覽網站上的網頁時,它似乎已經安裝並正常工作。沒有身份驗證,我們可以正確連接到我們的WCF服務。

對於認證,我們使用我們自己創建的客戶端證書。在我們切換到HTTPS之前,這些客戶端證書工作正常,當時我們正在使用自簽名服務器證書的消息安全性(這很痛苦,因爲我們必須讓客戶端安裝服務器證書)。

錯誤 HTTP請求被禁止,客戶端身份驗證方案爲「匿名」。 內部異常:遠程服務器返回錯誤:(403)禁止

服務器配置文件

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="NewBinding0"> 
     <security mode="Transport"> 
      <transport clientCredentialType="Certificate" /> 
     </security> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <services> 
    <service name="WcfService1.Service1"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="NewBinding0" contract="WcfService1.IService1" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceCredentials> 
      <clientCertificate> 
      <authentication certificateValidationMode="PeerTrust" /> 
      </clientCertificate> 
      <serviceCertificate findValue="....." x509FindType="FindByThumbprint" /> 
     </serviceCredentials> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
    <add scheme="https" binding="wsHttpBinding" bindingConfiguration="NewBinding0" /> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

客戶端配置文件

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="NewBehavior0"> 
       <clientCredentials> 
        <clientCertificate findValue="customuser1" 
         storeName="TrustedPeople" x509FindType="FindBySubjectName" /> 
       </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="NewBinding0"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Certificate" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://www.insertoursitename.com/WcfService1/Service1.svc" 
      behaviorConfiguration="NewBehavior0" binding="wsHttpBinding" 
      bindingConfiguration="NewBinding0" contract="ServiceReference1.IService1" 
      name="wsHttpBinding_IService1" /> 
    </client> 
</system.serviceModel> 
+0

打開WCF日誌記錄:http://msdn.microsoft.com/en-us/library/ms733025%28v=vs.110%29.aspx – fejesjoco 2014-12-05 19:47:30

+0

服務器日誌沒有任何錯誤,客戶端日誌有:客戶端認證方案「匿名」禁止HTTP請求。 – John 2014-12-05 22:38:28

+0

完整的WCF跟蹤會在客戶端和服務器端產生大量的信息。如果您的服務器沒有日誌,那麼您實際上並未打開WCF跟蹤。或者問題出現在IIS中,並且請求甚至不能到達WCF服務,但即使如此,您應該在客戶端上擁有更多的日誌。無論如何,請檢查IIS服務器是否信任客戶端證書(只需在服務器上打開客戶端證書)。 – fejesjoco 2014-12-05 23:17:41

回答

0

我的問題是你的差不多,並在回答問題之前描述我的情景。

  1. 創建一個簡單的WCF服務(通過自定義綁定,但是這無關緊要)。
  2. 創建使用makecert自簽名的根CA,並且產生了兩個證書tempCertServer.cer用於SSL加密,IIS配置爲需要HTTPS等 - >測試這一部分的工作確定從瀏覽器從不同電腦。
  3. 第二個證書tempCertClient.cer被用作提交給IIS的客戶端證書,配置IIS以要求client-cert等。 - >從瀏覽器測試此部分(最好使用IE,因爲你可以輕鬆清除SSL狀態)。我得到一個提示選擇一個客戶端證書,但從來沒有連接,錯誤是完全一樣的每個問題: 「HTTP請求被禁止客戶端身份驗證方案'匿名'。內部異常:遠程服務器返回一個錯誤:(403)禁止。「
  4. 用正確證書(來自已知CA)替換了tempCertClient,沒有問題,建立了連接並顯示了WCF頁面;無論我用自簽名客戶端證書嘗試了什麼,總會遇到以上錯誤。

浪費一整天試圖++各種設置,在註冊表更改閱讀博客,根據不同的證書存儲放置證書服務器端,更改配置文件的設置等,有沒有解決方案。

答案很簡單,檢查LocalComputer \ Trusted Root Certification Authorities服務器端,並刪除任何非ROOT CA(即:那些不應該在那裏,頒發給不等於已頒發)

客戶端證書本身並不需要安裝在服務器上,只有可以驗證它的根CA必須安裝在LocalComputer \ Trusted Root Certification Authorities服務器端。