我有自己託管的WCF REST服務。我想使用SSL並使用瀏覽器的服務。我使用this博客文章作爲初始點。基本步驟如下:WCF REST。 SSL。 「客戶端證書是必需的」錯誤
創建並註冊證書
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
證書綁定到端口
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嗎?
在此先感謝!
埃裏克,太好了,非常感謝你!你在一秒鐘內解決了這個問題:在我刪除了這一行後,一切正常!......但我也需要驗證客戶端,所以這條線應該是。我錯過了哪些與客戶端身份驗證相關的步驟?我應該在serviceCredentials部分指定clientCertificate嗎?還有一個問題:我說得對,沒有客戶端證書,連接是安全的,流量仍然是加密的? – Sharov
使用HTTPS時流量被加密。客戶端身份驗證允許客戶端在連接到服務器時提供證書來標識自己。 (客戶端證書身份驗證通常不在銀行等高安全性場景中使用)。您不能爲服務器上的客戶端「指定」證書 - 客戶端必須自己提供該證書,如果服務器需要一個客戶端並且客戶端擁有可用的客戶端證書,則通常會執行該證書。有關討論,請參閱http://blogs.msdn.com/b/ieinternals/archive/2009/09/03/client-certificate-selection-prompt.aspx。 – EricLaw