Comment installer par programmation des certificats SSL pour Internet (IIS)

Traductions disponibles Traductions disponibles
Numéro d'article: 313624 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

important Cet article contient des informations sur la modification de la métabase. Avant de modifier la métabase, vérifiez que vous disposez d'une copie de sauvegarde que vous pouvez restaurez si un problème se produit. Pour savoir comment procéder, consultez la rubrique d'aide " Configuration sauvegarde/restauration " dans Microsoft Management Console (MMC).

Résumé


Cet article étape par étape décrit comment créer par programmation et puis installer Secure Sockets Layer (SSL) certificats pour Internet (IIS). Tandis que IIS version 4.0 et IIS version 5.0 chaque fournir une interface utilisateur (IU) vous permet de créer et puis pour installer des certificats serveur SSL, vous pouvez également effectuer la tâche par programmation.



Étapes pour créer et puis pour installer des certificats SSL

Pour créer par programmation et puis, pour installer des certificats SSL pour serveur IIS, procédez comme suit :
  1. Vous devez envoyer une demande à l'autorité de certification pour émettre un certificat de serveur. Si vous disposez déjà du certificat et ensuite vous la stocker dans le fichier sur le serveur IIS, n'envoyez pas la demande.
  2. Importer le certificat au magasin de certificats approprié.
  3. Configurer IIS pour utiliser le certificat que vous avez obtenus dans l'étape 1.



Configurer IIS pour créer et ensuite pour installer SSL certificats

Avertissement Si vous modifiez la métabase incorrecte, vous pouvez générer des problèmes sérieuses pouvant vous obliger à réinstaller les produits qui utilisent la métabase. Microsoft ne peut pas garantir que des problèmes Si modification incorrecte de la métabase puissent être résolus. Modifier la métabase à vos risques et périls.

note Sauvegardez toujours la métabase avant de le modifier. Procédez comme suit pour configurer IIS pour créer et ensuite d'installer SSL certificats :
  1. Utiliser des API de chiffrement Microsoft Windows pour obtenir l' empreinte numérique propriété du certificat.
  2. La propriété de métabase IIS, SSLCertHash , BoîteContrôle à la valeur de l' empreinte numérique .
  3. La propriété de métabase IIS, SSLStoreName , vous BoîteContrôle à la banque que vous souhaitez utiliser.
Consultez les sections article suivantes pour exemples de code obtenir une empreinte numérique du certificat, puis sur obtenir la propriété SSLCertHash :
C Code to Obtain the Thumbprint of a Server Authentication Certificate
C Code to Enter the SSLCertHash Property into the Metabase



Procédure pour activer SSL sur un site Web particulière

Après avoir effectué les étapes dans la section « configurer IIS pour créer et puis à installer certificats SSL », vous pouvez activer SSL sur un site particulier ou dans un dossier particulier. Pour ce faire, vous devez d'abord activer SSL options dans le dossier que vous souhaitez utiliser. Les étapes suivantes correspondent à chaque étape décrite dans la section « Configure IIS to Create and Then to Install SSL Certificates » :
  1. Lorsque vous appelez la méthode CEnroll::createPKCS10() , la demande de certificat est créée. Définie l'utilisation sur la valeur prédéfinie suivante : szOID_PKIX_KP_SERVER_AUTH :
    #define szOID_PKIX_KP_SERVER_AUTH       "1.3.6.1.5.5.7.3.1"		
  2. Lorsque vous appelez la méthode () ICertRequest::Soumettre , une demande pour le certificat est soumise à l'autorité de certification.
  3. Le certificat est extraite de l'autorité de certification, et il est installé dans le magasin approprié. Le serveur IIS Assistant certificat recherche uniquement les certificats qui il peut utiliser pour l'authentification du serveur dans le magasin de certificats ordinateur local.




Étapes pour configurer les services Internet (IIS)

Après avoir enregistré le certificat au magasin, vous devez configurer IIS comme suit :
  1. Utilisez la méthode CertGetCertificateContextProperty() pour obtenir les valeurs de la propriété empreinte numérique et la propriété CERT_HASH_PROP_ID . La fonction CertGetCertificateContextProperty() utilise la méthode CryptHashCertificate() pour calculer la valeur de la propriété CERT_HASH_PROP_ID . Si la valeur de HACHAGE n'existe pas, CertGetCertificateContextProperty() renvoie l'algorithme SHA1 .
  2. Vous devez créer une propriété métabase binaire nouvelle, SSLCertHash , qui correspond à ce site. Définissez SSLCertHash sur le certificat empreinte numérique que vous avez obtenus dans l'étape 1 de cette section. Lorsque ce problème se produit, le schéma spécifie incorrectement la propriété SSLCertHash sous une étendue chaîne terminée nulle, au lieu d'en tant que données binaires, et puis vous ne pouvez pas utiliser des objets d'administration IIS pour importer SSLCertHash . Vous pouvez utiliser uniquement des objets de base Administration de services Internet (IIS) pour importer cette valeur. Pour utiliser SSLCertHash avec les objets de base d'administration IIS, vous devez utiliser la valeur décimale, 5506.
  3. Vous devez créer une nouvelle chaîne métabase propriété, SSLStoreName , pour le site Web correspondant. Valeur la chaîne de valeur mon SSLStoreName . Vous pouvez soit définir SSLStoreName grâce à des objets d'administration IIS (par exemple, en script ADSI) ou objets de base Administration IIS. Pour utiliser SSLStoreName avec des objets de base Administration IIS, utilisez la valeur décimale, 5511.




Code c pour obtenir l'empreinte numérique d'un certificat d'authentification de serveur

L'exemple de code Microsoft C suivant explique comment obtenir la propriété empreinte numérique d'un certificat d'authentification de serveur :
#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




Code c pour entrer la propriété SSLCertHash dans la métabase

L'exemple de code suivant explique comment utiliser objets de base Administration IIS pour définir la méthode SSLCertHash dans la métabase. Le code suivant utilise un tableau binaire arbitraire comme un certificat empreinte numérique . Code réel devez utiliser la valeur empreinte numérique que vous obtenez lorsque vous exécutez le code dans la obtenir l'empreinte numérique d'un Server authentification section « certificat ». Selon la façon dont vous définissez la méthode SetData lors de la compilation, vous pouvez soit définir SSLCertHash ou, si vous avez déjà configuré SSL pour le site Web, vous pouvez obtenir SSLCertHash qui existe. 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;
}



Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
315588 Comment faire pour sécuriser une application ASP.NET à l'aide de certificats côté client

Propriétés

Numéro d'article: 313624 - Dernière mise à jour: mardi 11 juillet 2006 - Version: 2.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Internet Information Server 4.0
  • Microsoft Internet Information Services 5.0
Mots-clés : 
kbmt kbcrypt kbapi kbhowtomaster kbsecurity kbisapiext kbhowto KB313624 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 313624
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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