2010-08-10 6 views
7

WCF 서비스 (NetTcpBinding)를 개발 중이며 보안없이 정상적으로 작동합니다. 우리는 DigiCert에서 인증서를 구입하여 서버에 설치하고 DigicertUtil.exe로 구성했습니다. 또한 테스트 클라이언트 시스템에 설치됩니다.유효성 검사 절차에 따라 원격 인증서가 유효하지 않습니다.

보안을 켜면 문제없이 내 dev PC에서 연결할 수 있습니다.

서버 설정 :

binding.Security.Mode = SecurityMode.Transport; 
    binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; 
    binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign; 
    ServerHost.Credentials.ServiceCertificate.SetCertificate(
       StoreLocation.LocalMachine, 
       StoreName.My, 
       X509FindType.FindBySubjectName, 
       Properties.Settings.Default.CertificateName); 

클라이언트 설정 : (. 내가 고객의 개인 정보를 유지하는 도메인 및 서비스 이름을 변경)

<binding name="EndPointTCP" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" 
       hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="1610612736" 
       maxReceivedMessageSize="1610612736"> 
       <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="false" inactivityTimeout="00:10:00" enabled="false" /> 
       <security mode="Transport"> 
       <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign"/> 
       </security> 
      </binding> 

    <behaviors> 
      <endpointBehaviors> 
      <behavior name="behavior_ServerService"> 
       <clientCredentials> 
       <clientCertificate findValue="*.domain.com" 
          storeLocation="LocalMachine" 
          storeName="My" 
          x509FindType="FindBySubjectName" /> 
       </clientCredentials> 
      </behavior> 
      </endpointBehaviors> 
     </behaviors> 

<client> 
    <endpoint address="net.tcp://clients.domain.com:10001/Server/ServerService" 
    binding="netTcpBinding" bindingConfiguration="EndPointTCP" contract="ServerServiceReference.IServerWS" 
    name="EndPointTCP" behaviorConfiguration="behavior_ServerService"> 
    <identity> 
     <dns value="*.domain.com" /> 
    </identity> 
    </endpoint> 
</client> 

다른 컴퓨터에서 그것을 시도 고객에게 다음과 같은 오류 메시지가 나타납니다.

The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:00:59.9840000'.

An existing connection was forcibly closed by the remote host

,210

서버의 추적 로그는 말한다 :

나는 단절와 클라이언트 모두에 동일한 인증서를 사용하기 때문에 매우 이상하다

The remote certificate is invalid according to the validation procedure.

... (그리고는 dev에 PC를 언급하는 것이 일하고있는 음 ...)는

오류 메시지는 내가 서버에

ServerHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 

ServiceClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 
01,235,164을 설정 한 경우에도 동일

클라이언트에 있습니다.

아무에게도 올바르게 수행하는 방법을 알려 줄 수 있습니까? 물론 유효성 확인 콜백 (callback)과 같은 대안을 항상 true로 설정하거나 위의 유효성을 검증하지 않은 모드로 사용하고 싶지 않습니다.

도움을 주시면 감사하겠습니다. 만이 '작은'문제는 ... 해제 할 수 있도록 해결해야 :(

덕분에 많은 사전에!

Hudgi

+0

http : // stackoverflow.COM/질문/777607/더 - 원격 인증서는-입니다 - - 무효 따라 -에 - 더 - 검증 - 절차-PLE 이 가 어떻게이 경우 복사 붙여 넣기 한 라인과 터져 죽자 : – ariel

답변

10

이 같은 인증서를 사용하려고하는 것처럼 소리를 서버와 클라이언트 인증서 모두와 클라이언트가 인증서 발급과 동일한 호스트 이름을 가지고 있지 않은 경우 X509CertificateValidationMode.None을 설정하더라도 호스트 이름이 일치해야합니다. 개발 컴퓨터가 서버와 같았다면 성공했습니다.

의도적으로 클라이언트를 인증하려고합니까? SSL을 통해 서버에 연결하거나 인증 기관에서 클라이언트의 신뢰를 설정하려고합니까?

또한 인증서가 실제로 와일드 카드 인증서가 아닐 수도 있습니다. 클라이언트 인증서에 해당 인증서를 사용하는 것이 불편한 경우라면.

+0

안녕 무미건조을 확인할 수 있습니다 인증서는 와일드 카드입니까? 주체 대체 이름 필드에 내가 이것에 simlar 값이 있습니다. DNS 이름 = clients.domain.com DNS 이름 = domain.com DNS 이름을 = * domain.com 개발자 기계는 내 노트북과입니다 서버는 다른 테스트 PC와 유사한 VPN의 또 다른 서버입니다. 나중에 세계 여러 대의 컴퓨터에서 클라이언트를 실행하기 위해 호스트 이름을 서버와 동일하게 설정하지 않는 방법이 필요합니다. 나는 절을 서버 및 클라이언트 구성 파일의 끝점에 추가했습니다. 충분하지 않니? Thx. – Hudgi

+0

ID 요소를 변경하는 것만으로는 백업 할 인증서가없는 경우 충분하지 않습니다. 당신은 myClient.domain.com을 포함하는 * .domain.com을 가지고 있지만 myClient.clients.domain.com과 같은 하위 도메인을 와일드 카드가 지원할 것이라고는 생각하지 않습니다. 고객이 하위 도메인에 있습니까? – insipid

+0

우리는 고객이 전세계의 서비스에 액세스 할 수 있도록 허용 할 계획이므로 동일한 도메인을 보유 할 것으로 기대할 수는 없습니다. 우리는 원격 컴퓨터에 클라이언트 소프트웨어를 설치하고 자동으로 서비스로 실행하려고합니다. 우리는 인터넷을 통해 중요한 데이터를 전송하기 때문에 클라이언트와 서버 간의 통신을 암호화하려고합니다. 서버의 주소는 clients.domain.com입니다 (물론 실제 주소는 아니지만 하위 도메인의 심도를 보여줍니다). 클라이언트 주소는 전혀 모릅니다. 할 수 있습니까? – Hudgi

관련 문제