方法 : SSL 証明書を使用してポートを構成する

トランスポート セキュリティを使用する自己ホスト型 Windows Communication Foundation (WCF) サービスを WSHttpBinding クラスを使って作成する場合は、X.509 証明書でポートを構成する作業も必要になります。自己ホスト型サービスを作成するのでなければ、インターネット インフォメーション サービス (IIS) でサービスをホストできます。詳細については、次のトピックを参照してください。、「HTTP トランスポート セキュリティ」を参照してください。

ポートを構成する場合に使用するツールは、コンピューターで実行されているオペレーティング システムによって異なります。

Windows Server 2003 または Windows XP を実行している場合は、HttpCfg.exe ツールを使用します。Windows Server 2003 では、このツールは自動的にインストールされています。Windows XP では、「Windows XP Service Pack 2 サポート ツール」からツールをダウンロードできます。詳細については、次のトピックを参照してください。、「Httpcfg Overview」を参照してください。「Httpcfg 構文」では、Httpcfg.exe ツールの構文について説明しています。

Windows Vista を実行している場合は、Netsh.exe ツールを使用します。これは既にインストールされています。

このトピックでは、次のようなさまざまな手順を実行する方法について説明します。

  • コンピューターの現在のポート構成を確認する。

  • 証明書の拇印を取得する (次の 2 つの手順に必要)。

  • SSL 証明書をポート構成にバインドする。

  • SSL 証明書をポート構成にバインドし、クライアント証明書をサポートする。

  • ポート番号から SSL 証明書を削除する。

コンピューターに格納されている証明書を変更するには、管理者特権が必要です。

ポートの構成を確認するには

  1. Windows Server 2003 または Windows XP で現在のポート構成を表示するには、HttpCfg.exe ツールを使用します。次の例に示すように、query スイッチと ssl スイッチを使用します。

    httpcfg query ssl
    
  2. Windows Vista で現在のポート構成を表示するには、Netsh.exe ツールを使用します。次に例を示します。

    netsh http show sslcert
    

証明書の拇印を取得するには

  1. 証明書 MMC スナップインを使用して、クライアント認証を目的として含む X.509 証明書を検索します。詳細については、次のトピックを参照してください。、「方法 : MMC スナップインを使用して証明書を参照する」を参照してください。

  2. 証明書の拇印にアクセスします。詳細については、次のトピックを参照してください。、「方法 : 証明書のサムプリントを取得する」を参照してください。

  3. 証明書の拇印を、メモ帳などのテキスト エディターにコピーします。

  4. 16 進文字の間にある空白をすべて削除します。たとえばエディターの "すべて置換" 機能を使用して、空白を空文字列に置き換えるとよいでしょう。

SSL 証明書をポート番号にバインドするには

  1. 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 スイッチは、証明書の拇印を指定します。

  2. Windows Vista では、Netsh.exe ツールを使用します。次に例を示します。

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} 
    
    • certhash パラメーターは、証明書の拇印を指定します。

    • ipport パラメーターは、IP アドレスとポートを指定します。このパラメーターは、既に説明した Httpcfg.exe ツールの -i スイッチと同じように機能します。

    • appid パラメーターは、所有するアプリケーションの識別に使用できる GUID です。

SSL 証明書をポート番号にバインドし、クライアント証明書をサポートするには

  1. 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 のヘルプ機能を参照してください。

  2. Windows Vista では、トランスポート層で X.509 証明書を使用して認証するクライアントをサポートするには、前と同じ手順を実行しますが、次のように追加のパラメーターを指定します。

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable
    

ポート番号から SSL 証明書を削除するには

  1. HttpCfg.exe または Netsh.exe ツールを使用して、コンピューター上のすべてのバインディングのポートと拇印を確認します。情報をディスクに出力するには、次の例のように ">" を使用してリダイレクトします。

    httpcfg query ssl>myMachinePorts.txt
    
  2. Windows Server 2003 または Windows XP では、HttpCfg.exe ツールを delete および ssl の各キーワードと共に使用します。-i スイッチで IP:port 番号を、-h スイッチで拇印を指定します。

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6
    
  3. 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.
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 certifiate 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 commmunication error occurred: {0}", ce.Message)
    Console.WriteLine()
Catch exc As System.Exception
    Console.WriteLine("An unforseen error occurred: {0}", exc.Message)
    Console.ReadLine()
End Try
// 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 certifiate 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 commmunication error occurred: {0}", ce.Message);
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine("An unforseen error occurred: {0}", exc.Message);
    Console.ReadLine();
}

参照

概念

HTTP トランスポート セキュリティ