X509 인증서로 식별 된 단일 클라이언트 만 수락하기 위해 WCF 서비스를 구성하는 방법

StackOverflow https://stackoverflow.com/questions/2276594

문제

두 머신 간의 보안 통신에 의존하는 WCF 클라이언트/서비스 앱이 있으며 인증서 저장소에 설치된 X509 인증서를 사용하여 서버와 클라이언트를 서로 식별하려고합니다. 바인딩을 다음과 같이 구성 하여이 작업을 수행합니다 <security authenticationMode="MutualCertificate"/>. 클라이언트 기계 만 있습니다.

서버에는 로컬 컴퓨터/개인 상점에 설치된 Server.mydomain.com에 발급 된 인증서가 있으며 클라이언트에는 동일한 장소에 설치된 Client.MyDomain.com에 인증서가 발행됩니다. 이 외에도 서버는 지역 컴퓨터/신뢰할 수있는 사람에 클라이언트의 공개 인증서를 보유하고 있으며 고객은 지역 컴퓨터/신뢰할 수있는 사람에 서버의 공개 인증서를 보유하고 있습니다.

마지막으로 클라이언트는 서버의 인증서를 확인하도록 구성되었습니다. 나는 이것을 사용하여 이것을했다 system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate 구성 파일의 요소.

지금까지 너무 좋아,이 모든 것이 작동합니다. 내 문제는 Client.MyDomain.com 인증서에서 자신을 식별하는 클라이언트만이 서버의 구성 파일에서 지정하려는 것입니다.

올바른 정보는 다음을 사용하여 서버에서 사용할 수 있습니다. ServiceSecurityContext, 그러나 나는 app.config에서 WCF가 코드에서 보안 컨텍스트를 확인하는 대신이 점검을 수행해야한다는 것을 지정하는 방법을 찾고 있습니다.

그게 가능합니까? 모든 힌트는 감사 할 것입니다.

그건 그렇고, 내 서버의 구성 파일은 지금까지 다음과 같습니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MyServer.Server" behaviorConfiguration="CertificateBehavior">
        <endpoint contract="Contracts.IMyService" binding="customBinding" bindingConfiguration="SecureConfig">
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/SecureWcf"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CertificateBehavior">
          <serviceCredentials>
            <serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="server.mydomain.com"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="SecureConfig">
          <security authenticationMode="MutualCertificate"/>
          <httpTransport/>
        </binding>
      </customBinding>
    </bindings>
  </system.serviceModel>
</configuration>
도움이 되었습니까?

해결책

Web.Config를 사용하는 작업을 수행하는 방법이없는 것 같습니다.

이 태그로 동작을 추가했습니다.

<clientCertificate>
  <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>

그런 다음 서버가 실행하는 사용자의 "신뢰할 수있는 사람"인증서 저장소에 클라이언트의 인증서를 추가하십시오.

다른 팁

확인하십시오 WCF 보안 지침 CodePlex의 페이지 - 훌륭하고 매우 유용한 것들!

특히, 방법을 확인하고 더 구체적으로

방법 - WCF에서 WCF에서 인증서 인증 및 메시지 보안을 사용하여 Windows 양식에서 호출

고객이 유효한 인증서를 제시 해야하는 WCF 서비스를 설정하는 방법과 확인 방법을 자세히 설명합니다. 단일 클라이언트 만 허용하려면 해당 인증서를 해당 단일 클라이언트에만 구체적으로 배포하십시오.

도움이 되었기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top