WCF REST。 SSL。 “需要客户端证书”错误

时间:2013-12-10 13:00:22

标签: wcf https ssl-certificate wcf-security fiddler

我有自托管的WCF REST服务。我想使用SSL并从浏览器中获取服务。我使用this博文作为初始点。基本上遵循以下步骤:

  1. 创建并注册证书

      

    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

  2. 将证书绑定到端口

      

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

         

    netsh http add sslcert ipport = 0.0.0.0:8015   CERTHASH = somehash   APPID = {601A2F3​​1-E812-479A-B5EA-1B78A9683EE0}

  3. 然后我尝试从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?

    提前致谢!

1 个答案:

答案 0 :(得分:1)

您的服务器配置为要求客户端向其发送一个标识API的调用方的证书。您已经描述了如何配置服务器以提供标识服务器的证书,但您没有声明您希望客户端进行身份验证。你呢?如果没有,你可能需要摆脱这一行:

<transport clientCredentialType="Certificate" />

服务器通过HTTP.SYS接受连接(WinINET是IE使用的客户端堆栈,而不是Chrome)虽然我不知道这与您的问题有什么关系。