자체 호스팅 WCF REST 서비스가 있습니다. SSL을 사용하고 브라우저에서 서비스를 사용하고 싶습니다. 나는 블로그 게시물 this을 초기 지점으로 사용했습니다. 기본적으로 다음 단계 :WCF REST. SSL. "클라이언트 인증서가 필요합니다."오류
인증서
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 초에 그것을 해결했습니다 :이 줄을 제거한 후에 모든 것이 작동합니다! ...하지만 클라이언트를 인증해야하므로이 줄이 있어야합니다. 클라이언트 인증과 관련하여 놓친 단계는 무엇입니까? serviceCredentials 섹션에 clientCertificate를 지정해야합니까? 한 가지 더 질문 : 클라이언트 인증서없이 연결이 안전하고 트래픽이 여전히 암호화되어 있습니다. – Sharov
HTTPS를 사용할 때 트래픽이 암호화됩니다. 클라이언트 인증을 사용하면 클라이언트가 서버에 연결할 때 자체를 식별하는 인증서를 제공 할 수 있습니다. (클라이언트 인증서 인증은 은행 업무와 같은 높은 보안 시나리오 외부에서는 일반적으로 사용되지 않습니다.) 서버에서 클라이언트에 대한 인증서를 "지정할"수 없습니다. 클라이언트는 자체 인증서를 제공해야합니다. 서버는 클라이언트 인증서를 제공해야합니다. 자세한 내용은 http://blogs.msdn.com/b/ieinternals/archive/2009/09/03/client-certificate-selection-prompt.aspx를 참조하십시오. – EricLaw