Cara: Mengonfigurasi Port dengan Sertifikat SSL

Saat membuat layanan Windows Communication Foundation (WCF) yang dihosting sendiri dengan kelas WSHttpBinding yang menggunakan keamanan transportasi, Anda juga harus mengonfigurasi port dengan sertifikat X.509. Jika Anda tidak membuat layanan yang dihosting sendiri, Anda dapat meng-host layanan Anda di Internet Information Services (IIS). Untuk informasi lebih lanjut, lihat Keamanan Transportasi HTTP.

Untuk mengonfigurasi port, alat yang Anda gunakan bergantung pada sistem operasi yang berjalan di mesin Anda.

Jika Anda menjalankan Windows Server 2003, gunakan alat HttpCfg.exe. Pada Windows Server 2003, alat ini diinstal. Untuk informasi selengkapnya, lihat Ringkasan Httpctg. Dokumentasi Alat Dukungan Windows menjelaskan sintaks untuk alat Httpcfg.exe.

Jika Anda menjalankan Windows Vista, gunakan alat Netsh.exe yang sudah diinstal.

Catatan

Memodifikasi sertifikat yang disimpan di komputer memerlukan hak istimewa administratif.

Menentukan bagaimana port dikonfigurasi

  1. Di Windows Server 2003 atau Windows XP, gunakan alat HttpCfg.exe untuk melihat konfigurasi port saat ini, menggunakan tombol kueri dan ssl, seperti yang ditunjukkan pada contoh berikut.

    httpcfg query ssl  
    
  2. Di Windows Vista, gunakan alat Netsh.exe untuk melihat konfigurasi port saat ini, seperti yang ditunjukkan pada contoh berikut.

    netsh http show sslcert  
    

Dapatkan thumbprint sertifikat

  1. Gunakan snap-in MMC sertifikat untuk menemukan sertifikat X.509 yang memiliki tujuan autentikasi klien. Untuk informasi selengkapnya, lihat Cara: Melihat Sertifikat dengan Snap-in MMC.

  2. Mengakses thumbprint sertifikat. Untuk informasi selengkapnya, lihat Cara: Mengambil Thumbprint Sertifikat.

  3. Salin thumbprint sertifikat ke editor teks, seperti Notepad.

  4. Hapus semua spasi di antara karakter heksadesimal. Salah satu cara untuk melakukannya adalah dengan menggunakan fitur temukan dan ganti editor teks dan ganti setiap spasi dengan karakter null.

Mengikat sertifikat SSL ke nomor port

  1. Di Windows Server 2003 atau Windows XP, gunakan alat HttpCfg.exe dalam mode "set" pada penyimpanan Secure Sockets Layer (SSL) untuk mengikat sertifikat ke nomor port. Alat ini menggunakan thumbprint untuk mengidentifikasi sertifikat, seperti yang ditunjukkan pada contoh berikut.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • tombol -i memiliki sintaks IP:port dan menginstruksikan alat untuk mengatur sertifikat ke port 8012 komputer. Opsional, empat nol yang mendahului nomor juga dapat diganti dengan alamat IP komputer yang sebenarnya.

    • tombol -h menentukan thumbprint sertifikat.

  2. Di Windows Vista, gunakan alat Netsh.exe, seperti yang ditunjukkan dalam contoh berikut.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
    
    • Parameter certhash menentukan thumbprint sertifikat.

    • Parameter ipport menentukan alamat IP dan port, dan berfungsi seperti tombol -i dari alat Httpcfg.exe yang dijelaskan.

    • Parameter appid adalah GUID yang dapat digunakan untuk mengidentifikasi aplikasi pemilik.

Mengikat sertifikat SSL ke nomor port dan mendukung sertifikat klien

  1. Di Windows Server 2003 atau Windows XP, untuk mendukung klien yang mengautentikasi dengan sertifikat X.509 di lapisan transport, ikuti prosedur sebelumnya tetapi lewati parameter baris perintah tambahan ke HttpCfg.exe, seperti yang ditunjukkan pada contoh berikut.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6 -f 2  
    

    tombol -f memiliki sintaks n di mana n adalah angka antara 1 dan 7. Nilai 2, seperti yang ditunjukkan dalam contoh sebelumnya, memungkinkan sertifikat klien di lapisan transportasi. Nilai 3 memungkinkan sertifikat klien dan memetakan sertifikat tersebut ke akun Windows. Lihat Bantuan HttpCfg.exe untuk perilaku nilai lain.

  2. Dalam Windows Vista, untuk mendukung klien yang mengautentikasi dengan sertifikat X.509 di lapisan transportasi, ikuti prosedur sebelumnya, tetapi dengan parameter tambahan, seperti yang ditunjukkan pada contoh berikut.

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

Menghapus sertifikat SSL dari nomor port

  1. Gunakan alat HttpCfg.exe atau Netsh.exe untuk melihat port dan thumbprint dari semua pengikatan di komputer. Untuk mencetak informasi ke disk, gunakan karakter pengalihan ">", seperti yang ditunjukkan dalam contoh berikut.

    httpcfg query ssl>myMachinePorts.txt  
    
  2. Di Windows Server 2003 atau Windows XP, gunakan alat HttpCfg.exe dengan kata kunci hapus dan ssl. Gunakan tombol -i untuk menentukan nomor IP:port, dan tombol -h untuk menentukan cap jempol.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. Di Windows Vista, gunakan alat Netsh.exe, seperti yang ditunjukkan dalam contoh berikut.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Contoh

Kode berikut menunjukkan cara membuat layanan yang dihost sendiri menggunakan kelas WSHttpBinding yang diatur untuk mengangkut keamanan. Saat membuat aplikasi, tentukan nomor port di alamat.

// 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

Lihat juga