トランスポート セキュリティの概要
Windows Communication Foundation (WCF) のトランスポート セキュリティ機構は、使用されているバインディングとトランスポートによって異なります。 たとえば、WSHttpBinding クラスを使用する場合、トランスポートは HTTP であり、トランスポートをセキュリティで保護するための主要機構は SSL (Secure Sockets Layer) over HTTP (一般に HTTPS と呼ばれます) です。 このトピックでは、WCF システム指定のバインディングで使用する主要なトランスポート セキュリティ機構について説明します。
Note
SSL セキュリティを .NET Framework 3.5 以降と共に使用すると、WCF クライアントは、証明書ストア内の中間証明書と SSL ネゴシエーション中に受信した中間証明書の両方を使用して、サービスの証明書に対して証明書チェーンの検証を実行します。 .NET Framework 3.0 では、ローカルの証明書ストアにインストールされている中間証明書のみが使用されます。
警告
トランスポート セキュリティを使用した場合、Thread.CurrentPrincipal プロパティが上書きされることがあります。 これが発生しないようにするには、ServiceAuthorizationBehavior.PrincipalPermissionMode を PrincipalPermissionMode.None に設定します。 ServiceAuthorizationBehavior は、サービスの説明で設定できる、サービスの動作です。
BasicHttpBinding
既定では、BasicHttpBinding クラスはセキュリティを提供しません。 このバインディングは、セキュリティを実装していない Web サービス プロバイダーとの相互運用性のためにデザインされています。 ただし、Mode プロパティを None 以外の値に設定することにより、セキュリティを有効にすることができます。 トランスポート セキュリティを有効にするには、このプロパティを Transport に設定します。
IIS との相互運用性
BasicHttpBinding クラスは、主に既存の Web サービスと相互運用するために使用されます。これらのサービスの多くは、インターネット インフォメーション サービス (IIS) によってホストされます。 そのため、このバインディングのトランスポート セキュリティは、IIS サイトとシームレスに相互運用できるようにデザインされています。 IIS サイトと相互運用するには、セキュリティ モードを Transport に設定した後、クライアント資格情報の種類を設定します。 資格情報の種類の値は、IIS ディレクトリのセキュリティ機構に対応しています。 モードを設定し、資格情報の種類を Windows に設定するコードを次に示します。 この構成は、クライアントとサーバーが同じ Windows ドメインに存在する場合に使用できます。
BasicHttpBinding b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.Transport ;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
Dim b As BasicHttpBinding = New BasicHttpBinding()
b.Security.Mode = BasicHttpSecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
または、次のように構成します。
<bindings>
<basicHttpBinding>
<binding name="SecurityByTransport">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
以下のセクションでは、その他のクライアント資格情報の種類について説明します。
Basic
これは、IIS の基本認証方法に対応しています。 このモードを使用する場合は、Windows ユーザー アカウントと、適切な NTFS ファイル システムのアクセス許可を使用して IIS サーバーを構成する必要があります。 IIS 6.0 の詳細については、「基本認証を有効し、領域名を構成する」を参照してください。 IIS 7.0 の詳細については、「基本認証を構成する (IIS 7)」を参照してください。
証明書
IIS には、クライアントに証明書を使用してログオンすることを要求するオプションがあります。 この機能により、IIS はクライアント証明書を Windows アカウントにマップすることもできます。 IIS 6.0 の詳細については、「IIS 6.0 でクライアント証明書を有効にする」を参照してください。 IIS 7.0 の詳細については、「IIS 7 でサーバー証明書を構成する」を参照してください。
ダイジェスト
ダイジェスト認証は基本認証と似ていますが、資格情報をクリア テキストではなくハッシュとして送信できるという利点があります。 IIS 6.0 の詳細については、「IIS 6.0 でのダイジェスト認証」を参照してください。 IIS 7.0 の詳細については、「ダイジェスト認証を構成する (IIS 7)」を参照してください。
Windows
これは、IIS の統合 Windows 認証に対応しています。 この値に設定する場合、サーバーは、Kerberos プロトコルを使用する Windows ドメインにドメイン コントローラーとして存在することにもなっています。 サーバーが Kerberos ベースのドメインに存在しない場合、または Kerberos システムに障害が発生した場合は、次のセクションで説明する NTLM (NT LAN Manager) 値を使用できます。 IIS 6.0 の詳細については、「IIS 6.0 での統合 Windows 認証」を参照してください。 IIS 7.0 の詳細については、「IIS 7 でサーバー証明書を構成する」を参照してください。
NTLM
この値を使用すると、Kerberos プロトコルが失敗した場合に、サーバーは、NTLM を使用して認証を実行できます。 IIS 6.0 での IIS の構成の詳細については、「強制的に NTLM 認証を行う」を参照してください。 IIS 7.0 では、Windows 認証に NTLM 認証が含まれます。 詳細については、「 IIS 7 でサーバー証明書を構成する」を参照してください。
WsHttpBinding
WSHttpBinding クラスは、WS-* 仕様を実装するサービスと共に相互運用するようにデザインされています。 このバインディングのトランスポート セキュリティは、SSL (Secure Sockets Layer) over HTTP または HTTPS です。 SSL を使用する WCF アプリケーションを作成するには、IIS を使用してアプリケーションをホストします。 自己ホスト型アプリケーションを作成する場合は、HttpCfg.exe ツールを使用して、X.509 証明書をコンピューターの特定のポートにバインドします。 ポート番号は、エンドポイント アドレスとして WCF アプリケーションの一部に指定されます。 トランスポート モードを使用する場合は、エンドポイント アドレスに HTTPS プロトコルを含める必要があります。そうしないと、実行時に例外が発生します。 詳細については、「HTTP トランスポート セキュリティ」を参照してください。
クライアント認証の場合、ClientCredentialType クラスの HttpTransportSecurity プロパティを HttpClientCredentialType 列挙値のいずれかに設定します。 この列挙値は、BasicHttpBinding のクライアント資格情報の種類と同一であり、IIS サービスを使用してホストされるようにデザインされています。
クライアント資格情報の種類が Windows の場合に使用するバインディングの例を次に示します。
// The code uses a shortcut to specify the security mode to Transport.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
' The code uses a shortcut to specify the security mode to Transport.
Dim b As WSHttpBinding = New WSHttpBinding(SecurityMode.Transport)
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
WSDualHttpBinding
このバインディングが提供するのは、トランスポート レベルのセキュリティではなく、メッセージ レベルのセキュリティだけです。
NetTcpBinding
NetTcpBinding クラスは、メッセージ トランスポートに TCP を使用します。 トランスポート モードのセキュリティは、TLS (Transport Layer Security) over TCP を実装することによって実現されます。 TLS 実装は、オペレーティング システムによって提供されます。
次のコードに示すように、ClientCredentialType クラスの TcpTransportSecurity プロパティを TcpClientCredentialType 値のいずれかに設定することで、クライアントの資格情報の種類を指定することもできます。
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Certificate;
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Client
クライアントでは、SetCertificate クラスの X509CertificateInitiatorClientCredential メソッドを使用して証明書を指定する必要があります。
Note
Windows セキュリティを使用している場合には、証明書は不要です。
証明書の拇印を使用するコードを次に示します。拇印により、証明書が一意に識別されます。 証明書の詳細については、「証明書の使用」を参照してください。
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
EndpointAddress a = new EndpointAddress("net.tcp://contoso.com/TcpAddress");
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(b, a);
cf.Credentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindByThumbprint,
"0000000000000000000000000000000000000000");
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Dim a As New EndpointAddress("net.tcp://contoso.com/TcpAddress")
Dim cf As ChannelFactory(Of ICalculator) = New ChannelFactory(Of ICalculator)(b, a)
cf.Credentials.ClientCertificate.SetCertificate( _
StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindByThumbprint, _
"0000000000000000000000000000000000000000")
次のように、behaviors セクションで <clientCredentials> 要素を使用して、クライアントの構成に証明書を指定することもできます。
<behaviors>
<behavior>
<clientCredentials>
<clientCertificate findValue= "101010101010101010101010101010000000000"
storeLocation="LocalMachine" storeName="My"
X509FindType="FindByThumbPrint">
</clientCertificate>
</clientCredentials>
</behavior>
</behaviors>
NetNamedPipeBinding
同じネットワーク上の 2 台のコンピューター間に名前付きパイプ チャネルを作成できますが、NetNamedPipeBinding クラスは、コンピューター内通信 (つまり、同じコンピューター上で実行されるプロセス) を効率的に行うことができるようにデザインされています。 このバインディングが提供するのは、トランスポート レベルのセキュリティだけです。 このバインディングを使用してアプリケーションを作成する場合は、エンドポイント アドレスにプロトコルとして "net.pipe" を含める必要があります。
WSFederationHttpBinding
トランスポート セキュリティを使用する場合、このバインディングでは SSL over HTTP を使用します。SSL over HTTP は HTTPS とも呼ばれ、発行済みトークン (TransportWithMessageCredential) を含みます。 フェデレーション アプリケーションの詳細については、「フェデレーションと発行済みトークン」を参照してください。
NetPeerTcpBinding
NetPeerTcpBinding クラスは、ピアツーピア ネットワーク機能を使用して効率的に通信できるようにデザインされた、セキュリティ保護されたトランスポートです。 クラスとバインディングの名前が示すように、プロトコルは TCP です。 セキュリティ モードが Transport に設定されている場合、このバインディングは TLS over TCP を実装します。 ピアツーピア機能の詳細については、「ピアツーピア ネットワーク」を参照してください。
MsmqIntegrationBinding と NetMsmqBinding
メッセージ キュー (以前は MSMQ と呼ばれていました) でのトランスポート セキュリティの詳細については、「トランスポート セキュリティを使用したメッセージのセキュリティ保護」を参照してください。