2013-12-10 2 views
0

자체 호스팅 WCF REST 서비스가 있습니다. SSL을 사용하고 브라우저에서 서비스를 사용하고 싶습니다. 나는 블로그 게시물 this을 초기 지점으로 사용했습니다. 기본적으로 다음 단계 :WCF REST. SSL. "클라이언트 인증서가 필요합니다."오류

  1. 인증서

    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}

가 그럼 난 크롬에서 몇 가지 방법을 호출하려고 포트에

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

  • 바인드 인증서를 작성하고 등록 ... 그리고 아무 반응이 없습니다. 클라이언트 인증서가 필요합니다

    <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 추적 로그 경고 보여줍니다

    여기 내 WCF의 설정입니다. 요청에서 인증서를 찾을 수 없습니다. 서버 인증서 공통 데이터와

    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. 
    .... 
    

    표준 응답 :

    여기
    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)** 
    
    ... 
    

    이 피들러에 따라 진행 무엇 :

    chrome://net-internals/#events을 사용하는 동안 오류 보여줍니다.

    핸드 셰이 킹 브라우저가 인증서 또는 SSL에 대한 정보없이 GET 요청을 전송 한 결과 403 금지되었습니다.

    웃기는 부분은 내가 처음 해보니 ClientCertificate로 Fiddler를 설정하고 모든 것이 작동하는 프록시로 Fiddler를 사용할 수 있다는 것입니다. Fiddler없이 브라우저에서 직접 호출해도 작동하지 않았습니다. 이제 몇 가지 조작 (sslcert 삭제, 새로운 certs 만들기 등) 후에도이 Fiddler 동작이 손상되었으므로 Fiddler의 유무에 관계없이 아무 것도 작동하지 않습니다.

    1) 그럼 내가 놓친 단계는 무엇입니까? 브라우저 용 인증서를 만들거나 가져와야합니까?

    2) 누가 SSL 연결을 설정했는지, 누가 서버 인증서로 응답 했습니까? ... 나는 그것이 OS 부분 (WinInet.dll)이라고 생각합니다. 서비스에 대해서도 클라이언트에 대해서도 인증서 정보를 지정하지 않았으므로 확실히 내 서비스가 아닙니다.

    3) serviceCredentials에 serviceCertificate 또는 clientCertificate를 지정해야합니까?

    미리 감사드립니다.

  • 답변

    1

    서버는 클라이언트가 그것에게 API의 발신자를 식별하는 인증서를 보낼 것을 요구하도록 구성되어 있습니다. 서버서버을 식별하는 인증서를 제공하도록 구성했지만 클라이언트가 인증을 받겠다는 내용을 언급하지 않았습니다. 너?

    <transport clientCredentialType="Certificate" />

    서버가 HTTP.SYS를 통해 연결 (WinINET가 크롬 IE 사용하는 클라이언트 스택이다, 그리고) 나는 그건 어떻게 모르겠지만 허용합니다하지 않으면, 당신은 아마이 라인을 제거 할 필요가 귀하의 질문과 관련이 있습니다.

    +0

    에릭, 좋아, 정말 고마워! 당신은 1 초에 그것을 해결했습니다 :이 줄을 제거한 후에 모든 것이 작동합니다! ...하지만 클라이언트를 인증해야하므로이 줄이 있어야합니다. 클라이언트 인증과 관련하여 놓친 단계는 무엇입니까? serviceCredentials 섹션에 clientCertificate를 지정해야합니까? 한 가지 더 질문 : 클라이언트 인증서없이 연결이 안전하고 트래픽이 여전히 암호화되어 있습니다. – Sharov

    +1

    HTTPS를 사용할 때 트래픽이 암호화됩니다. 클라이언트 인증을 사용하면 클라이언트가 서버에 연결할 때 자체를 식별하는 인증서를 제공 할 수 있습니다. (클라이언트 인증서 인증은 은행 업무와 같은 높은 보안 시나리오 외부에서는 일반적으로 사용되지 않습니다.) 서버에서 클라이언트에 대한 인증서를 "지정할"수 없습니다. 클라이언트는 자체 인증서를 제공해야합니다. 서버는 클라이언트 인증서를 제공해야합니다. 자세한 내용은 http://blogs.msdn.com/b/ieinternals/archive/2009/09/03/client-certificate-selection-prompt.aspx를 참조하십시오. – EricLaw