我有自托管的WCF REST服务。我想使用SSL并从浏览器中获取服务。我使用this博文作为初始点。基本上遵循以下步骤:
创建并注册证书
makecert.exe -sk RootCA -sky签名-pe -n CN = localhost -r -sr LocalMachine -ss根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}
然后我尝试从chrome调用一些方法......没有任何反应。
这是我的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,创建新的证书等等)后,我甚至打破了这个Fiddler行为,所以没有任何作用 - 无论有没有Fiddler ......
1)那么,我错过了哪些步骤?我应该为浏览器创建或导入证书吗?
2)谁负责建立SSL连接,我的意思是谁回应了服务器证书?...我猜这是OS部分(WinInet.dll)。这绝对不是我的服务,因为我没有为服务和客户指定任何证书信息。
3)我应该在serviceCredentials中指定serviceCertificate还是clientCertificate?
提前致谢!
答案 0 :(得分:1)
您的服务器配置为要求客户端向其发送一个标识API的调用方的证书。您已经描述了如何配置服务器以提供标识服务器的证书,但您没有声明您希望客户端进行身份验证。你呢?如果没有,你可能需要摆脱这一行:
<transport clientCredentialType="Certificate" />
服务器通过HTTP.SYS
接受连接(WinINET
是IE使用的客户端堆栈,而不是Chrome)虽然我不知道这与您的问题有什么关系。