2013-12-10 103 views
0

我有自己託管的WCF REST服務。我想使用SSL並使用瀏覽器的服務。我使用this博客文章作爲初始點。基本步驟如下:WCF REST。 SSL。 「客戶端證書是必需的」錯誤

  1. 創建並註冊證書

    makecert.exe -sk RootCA -sky signature -pe -n CN=localhost -r -sr LocalMachine -ss Root MyCA.cer

    makecert.exe -sk server -sky exchange -pe -n CN=localhost -ir LocalMachine -is Root -ic MyCA.cer -sr LocalMachine -ss My MyAdHocTestCert.cer

  2. 證書綁定到端口

    netsh http add urlacl url="https://+:8015/" user=Domain\User

    netsh http add sslcert ipport=0.0.0.0:8015 certhash=somehash appid={601A2F31-E812-479A-B5EA-1B78A9683EE0}

然後我嘗試調用由鉻的一些方法和...什麼都沒發生。

這裏是我的WCF配置:

<bindings> 
     <webHttpBinding> 
     <binding name="NewBinding0"> 
      <security mode="Transport"> 
      <transport clientCredentialType="Certificate" /> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="Security" name="Microsoft.Samples.BasicHttpService.Service"> 
     <endpoint address="https://localhost:8015" binding="webHttpBinding" 
      bindingConfiguration="NewBinding0" name="test" contract="Microsoft.Samples.BasicHttpService.IService" 
      kind="webHttpEndpoint" endpointConfiguration="" /> 
     <endpoint address="https://localhost:8016" binding="mexHttpsBinding" 
      bindingConfiguration="" name="MEX" contract="IMetadataExchange" 
      kind="mexEndpoint" endpointConfiguration="mex" /> 
     </service> 
    </services> 

WCF跟蹤日誌顯示警告:需要客戶端證書。請求中未找到證書。

在使用chrome://net-internals/#events顯示錯誤:

SSL_CERTIFICATES_RECEIVED 
          --> certificates = 
            -----BEGIN CERTIFICATE----- 
       base64 certificate   
            -----END CERTIFICATE----- 


t=1386677875080 [st= 4]  SOCKET_BYTES_SENT 
           --> byte_count = 59 

t=1386677875080 [st= 4]  -SSL_CONNECT 

... (send/receive part)... 

t=1386677875123 [st=47]  SSL_CLIENT_CERT_REQUESTED 

t=1386677875123 [st=47]  SSL_READ_ERROR 
           --> **net_error = -110 (ERR_SSL_CLIENT_AUTH_CERT_NEEDED)** 

... 

這是根據什麼小提琴手回事:

Tunel to localhost:8015 (Standart SSL handshaking) 
**Request** 
CONNECT localhost:8015 HTTP/1.1 
Host: localhost:8015 
.... 
A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters  below. 
.... 

與服務器證書的通用數據標準響應。

握手瀏覽器發送GET請求後,沒有任何有關證書或SSL的信息,結果403 Forbidden。

有趣的是,我第一次做到這一點,我可以設置與ClientCertificate Fiddler和使用Fiddler作爲代理一切正常(仍然直接調用瀏覽器沒有Fiddler沒有工作)。現在經過一些操作(刪除sslcert,創建新證書等),我已經打破了這個提琴手的行爲,所以沒有任何工作 - 有或沒有提琴手...

1)那麼,我錯過了什麼步驟?我應該爲瀏覽器創建還是導入證書?

2)誰負責建立SSL連接,我的意思是誰迴應了服務器證書?......我想這是操作系統部分(WinInet.dll)。這絕對不是我的服務,因爲我沒有爲服務和客戶指定任何證書信息。

3)我應該在serviceCredentials中指定serviceCertificate或clientCertificate嗎?

在此先感謝!

回答

1

你的服務器配置爲要求的客戶端發送它識別API的調用者一個證書。您已經描述瞭如何配置服務器以提供標識服務器的證書,但是您尚未說明您期望客戶端進行身份驗證。你做?如果沒有,你可能需要擺脫這一行:

<transport clientCredentialType="Certificate" />

服務器接受通過HTTP.SYSWinINET是通過IE瀏覽器使用的客戶端堆棧,而不是瀏覽器),但我不知道怎麼說的連接與你的問題有關。

+0

埃裏克,太好了,非常感謝你!你在一秒鐘內解決了這個問題:在我刪除了這一行後,一切正常!......但我也需要驗證客戶端,所以這條線應該是。我錯過了哪些與客戶端身份驗證相關的步驟?我應該在serviceCredentials部分指定clientCertificate嗎?還有一個問題:我說得對,沒有客戶端證書,連接是安全的,流量仍然是加密的? – Sharov

+1

使用HTTPS時流量被加密。客戶端身份驗證允許客戶端在連接到服務器時提供證書來標識自己。 (客戶端證書身份驗證通常不在銀行等高安全性場景中使用)。您不能爲服務器上的客戶端「指定」證書 - 客戶端必須自己提供該證書,如果服務器需要一個客戶端並且客戶端擁有可用的客戶端證書,則通常會執行該證書。有關討論,請參閱http://blogs.msdn.com/b/ieinternals/archive/2009/09/03/client-certificate-selection-prompt.aspx。 – EricLaw