SSL 와일드 카드 인증서를 사용하여 x509를 통해 여러 WCF 서버를 상호 인증하려면 어떻게해야합니까?

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

  •  06-07-2019
  •  | 
  •  

문제

Domain MyDomain.com (아래의 소설 예, 아래의 소설 예)에 각각 2 개의 WCF 서버가 있습니다.

그들은 모두 공개 IP 주소 (Foo.1 및 2)를 통해 액세스 할 수 있지만, 개인 LAN (IE 192.168.0.1 및 192.168.0.2)에서도 액세스 할 수 있습니다.

*.mydomain.com에 대한 와일드 카드 SSL 인증서를 소유하고 있습니다. 관련 상점에 올바르게 설치됩니다 (즉, 암호화를위한 개인 및 인증을위한 신뢰할 수있는 클라이언트)

인증 목적으로 와일드 카드 인증서를 사용하여 현지 네트워크 주소에서 두 서버가 서로 연결하기를 바랍니다.

c : wind

192.168.0.1     Server1.mydomain.com
192.186.0.2     Server2.mydomain.com

그것들은 내가 server1.mydomain.com을 해결하면 얻는 IP 주소가 아닙니다 (나는 오히려 foo.1-2를 얻을 것입니다)

또한 IPv4 로컬 인터페이스의 연결 별 DNS 접미사를 "mydomain.com"으로 편집했습니다.

내 인증서는 내 Server.config 파일에서 다음과 같이 언급됩니다 (인증과 관련이없는 모든 부품을 제거했습니다).

        <behavior name="ServerToServerBehavior" >
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
            </clientCertificate>
            <serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="myServerAsClientBehaviorConfiguration">
          <clientCredentials>
            <clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
            <serviceCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>

이것은 로컬로 생성 된 x509 인증서를 사용하여 내 자신의 개발자 컴퓨터에서 완벽하게 작동하지만 제작 환경에서는 다음과 같습니다.

Server.Connect : Server 2 : System.ServicEmodel.Security.MessagesEcurityException에 연결하지 못했습니다. 원격 엔드 포인트의 예상 DNS ID는 'server2.mydomain.com'이지만 원격 엔드 포인트는 DNS가 'mydomain.com'이라고 주장했습니다. 이것이 합법적 인 원격 엔드 포인트 인 경우, 채널 프록시를 생성 할 때 DNS Identity 'mydomain.com'을 EndpointAddress의 ID 속성으로 명시 적으로 지정하여 문제를 해결할 수 있습니다.

서버가 MyDomain.com 대신 Server2.mydomain.com에 성공하지 못하도록 노력했습니다. 이 작업을 수행하는 방법에 대한 힌트가 있습니까?

또한 오류 메시지에서 제안 된 솔루션을 시도했지만 전혀 영향을 미치지 않는 것 같습니다 (다른 사용자는 같은 문제 그리고 나는 아직 해결책을 찾지 못했습니다). 이것을 고치는 방법에 대한 아이디어가 있습니까?

편집 : 인증서 제공 업체에 실제로 x509 인증에 사용할 수 있는지 확인합니다.

도움이 되었습니까?

해결책

나는 결국 내 정체성 분야가 무시되는 이유를 이해했습니다.

내 끝점은 다음과 같이 구성되었습니다.

DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");

URI 매개 변수가 제공되면 DNS Identity 필드 (app.config에 정의 됨)도 비운데서 (비어있는 경우에도 실제 URI 객체 대신 문자열을 사용하는 경우).

솔루션은 다음 코드를 사용하여 프로그래밍 방식으로 설정하는 것입니다.

        System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);

        DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );

다른 팁

DNS 주장이 오류가 말하는 오류가 서버가 아닌 클라이언트쪽에 지정 될 것이라고 생각하므로 클라이언트가 도메인의 모든 서버에 성공적으로 연결할 수 있다는 점을 제외하고는 변경 사항을 열지 않습니다. 듣고 있었다). 당신이보고있는 오류는 메시지의 호스트 이름 불일치와 동등한 메시지 보안과 비슷합니다. 나는 많은 나사를 조이고 와일드 카드 certs와 함께 작동하는 메시지 보안을 얻었지만 Cert에 클라이언트 인증 사용이 지정되지 않았기 때문에 사용자 정의 검증 작업을 수행해야 할 수도 있습니다.

운송 보안을 사용하지 않는 이유가 있습니까? 중간 Layer7 라우팅이 없으면 작동하기가 훨씬 간단합니다 ...

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