Wie Sie programmgesteuert SSL-Zertifikate für Internet Information Server (IIS) installieren

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 313624 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

wichtig Dieser Artikel enthält Informationen zum Bearbeiten der Metabasis. Bevor Sie die Metabasis bearbeiten, stellen Sie sicher, dass Sie eine Sicherungskopie, die Sie wiederherstellen können haben, wenn ein Problem auftritt. Informationen dazu, wie Sie dazu finden Sie unter das Hilfethema "Sicherungskopie erstellen/Konfiguration wiederherstellen" in Microsoft Management Console (MMC).

Zusammenfassung


Dieser schrittweise aufgebaute Artikel beschreibt, wie programmgesteuert erstellen und dann Zertifikate Sockets Layer (SSL), sicher installieren für Internet Information Server (IIS). Während IIS, Version 4.0 und IIS 5.0 jedes stellen eine Benutzeroberfläche (UI) zu erstellen und um SSL-Zertifikate zu installieren, Sie auch Sie dann den Vorgang programmgesteuert führen können.



Schritte zum Erstellen und anschließend zum Installieren von SSL-Zertifikate

So erstellen Sie programmgesteuert und anschließend installieren Sie SSL-Zertifikate für IIS-Server folgendermaßen:
  1. Sie müssen eine Anforderung an die Zertifizierungsstelle Ausstellung eines Serverzertifikats senden. Wenn Sie bereits über das Zertifikat verfügen und speichern es dann in der Datei auf dem IIS-Server, senden Sie die Anforderung nicht.
  2. Importieren Sie in den entsprechenden Zertifikatsspeicher das Zertifikat.
  3. Konfigurieren Sie IIS das Zertifikat zu verwenden, das Sie in Schritt 1 erhalten haben.



Konfigurieren von IIS zum Erstellen und anschließend zum Installieren von SSL Zertifikate

Warnung Eine unkorrekte Bearbeitung der Metabasis können Sie schwerwiegende Probleme verursachen, erforderlich machen können Sie jedes Produkt installieren, der die Metabasis verwendet. Microsoft kann nicht garantieren, dass Probleme, die eine unkorrekte Bearbeitung der Metabasis herrühren, behoben werden können. Bearbeitung der Metabasis erfolgt auf eigenes Risiko.

Hinweis: Immer sichern Sie die Metabasis, bevor Sie ihn bearbeiten. Diese Schritte so konfigurieren Sie IIS zum Erstellen und dann Zertifikate um SSL zu installieren:
  1. Verwenden Sie Microsoft Windows-Kryptografie-APIs, um der Fingerabdruck erhalten Eigenschaft des des Zertifikats.
  2. Sie müssen die IIS-Metabasiseigenschaft, SSLCertHash auf den Wert der Fingerabdruck festlegen.
  3. Sie müssen die IIS-Metabasiseigenschaft, SSLStoreName an den Informationsspeicher festlegen, die Sie verwenden möchten.
Finden Sie in die folgenden Abschnitten Artikel Codebeispiele, um einen Fingerabdruck des Zertifikats, erhalten und dann die SSLCertHash -Eigenschaft abgerufen:
C Code to Obtain the Thumbprint of a Server Authentication Certificate
C Code to Enter the SSLCertHash Property into the Metabase



Schritte zum Aktivieren von SSL auf einer bestimmten Website

Nachdem Sie die Schritte im Abschnitt "Konfigurieren IIS zu erstellen und dann auf Installieren SSL-Zertifikate" durchgeführt haben, können Sie SSL auf einer bestimmten Website oder in einem bestimmten Ordner aktivieren. Optionen im Ordner, den Sie verwenden möchten, dazu SSL zu aktivieren. Die folgenden Schritte entsprechen mit jeder Schritt, die im Abschnitt "Configure IIS to Create and Then to Install SSL Certificates" beschrieben ist:
  1. Wenn Sie die CEnroll::createPKCS10() -Methode aufrufen, wird die Zertifikatanforderung erstellt. Legen Sie die Verwendung auf den folgenden vordefinierten Wert: SzOID_PKIX_KP_SERVER_AUTH :
    #define szOID_PKIX_KP_SERVER_AUTH       "1.3.6.1.5.5.7.3.1"		
  2. Wenn Sie die ICertRequest () -Methode aufrufen, wird eine Anforderung für das Zertifikat an die Zertifizierungsstelle übermittelt.
  3. Das Zertifikat wird von der Zertifizierungsstelle abgerufen, und es wird dann in den entsprechenden Informationsspeicher installiert. Der IIS-Server-Zertifikats-Assistent sucht nur nach Zertifikate, die für die Serverauthentifizierung im Zertifikatspeicher lokalen Computers verwendet werden können.




Schritte zum Konfigurieren von IIS

Nachdem Sie das Zertifikat im Speicher gespeichert haben, müssen Sie IIS wie folgt konfigurieren:
  1. Verwenden Sie die CertGetCertificateContextProperty() -Methode, um die Werte und die CERT_HASH_PROP_ID -Eigenschaft, die Thumbprint -Eigenschaft zu erhalten. Die CertGetCertificateContextProperty() -Funktion verwendet die CryptHashCertificate() -Methode, um den Wert für die CERT_HASH_PROP_ID -Eigenschaft zu berechnen. Wenn der HASH-Wert nicht vorhanden ist, gibt CertGetCertificateContextProperty() den SHA1 -Algorithmus zurück.
  2. Sie müssen eine neue binäre Metabasiseigenschaft, SSLCertHash erstellen, die die Website entspricht. Legen Sie SSLCertHash Zertifikat Fingerabdruck , die Sie in Schritt 1 dieses Abschnitts erhalten haben. Wenn dieses Problem auftritt, das Schema falsch SSLCertHash -Eigenschaft gibt als erweiterte null beendete Zeichenfolge, anstatt als binäre Daten, und Sie können nicht verwenden Sie dann IIS Admin Objects SSLCertHash importieren. Nur IIS Admin Base Objekte können Sie um diesen Wert zu importieren. SSLCertHash mit IIS Admin Base Objekte verwenden möchten, müssen Sie den Decimal-Wert 5506 verwenden.
  3. Sie müssen eine neue Zeichenfolge Metabasiseigenschaft, SSLStoreName , für die entsprechende Website erstellen. Legen Sie SSLStoreName die Zeichenfolge MY -Wert. Sie können entweder SSLStoreName über IIS Admin Objects (z. B. in ADSI-Skript) oder über IIS Admin Base Objekte festlegen. SSLStoreName mit IIS Admin base Objekte verwenden möchten, verwenden Sie den Decimal-Wert 5511.




C Code, um den Fingerabdruck ein Serverauthentifizierungszertifikat erhalten

Der folgende Microsoft C-Beispielcode beschreibt, wie Fingerabdruck -Eigenschaft die Serverauthentifizierung Zertifikat erhalten können:
#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 Code, um die SSLCertHash-Eigenschaft in der Metabasis geben

Der folgende Beispielcode beschreibt die IIS Admin Base Objekte verwenden, um die SSLCertHash -Methode in der Metabasis festzulegen. Der folgende Code verwendet ein beliebiges binäres Array als Zertifikat Fingerabdruck . Tatsächlichen Code würde den Fingerabdruck Wert verwenden, den Sie, erhalten Wenn Sie den Code im Abschnitt "Beziehen der Fingerabdruck des ein Serverauthentifizierungszertifikat" ausführen. Je nachdem, wie Sie zum Zeitpunkt der Kompilierung die SetData -Methode definieren Sie können entweder SSLCertHash festlegen oder wenn Sie SSL für die Website bereits konfiguriert, Sie erhalten die SSLCertHash , die vorhanden ist. The SSLCertHash method return the existing 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;
}



Informationsquellen

Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
315588Wie Sie eine ASP.NET-Anwendung mit clientseitigen Zertifikaten sichern

Eigenschaften

Artikel-ID: 313624 - Geändert am: Dienstag, 11. Juli 2006 - Version: 2.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Internet Information Server 4.0
  • Microsoft Internet Information Services 5.0
Keywords: 
kbmt kbcrypt kbapi kbhowtomaster kbsecurity kbisapiext kbhowto KB313624 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 313624
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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