Cara menginstal pemrograman sertifikat SSL untuk Internet Information Server (IIS)

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 313624 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

Penting Artikel ini berisi informasi tentang mengedit metabase. Sebelum Anda mengedit metabase, verifikasi bahwa Anda memiliki salinan cadangan yang dapat Anda memulihkan apabila ada masalah. Untuk informasi tentang cara melakukannya, lihat Topik bantuan "Konfigurasi Backup/Restore" dalam Microsoft Management Console (MMC).

RINGKASAN


Artikel ini selangkah demi selangkah menjelaskan cara pemrograman membuat dan kemudian menginstal Secure Sockets Layer (SSL) sertifikat untuk Internet Information Server (IIS). Sementara IIS versi 4.0 dan IIS versi 5.0 setiap menyediakan antarmuka pengguna (UI) untuk Anda untuk membuat dan kemudian untuk menginstal sertifikat SSL Server, Anda juga dapat menyelesaikan tugas pemrograman.



Langkah-langkah untuk membuat dan kemudian menginstal sertifikat SSL

Untuk membuat pemrograman dan kemudian menginstal sertifikat SSL untuk IIS server, ikuti langkah berikut:
  1. Anda harus mengirim permintaan ke otoritas sertifikasi untuk mengeluarkan sertifikat server. Jika Anda sudah memiliki sertifikat, dan kemudian Anda menyimpannya dalam file pada IIS server, jangan mengirim permintaan.
  2. Impor sertifikat untuk sertifikat yang sesuai toko.
  3. Mengkonfigurasi IIS untuk menggunakan sertifikat yang Anda peroleh di Langkah 1.



Mengkonfigurasi IIS untuk menciptakan dan kemudian menginstal SSL sertifikat

Warning Jika Anda mengedit metabase salah, Anda dapat menyebabkan serius masalah yang mengharuskan Anda untuk menginstal ulang produk yang menggunakan metabase. Microsoft tidak dapat menjamin bahwa masalah yang menghasilkan jika Anda salah mengedit metabase dapat dipecahkan. Mengedit metabase risiko Anda sendiri.

Catatan Selalu buat cadangan metabase sebelum Anda mengeditnya. Ikuti langkah-langkah untuk mengkonfigurasi IIS untuk menciptakan dan kemudian untuk menginstal sertifikat SSL:
  1. Menggunakan Microsoft Windows API kripto untuk mendapatkan Cap jempolproperti sertifikat.
  2. Anda harus mengatur properti IIS metabase, SSLCertHash, dengan nilai Cap jempol.
  3. Anda harus mengatur properti IIS metabase, SSLStoreName, ke toko yang ingin Anda gunakan.
Lihat bagian artikel berikut ini untuk contoh kode untuk mendapatkan Cap jempol sertifikat, dan kemudian untuk mendapatkan The SSLCertHash Properti:
C kode untuk memperoleh cap jempol dari Sertifikat otentikasi server
C kode untuk memasuki properti SSLCertHash Metabase



Langkah-langkah untuk mengaktifkan SSL pada situs Web tertentu

Setelah Anda melakukan langkah-langkah dalam "konfigurasi IIS untuk membuat dan Kemudian untuk menginstal sertifikat SSL"bagian, maka Anda dapat mengaktifkan SSL pada situs tertentu atau di folder tertentu. Untuk melakukannya, Anda harus mengaktifkan SSL pilihan dalam folder yang Anda ingin gunakan. Langkah-langkah berikut sesuai dengan setiap langkah yang diuraikan dalam bagian "Mengkonfigurasi IIS untuk membuat dan kemudian untuk menginstal sertifikat SSL":
  1. Kapan Anda menelpon CEnroll::createPKCS10() metode, permintaan sertifikat dibuat. Mengatur penggunaan standar nilai berikut: szOID_PKIX_KP_SERVER_AUTH:
    #define szOID_PKIX_KP_SERVER_AUTH       "1.3.6.1.5.5.7.3.1"		
  2. Kapan Anda menelpon (ICertRequest::Submit) metode, permintaan untuk Sertifikat diserahkan kepada sertifikasi authority.
  3. Sertifikat Diperoleh dari sertifikasi otoritas, dan kemudian diinstal di toko sesuai. IIS Server Sertifikat Wizard terlihat hanya untuk sertifikat yang dapat digunakan untuk otentikasi server di toko komputer lokal sertifikat.




Langkah-langkah untuk mengkonfigurasi IIS

Setelah Anda menyimpan sertifikat ke toko, Anda harus mengkonfigurasi IIS sebagai berikut:
  1. Penggunaan CertGetCertificateContextProperty()metode untuk mendapatkan nilai-nilai Cap jempol properti dan CERT_HASH_PROP_ID properti. The CertGetCertificateContextProperty() fungsi menggunakan CryptHashCertificate() metode untuk menghitung nilai untuk CERT_HASH_PROP_ID properti. Jika nilai HASH tidak ada, CertGetCertificateContextProperty() kembali SHA1 algoritma.
  2. Anda harus membuat biner metabase properti baru, SSLCertHash, yang berkaitan dengan situs Web. Set SSLCertHash untuk sertifikat Cap jempol bahwa Anda memperoleh pada langkah 1 dalam bagian ini. Ketika masalah ini terjadi, skema salah menentukan SSLCertHash properti sebagai null diperluas dihentikan string, bukan sebagai data biner, dan kemudian Anda tidak dapat menggunakan IIS Admin objek untuk impor SSLCertHash. Anda dapat menggunakan hanya IIS Admin basis objek untuk mengimpor nilai ini. Untuk menggunakan SSLCertHash dengan benda-benda IIS Admin dasar, Anda harus menggunakan nilai desimal, 5506.
  3. Anda harus membuat properti metabase string baru, SSLStoreName, untuk situs Web yang sesuai. Set SSLStoreName untuk string SAYA nilai. Anda dapat mengatur baik SSLStoreName melalui IIS Admin objek (misalnya, di ADSI Script) atau melalui IIS Admin Base objek. Untuk menggunakan SSLStoreName dengan IIS Admin dasar objek, menggunakan nilai desimal, 5511.




C kode untuk memperoleh cap jempol sertifikat otentikasi Server

Berikut contoh Microsoft C kode menjelaskan cara mendapatkan Cap jempol properti Server otentikasi sertifikat:
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

//--------------------------------------------------------------------
//    Define the name of the store where the needed certificate
//    can be found. 

#define CERT_STORE_NAME  L"MY"

//--------------------------------------------------------------------
//   Declare local functions.
//   Local function definitions follow main.

void HandleError(char *s);

void main(void)
{
//--------------------------------------------------------------------
// Declare and initialize local variables. 
// This includes initializing a pointer to the message. 
// Usually, the message will exist somewhere and a pointer will
// be passed to the application.

//--------------------------------------------------------------------
// System store handle

HCERTSTORE hStoreHandle;   

//--------------------------------------------------------------------
// Pointer to a certificate

PCCERT_CONTEXT pCert;
PCCERT_CONTEXT pPrevCert;
 
LPBYTE pEncodedBytes = NULL;
LPBYTE pHash;
DWORD cbData, i;

//--------------------------------------------------------------------
// Open a certificate store.

if ( !( hStoreHandle = CertOpenStore(
   CERT_STORE_PROV_SYSTEM,
   0,
   NULL,
   CERT_SYSTEM_STORE_LOCAL_MACHINE,
   CERT_STORE_NAME)))
{
     HandleError("The MY store could not be opened.");
}


pPrevCert = NULL;

for (; ((pCert = CertEnumCertificatesInStore(hStoreHandle, pPrevCert)) 
	                                         != NULL);
    pPrevCert = pCert)
{
    CERT_ENHKEY_USAGE *pKeyUsage;
    DWORD j, nLen;
    BOOL bFound = FALSE;
    char certName[1024];

    nLen = sizeof(certName);
    certName[0] = 0;
    if (CertNameToStr(MY_TYPE, &(pCert->pCertInfo->Subject),
        CERT_X500_NAME_STR,
        certName,
        sizeof(certName)))
    {
        printf("Checking %s certificate\n", certName);
    }

    cbData = 0;
    if (!CertGetEnhancedKeyUsage(pCert,
        0,
        NULL,
        &cbData) || cbData == 0)
    {
        if (GetLastError() == CRYPT_E_NOT_FOUND)
        {
            printf("%s certificate is for all key usages\n", certName);
            break;
        }
        else
            printf("CertGetEnhancedKeyUsage failed with error code : %08X\n",
                GetLastError());
    }
    pKeyUsage = (CERT_ENHKEY_USAGE *)
        HeapAlloc(GetProcessHeap(), 0, cbData);
    if (pKeyUsage == NULL)
    {
        printf("HeapAlloc failed with error code : %08X\n",
            GetLastError());
        HandleError("Certificate not found.");
    }
    if (!CertGetEnhancedKeyUsage(pCert,
        0,
        pKeyUsage,
        &cbData))
    {
        if (GetLastError() == CRYPT_E_NOT_FOUND)
        {
            printf("%s certificate is for all key usages\n", certName);
            HeapFree(GetProcessHeap(), 0, pKeyUsage);
            break;
        }
        else
        {
            printf("CertGetEnhancedKeyUsage failed with error code : %08X\n",
                GetLastError());
            HeapFree(GetProcessHeap(), 0, pKeyUsage);
            continue;
        }
    }

    if (pKeyUsage->cUsageIdentifier == 0)
    {
        printf("%s certificate is for all key usages\n", certName);
        HeapFree(GetProcessHeap(), 0, pKeyUsage);
        break;
    }

    bFound = FALSE;
    for (j = 0; j < pKeyUsage->cUsageIdentifier; j++)
    {
        if (strcmpi(pKeyUsage->rgpszUsageIdentifier[j], 
			        szOID_PKIX_KP_SERVER_AUTH) == 0)
        {
            printf("%s certificate is for Server Authentication\n", 
				   certName);
            bFound = TRUE;
            break;
        }
    }

    HeapFree(GetProcessHeap(), 0, pKeyUsage);
    if (bFound)
        break;
}

if (pCert == NULL)
   HandleError("Certificate not found.");

if (pPrevCert)
{
    CertFreeCertificateContext(pPrevCert);
    pPrevCert = NULL;
}

/// CASE 2 Get the hash from the certificate
pHash = NULL;
cbData = 0;
CertGetCertificateContextProperty(pCert, CERT_HASH_PROP_ID, NULL, &cbData);
if (cbData == 0)
{
   HandleError("CertGetCertificateContextProperty 1 failed");
}

pHash = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, cbData);
if (pHash == NULL)
{
   HandleError("HeapAlloc failed");
}
if (!CertGetCertificateContextProperty(pCert, CERT_HASH_PROP_ID, pHash, 
	                                   &cbData))
{
   HandleError("CertGetCertificateContextProperty 2 failed");
}

printf("CERT_HASH_PROP_ID Length is %d\n", cbData);
printf("CERT_HASH_PROP_ID BYTES [", cbData);

for (i = 0; i < cbData; i++)
{
    printf("%02X", pHash[i]);
}
printf("]\n");

//--------------------------------------------------------------------
// Clean up and free memory.

if (pEncodedBytes)
    HeapFree(GetProcessHeap(), 0, pEncodedBytes);

if (pHash)
    HeapFree(GetProcessHeap(), 0, pHash);

if(pCert)
     CertFreeCertificateContext(pCert);
if(CertCloseStore(
      hStoreHandle, 
      CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The store closed and all certificates are freed. \n");
}
else
{
    printf("Store closed -- \n"
          "not all certificates, CRLs or CTLs were freed");
}
} // End of main

//--------------------------------------------------------------------
//  This example uses the function HandleError, a simple error
//  handling function, to print an error message to the standard error 
//  (stderr) file and exit the program. 
//  For most applications, replace this function with one 
//  that does more extensive error reporting.

void HandleError(char *s)
{
    fprintf(stderr,"An error occurred in running the program. \n");
    fprintf(stderr,"%s\n",s);
    fprintf(stderr, "Error number %x.\n", GetLastError());
    fprintf(stderr, "Program terminating. \n");
    exit(1);
} // End of HandleError




C kode untuk memasuki properti SSLCertHash Metabase

Dalam kode contoh berikut menggambarkan cara menggunakan IIS Admin Base objek untuk mengatur SSLCertHash metode di metabase. Kode berikut menggunakan sewenang-wenang biner array sebagai sertifikat Cap jempol. Kode aktual akan menggunakan Cap jempol nilai yang Anda memperoleh ketika Anda menjalankan kode dalam "mendapatkan Cap jempol dari Server otentikasi sertifikat"bagian. Tergantung pada bagaimana Anda menentukan SetData metode pada waktu kompilasi, Anda dapat mengatur baik SSLCertHash, atau, jika Anda sudah dikonfigurasi SSL untuk situs Web, Anda dapat memperoleh SSLCertHash yang ada. SSLCertHash metode kembali yang ada CertHash:
#define UNICODE // unicode must be defined for Metabase access
#define INITGUID 
#include <windows.h>
#include <httpfilt.h>
#include <stdio.h> 

#define SETDATA

#include <iadmw.h>    // COM Interface header 
#include <iiscnfg.h>  // MD_ & IIS_MD_ #defines 



extern "C" wmain (int argc, TCHAR ** argv)
{  
	IMSAdminBase  *pIMeta;  
	METADATA_HANDLE MyHandle; 
    HRESULT hres;
   	METADATA_RECORD record = {0};
    TCHAR szError [2048];
	BYTE *myData=NULL;
    DWORD dwSize = sizeof (record);
 	DWORD i;

	// this just a sample of some thumbprint
	BYTE bar[]={0x24, 0xC6, 0xBA, 0xBB, 0x81, 0x76, 0x05, 0xC9, 0xC3, 
		        0x97, 0x6D, 0x4D, 0xEB, 0x85, 0x8F, 0x4F, 0xBF, 0x38,
				0xFD};
    
    
    CoInitialize (NULL);
    
    // get a pointer to the IIS Admin Base Object
	hres = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, 
			IID_IMSAdminBase, (void **) &pIMeta);  
	if (FAILED(hres))  
	{
	    wsprintf (szError, L"CoCreateInstance Failed. Error: %x\n", hres);
        printf ("%S\n", szError);
		CoUninitialize();
        return TRUE;  
	}
    
    // for this test use only 1st server instance
    hres = pIMeta->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", 
		METADATA_PERMISSION_READ|METADATA_PERMISSION_WRITE, 20, &MyHandle); 
	if (FAILED (hres) )
	{
		wsprintf (szError, L"OpenKey Failed. Error: %x\n", hres);
        printf ("%S\n", szError);
		goto clean;
	}
    
	// SSLCertHash = 5506
	record.dwMDIdentifier =  5506;
    record.dwMDAttributes =METADATA_INHERIT;
    record.dwMDUserType=IIS_MD_UT_SERVER;
    record.dwMDDataType= BINARY_METADATA;
    record.pbMDData = (unsigned char *) myData;

#ifndef SETDATA
#pragma message ("Building for GetData\n")    
	again:
    hres = pIMeta->GetData (MyHandle,argv[1], &record, &dwSize);
   	if (FAILED (hres) )
	{
		if (hres == MD_ERROR_DATA_NOT_FOUND)
		{
			printf ("%S\n", L"Data not found, no certificate is set!");
			goto clean;
		}
		else if (HRESULT_CODE(hres)==ERROR_INSUFFICIENT_BUFFER)
		{
			record.dwMDDataLen=dwSize;
			myData = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, dwSize);
			record.pbMDData  = (unsigned char *)myData;
		    goto again;
		}
		else  
		{
			wsprintf (szError, L"GetData Failed. Error: %x\n", hres);
			printf ("%S\n", szError);
			goto clean;;
		}
	}

	printf ("%S", L"Got thumbprint. You can compare" 
		          L" it with the MMC for IIS value:\n");	
	for ( i=0; i<(record.dwMDDataLen/sizeof (BYTE)); i++)		
		printf ("%2X ", myData[i]);  
	HeapFree(GetProcessHeap(), 0, myData);
#else
#pragma message ("Building for SetData\n")

	
	record.pbMDData = bar;
	record.dwMDDataLen = 19; // in real code it should be the size 
                                                   // of the thumbprint buffer
	hres = pIMeta->SetData (MyHandle,argv[1], &record);
	if (FAILED (hres) )
	{
		printf ("Set data failed: 0x%x!\n", hres);
		goto clean;
	}
	else
		printf ("New thumbprint is set\n");
#endif

clean:
	pIMeta->CloseKey(MyHandle); 
	pIMeta->SaveData();
	pIMeta->Release();
	CoUninitialize();

	return 1;
}



REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
315588Bagaimana untuk mengamankan ASP.NET aplikasi menggunakan sisi klien sertifikat

Properti

ID Artikel: 313624 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Internet Information Services 5.0
Kata kunci: 
kbcrypt kbapi kbhowtomaster kbsecurity kbisapiext kbhowto kbmt KB313624 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:313624

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com