วิธีการทางโปรแกรมติดตั้งใบรับรอง SSL สำหรับข้อมูลทางอินเทอร์เน็ต Server (IIS)

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 313624 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สิ่งสำคัญบทความนี้ประกอบด้วยข้อมูลเกี่ยวกับการแก้ไข metabase ก่อนที่คุณแก้ไขการ metabase ตรวจสอบว่า คุณมีสำเนาสำรองที่คุณสามารถคืนค่าหากเกิดปัญหา สำหรับข้อมูลเกี่ยวกับวิธีการทำเช่นนี้ ให้ดูที่หัวข้อวิธีใช้ "การกำหนดค่าสำรอง ข้อมูล/Restore " ใน Microsoft Management Console (MMC)

สรุป


บทความที่มีการทีละขั้นตอนนี้อธิบายวิธีการสร้างโดยทางโปรแกรม และใบแล้ว ติดตั้ง Secure Sockets Layer (SSL) รับรองสำหรับข้อมูลทางอินเทอร์เน็ต Server (IIS) ในขณะที่ IIS รุ่น 4.0 และ IIS รุ่น 5.0 แต่ละให้อินเทอร์เฟซผู้ใช้ (UI) เพื่อให้คุณสามารถสร้าง และจากนั้น ให้ติดตั้งใบรับรอง SSL Server คุณสามารถยังทำงานโดยทางโปรแกรม



ขั้นตอนในการสร้างและการติดตั้งใบรับรอง SSL

เมื่อต้องการสร้างโดยทางโปรแกรม และทำ การติดตั้งใบรับรอง SSL ของเซิร์ฟเวอร์ IIS ตามขั้นตอนเหล่านี้:
  1. คุณต้องส่งการร้องขอการรับรองที่ออกใบรับรองเซิร์ฟเวอร์ ถ้าคุณมีใบรับรอง และจากนั้น คุณเก็บไว้ในแฟ้มบนเซิร์ฟเวอร์ IIS ไม่ส่งการร้องขอ
  2. นำเข้าใบรับรองไปยังเก็บใบรับรองที่เหมาะสม
  3. การตั้งค่าคอนฟิก IIS ให้ใช้ใบรับรองที่คุณได้รับในขั้นตอนที่ 1



การตั้งค่าคอนฟิก IIS เพื่อสร้าง และการแล้ว ให้ติดตั้ง SSL ใบรับรอง

คำเตือนถ้าคุณแก้ไข metabase ไม่ถูกต้อง คุณสามารถทำให้เกิดปัญหาร้ายแรงซึ่งอาจทำให้คุณติดตั้งผลิตภัณฑ์ที่ใช้ metabase นี้ Microsoft ไม่สามารถรับประกันว่า ปัญหาที่ได้ถ้าคุณได้แก้ไข metabase ไม่ถูกต้องสามารถแก้ไข แก้ไข metabase ของคุณต้องยอมรับความเสี่ยง

หมายเหตุ:เสมอสำรอง metabase นี้ก่อนที่คุณแก้ไขทำตามขั้นตอนการกำหนดค่าคอนฟิก IIS เพื่อสร้าง และจากนั้น ให้ติดตั้ง SSL ใบรับรอง:
  1. ใช้ Microsoft APIs การเข้ารหัสลับของ Windows เพื่อขอรับการรหัสประจำตัวคุณสมบัติของใบรับรอง
  2. คุณต้องตั้งค่าคุณสมบัติ IIS metabaseSSLCertHashค่าของการรหัสประจำตัว.
  3. คุณต้องตั้งค่าคุณสมบัติ IIS metabaseSSLStoreNameการจัดเก็บที่คุณต้องการใช้งาน
ดูส่วนบทความต่อไปนี้สำหรับตัวอย่างของรหัสการขอรับตัวรหัสประจำตัวใบรับรอง แล้วเพื่อขอรับการSSLCertHashคุณสมบัติ:
รหัส c เพื่อรับ Thumbprint ของใบรับรองการพิสูจน์ตัวจริงของเซิร์ฟเวอร์
รหัส c เมื่อต้องการป้อนคุณสมบัติ SSLCertHash เข้า Metabase นี้



ขั้นตอนในการเปิดการใช้งานของ SSL บนเว็บไซต์ที่เฉพาะ

หลังจากที่คุณดำเนินการขั้นตอนในส่วน "ตั้งค่าคอนฟิก IIS เพื่อสร้างแล้วให้ติดตั้ง SSL Certificates" คุณสามารถเปิดใช้ SSL บนเว็บไซต์ที่เฉพาะ หรือ ในโฟลเดอร์พิเศษ ให้ทำดังนั้น คุณต้องเปิดใช้ SSL ตัวเลือกในโฟลเดอร์ที่คุณต้องการใช้ ขั้นตอนต่อไปนี้ที่สอดคล้องกับแต่ละขั้นตอนที่ outlined ในส่วน "ตั้งค่าคอนฟิก IIS เพื่อสร้างแล้วให้ติดตั้ง SSL Certificates":
  1. เมื่อคุณเรียกใช้การCEnroll::createPKCS10()วิธีการ การร้องขอใบรับรองถูกสร้างขึ้น ตั้งค่าการใช้งานเป็นค่าที่กำหนดไว้ล่วงหน้าต่อไปนี้:szOID_PKIX_KP_SERVER_AUTH:
    #define szOID_PKIX_KP_SERVER_AUTH       "1.3.6.1.5.5.7.3.1"		
  2. เมื่อคุณเรียกใช้การICertRequest::Submit ()วิธี คำร้องขอใบรับรองถูกส่งไปยังผู้มีสิทธิ์ออกใบรับรอง
  3. ใบรับรองถูกดึงมาจากผู้มีสิทธิ์ออกใบรับรองนั้น และการติดตั้งแล้ว ดังกล่าวอยู่ในเก็บที่เหมาะสม เซิร์ฟเวอร์ IIS ตัวช่วยสร้างใบรับรองค้นหาใบรับรองที่คุณสามารถใช้สำหรับการรับรองความถูกต้องของเซิร์ฟเวอร์ในเก็บใบรับรองของคอมพิวเตอร์เฉพาะ เท่านั้น




ขั้นตอนการกำหนดค่า IIS

หลังจากที่คุณบันทึกใบรับรองไปยังเก็บ คุณต้องกำหนดค่า IIS เป็นดังนี้:
  1. ใช้แบบCertGetCertificateContextProperty()วิธีการขอรับค่าของการรหัสประจำตัวคุณสมบัติและcert_hash_prop_idคุณสมบัติ กระบวนการCertGetCertificateContextProperty()ใช้การทำงานนี้CryptHashCertificate()วิธีการคำนวณค่าสำหรับการcert_hash_prop_idคุณสมบัติ ถ้าไม่มีค่าแฮCertGetCertificateContextProperty()ส่งกลับค่านั้นsha1อัลกอริทึม
  2. คุณต้องสร้างแบบไบนารี metabase คุณสมบัติใหม่SSLCertHashที่สอดคล้องกับเว็บไซต์ ตั้งค่าSSLCertHashเมื่อต้องการใบรับรองรหัสประจำตัวให้คุณได้รับในขั้นตอนที่ 1 ของหัวข้อนี้ เมื่อปัญหานี้เกิดขึ้น schema ระบุไม่ถูกต้องการSSLCertHashคุณสมบัติเป็น null ขยายการหยุดการสตริงที่ แทนที่จะเป็นข้อมูลไบนารี และคุณไม่สามารถใช้ IIS Admin วัตถุการนำเข้าSSLCertHash. คุณสามารถใช้เฉพาะออปเจ็กต์ฐานการจัดการระบบ IIS เพื่อนำเข้าค่านี้ เมื่อต้องการใช้SSLCertHashมีวัตถุ IIS Admin ฐาน คุณต้องใช้ค่าเลขฐานสิบ 5506
  3. คุณต้องสร้างเป็นสตริงที่ metabase คุณสมบัติใหม่SSLStoreNameสำหรับเว็บไซต์สอดคล้องกัน ตั้งค่าSSLStoreNameเมื่อต้องการสตริการของฉันค่า คุณสามารถตั้งค่าอย่างใดอย่างหนึ่งSSLStoreNameผ่าน วัตถุ Admin IIS (ตัวอย่างเช่น ในสคริปต์ ADSI) หรือ ผ่าน IIS Admin ฐานวัตถุ เมื่อต้องการใช้SSLStoreNameด้วยการจัดการระบบ IIS ออบเจ็กต์ฐาน ใช้ค่าเลขฐานสิบ 5511




รหัส c เพื่อรับ Thumbprint ของใบรับรองการพิสูจน์ตัวจริงของเซิร์ฟเวอร์

ต่อไปนี้ตัวอย่างวิธีการขอรับการอธิบายรหัส C ของ Microsoftรหัสประจำตัวคุณสมบัติของใบรับรองการรับรองความถูกต้องของเซิร์ฟเวอร์:
#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 เมื่อต้องการป้อนคุณสมบัติ SSLCertHash เข้า Metabase นี้

ตัวอย่างรหัสต่อไปนี้อธิบายถึงวิธีการใช้วัตถุพื้นฐานของการจัดการระบบ IIS เพื่อตั้งค่านี้SSLCertHashวิธีการในการ metabase รหัสต่อไปนี้ใช้อาร์เรย์ไบนารีเองเป็นใบรับรองรหัสประจำตัว. ต้องใช้รหัสที่แท้จริงรหัสประจำตัวค่าที่คุณได้รับเมื่อคุณเรียกใช้รหัสในส่วน "รับใน Thumbprint ของเป็นเซิร์ฟเวอร์พิสูจน์ตัวจริงของ Certificate" ขึ้นอยู่กับว่าคุณกำหนดSetDataวิธีการในเวลาการคอมไพล์ คุณสามารถตั้งค่าอย่างใดอย่างหนึ่งSSLCertHashหรือ ถ้าคุณกำหนดแล้วค่า SSL สำหรับเว็บไซต์ คุณสามารถดูSSLCertHashที่อยู่ SSLCertHash วิธีการส่งคืนสินค้าที่มีอยู่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;
}



ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
315588วิธีการรักษาความปลอดภัยโปรแกรมประยุกต์ ASP.NET ที่ใช้ใบรับรองฝั่งไคลเอ็นต์

คุณสมบัติ

หมายเลขบทความ (Article ID): 313624 - รีวิวครั้งสุดท้าย: 19 ตุลาคม 2553 - Revision: 1.0
ใช้กับ
  • Microsoft Internet Information Services 5.0
Keywords: 
kbcrypt kbapi kbhowtomaster kbsecurity kbisapiext kbhowto kbmt KB313624 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:313624

ให้ข้อเสนอแนะ

 

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