方法: SSL 証明書を使用してポートを構成する
トランスポート セキュリティを使用する自己ホスト型 Windows Communication Foundation (WCF) サービスを WSHttpBinding クラスを使って作成する場合は、X.509 証明書でポートを構成する作業も必要になります。 自己ホスト型サービスを作成するのでなければ、インターネット インフォメーション サービス (IIS) でサービスをホストできます。 詳細については、「HTTP トランスポート セキュリティ」を参照してください。
ポートを構成する場合に使用するツールは、コンピューターで実行されているオペレーティング システムによって異なります。
Windows Server 2003 を実行している場合は、HttpCfg.exe ツールを使用します。 Windows Server 2003 では、このツールはインストールされています。 詳細については、「Httpcfg の概要」を参照してください。 Windows サポート ツールのドキュメントで、Httpcfg.exe ツールの構文について説明されています。
Windows Vista を実行している場合は、Netsh.exe ツールを使用します。これは既にインストールされています。
注意
コンピューターに格納されている証明書を変更するには、管理特権が必要です。
ポートの構成を確認する
Windows Server 2003 または Windows XP で現在のポート構成を表示するには、HttpCfg.exe ツールを使用します。次の例に示すように、query スイッチと ssl スイッチを使用します。
httpcfg query ssl
Windows Vista で現在のポート構成を表示するには、Netsh.exe ツールを使用します。次に例を示します。
netsh http show sslcert
証明書の拇印を取得する
証明書 MMC スナップインを使用して、クライアント認証を目的として含む X.509 証明書を検索します。 詳細については、「 方法: MMC スナップインを使用して証明書を参照する」をご覧ください。
証明書の拇印にアクセスします。 詳細については、「方法: 証明書のサムプリントを取得する」を参照してください。
証明書のサムプリントを、メモ帳などのテキスト エディターにコピーします。
16 進文字の間にある空白をすべて削除します。 たとえばエディターの "すべて置換" 機能を使用して、空白を空文字列に置き換えるとよいでしょう。
SSL 証明書をポート番号にバインドする
Windows Server 2003 または Windows XP で証明書をポート番号にバインドするには、HttpCfg.exe ツールを SSL (Secure Sockets Layer) ストアに対して "set" モードで使用します。 このツールは、次のように、拇印を使用して証明書を識別します。
httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6
-i スイッチには、
IP
:port
という構文を使用します。上の例では、コンピューターのポート 8012 に証明書を設定するようにツールに対して指示しています。 "0.0.0.0" の部分は、必要に応じて、コンピューターの実際の IP アドレスに置き換えてください。-h スイッチは、証明書の拇印を指定します。
Windows Vista では、Netsh.exe ツールを使用します。次に例を示します。
netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00001111-aaaa-2222-bbbb-3333cccc4444}
certhash パラメーターは、証明書の拇印を指定します。
ipport パラメーターは、IP アドレスとポートを指定します。このパラメーターは、既に説明した Httpcfg.exe ツールの -i スイッチと同じように機能します。
appid パラメーターは、所有するアプリケーションの識別に使用できる GUID です。
SSL 証明書をポート番号にバインドし、クライアント証明書をサポートする
Windows Server 2003 または Windows XP では、トランスポート層で X.509 証明書を使用して認証するクライアントをサポートするには、前と同じ手順を実行しますが、次のように HttpCfg.exe に追加のコマンド ライン パラメーターを指定します。
httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6 -f 2
-f スイッチには、
n
という構文のパラメーターを指定します。n は 1 から 7 の数字を表します。 前の例のように 2 を指定すると、クライアントはトランスポート層で認証することになります。 値として 3 を指定すると、クライアント証明書が有効になり、それらの証明書が Windows アカウントに対応付けられます。 他の値については、HttpCfg.exe のヘルプ機能を参照してください。Windows Vista では、トランスポート層で X.509 証明書を使用して認証するクライアントをサポートするには、前と同じ手順を実行しますが、次のように追加のパラメーターを指定します。
netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00001111-aaaa-2222-bbbb-3333cccc4444} clientcertnegotiation=enable
ポート番号から SSL 証明書を削除する
HttpCfg.exe または Netsh.exe ツールを使用して、コンピューター上のすべてのバインディングのポートと拇印を確認します。 情報をディスクに出力するには、次の例のようにリダイレクト文字 ">" を使用します。
httpcfg query ssl>myMachinePorts.txt
Windows Server 2003 または Windows XP では、HttpCfg.exe ツールを delete および ssl の各キーワードと共に使用します。 -i スイッチで
IP
:port
番号を、-h スイッチで拇印を指定します。httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6
Windows Vista では、Netsh.exe ツールを使用します。次に例を示します。
Netsh http delete sslcert ipport=0.0.0.0:8005
例
次のコードは、トランスポート セキュリティを設定した WSHttpBinding クラスを使用して、自己ホスト型サービスを作成する方法を示します。 アプリケーションを作成する際、アドレス中にポート番号を指定してください。
// This string uses a function to prepend the computer name at run time.
string addressHttp = String.Format(
"http://{0}:8080/Calculator",
System.Net.Dns.GetHostEntry("").HostName);
WSHttpBinding b = new WSHttpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
// You must create an array of URI objects to have a base address.
Uri a = new Uri(addressHttp);
Uri[] baseAddresses = new Uri[] { a };
// Create the ServiceHost. The service type (Calculator) is not
// shown here.
ServiceHost sh = new ServiceHost(typeof(Calculator), baseAddresses);
// Add an endpoint to the service. Insert the thumbprint of an X.509
// certificate found on your computer.
Type c = typeof(ICalculator);
sh.AddServiceEndpoint(c, b, "MyCalculator");
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
"contoso.com");
// This next line is optional. It specifies that the client's certificate
// does not have to be issued by a trusted authority, but can be issued
// by a peer if it is in the Trusted People store. Do not use this setting
// for production code. The default is PeerTrust, which specifies that
// the certificate must originate from a trusted certificate authority.
// sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
// X509CertificateValidationMode.PeerOrChainTrust;
try
{
sh.Open();
string address = sh.Description.Endpoints[0].ListenUri.AbsoluteUri;
Console.WriteLine("Listening @ {0}", address);
Console.WriteLine("Press enter to close the service");
Console.ReadLine();
sh.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("A communication error occurred: {0}", ce.Message);
Console.WriteLine();
}
catch (System.Exception exc)
{
Console.WriteLine("An unforeseen error occurred: {0}", exc.Message);
Console.ReadLine();
}
' This string uses a function to prepend the computer name at run time.
Dim addressHttp As String = String.Format("http://{0}:8080/Calculator", _
System.Net.Dns.GetHostEntry("").HostName)
Dim b As New WSHttpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate
' You must create an array of URI objects to have a base address.
Dim a As New Uri(addressHttp)
Dim baseAddresses() As Uri = {a}
' Create the ServiceHost. The service type (Calculator) is not
' shown here.
Dim sh As New ServiceHost(GetType(Calculator), baseAddresses)
' Add an endpoint to the service. Insert the thumbprint of an X.509
' certificate found on your computer.
Dim c As Type = GetType(ICalculator)
sh.AddServiceEndpoint(c, b, "MyCalculator")
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindBySubjectName, _
"contoso.com")
' This next line is optional. It specifies that the client's certificate
' does not have to be issued by a trusted authority, but can be issued
' by a peer if it is in the Trusted People store. Do not use this setting
' for production code. The default is PeerTrust, which specifies that
' the certificate must originate from a trusted certificate authority.
' sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
' X509CertificateValidationMode.PeerOrChainTrust
Try
sh.Open()
Dim address As String = sh.Description.Endpoints(0).ListenUri.AbsoluteUri
Console.WriteLine("Listening @ {0}", address)
Console.WriteLine("Press enter to close the service")
Console.ReadLine()
sh.Close()
Catch ce As CommunicationException
Console.WriteLine("A communication error occurred: {0}", ce.Message)
Console.WriteLine()
Catch exc As System.Exception
Console.WriteLine("An unforeseen error occurred: {0}", exc.Message)
Console.ReadLine()
End Try