방법: 전송 보안 및 메시지 자격 증명 사용
전송 및 메시지 자격 증명을 모두 사용하여 서비스를 보호하려면 WCF(Windows Communication Foundation)에서 전송 및 메시지 보안 모드를 모두 사용합니다. 요컨대, 전송 계층 보안은 무결성과 기밀성을 제공하고, 메시지 계층 보안은 엄격한 전송 보안 메커니즘에서는 제공되지 않는 다양한 자격 증명을 제공합니다. 이 항목에서는 WSHttpBinding 및 NetTcpBinding 바인딩을 사용하여 메시지 자격 증명을 통해 전송을 구현하는 기본 단계를 보여 줍니다. 보안 모드 설정에 대한 자세한 내용은 방법: 보안 모드 설정을 참조하세요.
보안 모드를 TransportWithMessageCredential
로 설정하면 전송에서 전송 수준 보안을 제공하는 실제 메커니즘을 결정합니다. HTTP의 경우 메커니즘이 HTTPS(HTTP를 통한 SSL(Secure Sockets Layer))이고, TCP의 경우 TCP 또는 Windows를 통한 SSL입니다.
전송이 HTTP(WSHttpBinding 사용)인 경우 HTTP를 통한 SSL 전송 수준 보안이 제공됩니다. 이 경우 이 항목의 뒷부분에 설명된 것처럼 포트에 바인딩된 SSL 인증서를 사용하여 서비스를 호스팅하는 컴퓨터를 구성해야 합니다.
전송이 TCP(NetTcpBinding 사용)인 경우 기본적으로 Windows 보안 또는 TCP를 통한 SSL 전송 수준 보안이 제공됩니다. TCP를 통한 SSL을 사용할 경우 이 항목의 뒷부분에 설명된 것처럼 SetCertificate 메서드를 사용하여 인증서를 지정해야 합니다.
전송 보안에 대해 인증서와 함께 WSHttpBinding을 사용하려면(코드)
HttpCfg.exe 도구를 사용하여 시스템의 포트에 SSL 인증서를 바인딩합니다. 자세한 내용은 방법: SSL 인증서를 사용하여 포트 구성을 참조하세요.
WSHttpBinding 클래스의 인스턴스를 만들고 Mode 속성을 TransportWithMessageCredential로 설정합니다.
ClientCredentialType 속성을 적절한 값으로 설정합니다. (자세한 내용은 자격 증명 유형 선택을 참조하세요.) 다음 코드는 Certificate 값을 사용합니다.
적절한 기본 주소를 사용하여 Uri 클래스의 인스턴스를 만듭니다. 주소에서는 "HTTPS" 스키마를 사용하고 시스템의 실제 이름과 SSL 인증서가 바인딩되는 포트 번호를 포함해야 합니다. 또는 구성에서 기본 주소를 설정할 수 있습니다.
ph x="1" /> 메서드를 사용하여 서비스 엔드포인트를 추가합니다.
다음 코드에 표시된 것처럼 ServiceHost 인스턴스를 만들고 Open 메서드를 호출합니다.
WSHttpBinding b = new WSHttpBinding(); b.Security.Mode = SecurityMode.TransportWithMessageCredential; b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool. Uri httpsAddress = new Uri("https://localMachineName:8006/base"); ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress); sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator"); sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
Dim b As New WSHttpBinding() b.Security.Mode = SecurityMode.TransportWithMessageCredential b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool. Dim httpsAddress As New Uri("https://localMachineName:8006/base") Dim sh As New ServiceHost(GetType(Calculator), httpsAddress) sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator") sh.Open() Console.WriteLine("Listening") Console.ReadLine()
전송 보안에 대해 인증서와 함께 NetTcpBinding을 사용하려면(코드)
NetTcpBinding 클래스의 인스턴스를 만들고 Mode 속성을 TransportWithMessageCredential로 설정합니다.
ClientCredentialType을 적절한 값으로 설정합니다. 다음 코드에서는 Certificate 값을 사용합니다.
적절한 기본 주소를 사용하여 Uri 클래스의 인스턴스를 만듭니다. 주소에서 "net.tcp" 스키마를 사용해야 합니다. 또는 구성에서 기본 주소를 설정할 수 있습니다.
ServiceHost 클래스의 인스턴스를 만듭니다.
SetCertificate 클래스의 X509CertificateRecipientServiceCredential 메서드를 사용하여 서비스에 대한 X.509 인증서를 명시적으로 설정합니다.
ph x="1" /> 메서드를 사용하여 서비스 엔드포인트를 추가합니다.
다음 코드와 같이 Open 메서드를 호출합니다.
NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential); b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; Uri netTcpAddress = new Uri("net.tcp://baseAddress"); ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress); sh.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com"); sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator"); sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential) b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate Dim netTcpAddress As New Uri("net.tcp://baseAddress") Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress) sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com") sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator") sh.Open() Console.WriteLine("Listening") Console.ReadLine()
전송 보안에 대해 Windows와 함께 NetTcpBinding을 사용하려면(코드)
NetTcpBinding 클래스의 인스턴스를 만들고 Mode 속성을 TransportWithMessageCredential로 설정합니다.
ClientCredentialType을 Windows로 설정하여 Windows를 사용하도록 전송 보안을 설정합니다. 이 값이 기본값입니다.
ClientCredentialType을 적절한 값으로 설정합니다. 다음 코드에서는 Certificate 값을 사용합니다.
적절한 기본 주소를 사용하여 Uri 클래스의 인스턴스를 만듭니다. 주소에서 "net.tcp" 스키마를 사용해야 합니다. 또는 구성에서 기본 주소를 설정할 수 있습니다.
ServiceHost 클래스의 인스턴스를 만듭니다.
SetCertificate 클래스의 X509CertificateRecipientServiceCredential 메서드를 사용하여 서비스에 대한 X.509 인증서를 명시적으로 설정합니다.
ph x="1" /> 메서드를 사용하여 서비스 엔드포인트를 추가합니다.
다음 코드와 같이 Open 메서드를 호출합니다.
NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential); b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows; b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; Uri netTcpAddress = new Uri("net.tcp://Tcp"); ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress); sh.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com"); sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator"); sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential) b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate Dim netTcpAddress As New Uri("net.tcp://Tcp") Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress) sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com") sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator") sh.Open() Console.WriteLine("Listening") Console.ReadLine()
구성 사용
WSHttpBinding을 사용하려면
포트에 바인딩된 SSL 인증서를 사용하여 컴퓨터를 구성합니다. (자세한 내용은 방법: SSL 인증서를 사용하여 포트 구성을 참조하세요.) 이 구성에서는
<transport>
요소 값을 설정할 필요가 없습니다.메시지 수준 보안에 대한 클라이언트 자격 증명 형식을 지정합니다. 다음 예제에서는
<message>
요소의clientCredentialType
특성을UserName
으로 설정합니다.<wsHttpBinding> <binding name="WsHttpBinding_ICalculator"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding>
전송 보안에 대해 인증서와 함께 NetTcpBinding을 사용하려면
TCP를 통한 SSL의 경우
<behaviors>
요소에서 인증서를 명시적으로 지정해야 합니다. 다음 예제에서는 기본 저장소 위치(로컬 컴퓨터 및 개인 저장소)에서 해당 발급자별로 인증서를 지정합니다.<behaviors> <serviceBehaviors> <behavior name="mySvcBehavior"> <serviceCredentials> <serviceCertificate findValue="contoso.com" x509FindType="FindByIssuerName" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
바인딩 섹션에 <netTcpBinding>을 추가합니다.
바인딩 요소를 추가하고
name
특성을 적절한 값으로 설정합니다.<security>
요소를 추가하고mode
특성을TransportWithMessageCredential
로 설정합니다.<
message>
요소를 추가하고clientCredentialType
특성을 적절한 값으로 설정합니다.<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings>
전송 보안에 대해 Windows와 함께 NetTcpBinding을 사용하려면
바인딩 섹션에 <netTcpBinding>을 추가합니다.
<binding>
요소를 추가하고name
특성을 적절한 값으로 설정합니다.<security>
요소를 추가하고mode
특성을TransportWithMessageCredential
로 설정합니다.<transport>
요소를 추가하고clientCredentialType
특성을Windows
로 설정합니다.<message>
요소를 추가하고clientCredentialType
특성을 적절한 값으로 설정합니다. 다음 코드에서는 값을 인증서로 설정합니다.<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <transport clientCredentialType="Windows" /> <message clientCredentialType="Certificate" /> </security> </binding> </netTcpBinding> </bindings>