Freigeben über


IHttpRequest::GetClientCertificate-Methode

Ruft das der Anforderung zugeordnete Clientzertifikat ab.

Syntax

HRESULT GetClientCertificate(  
   OUT HTTP_SSL_CLIENT_CERT_INFO** ppClientCertInfo,  
   OUT BOOL* pfClientCertNegotiated  
);  

Parameter

ppClientCertInfo
[OUT] Ein Zeiger auf eine HTTP_SSL_CLIENT_CERT_INFO-Struktur .

pfClientCertNegotiated
[OUT] true , wenn das Clientzertifikat bereits ausgehandelt wurde; falseandernfalls . Weitere Informationen finden Sie im Abschnitt mit Hinweisen.

Rückgabewert

HRESULT. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.

Wert Definition
S_OK Gibt an, dass kein Fehler aufgetreten ist, aber nicht garantiert, dass ein Zertifikat gefunden wurde. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.
HRESULT_FROM_WIN32(ERROR_NOT_FOUND) Gibt an, dass kein Clientzertifikat gefunden wurde. ERROR_NOT_FOUND ist in Winerror.h definiert.
ERROR_INVALID_PARAMETER Gibt an, dass der ppClientCertInfo Parameter oder pfClientCertNegotiated NULL ist.

Bemerkungen

Ein erfolgreiches HRESULT garantiert nicht, dass ein Clientzertifikat gefunden wurde. Entwickler müssen außerdem überprüfen, ob ppClientCertInfo nicht NULL ist.

Ein pfClientCertNegotiated Wert von true garantiert nicht, dass der ppClientCertInfo nicht NULL ist.

Entwickler können die GetClientCertificate -Methode verwenden, um das der aktuellen Anforderung zugeordnete Clientzertifikat abzurufen. Nachdem Sie die GetClientCertificate -Methode aufgerufen haben, enthält der ppClientCertInfo Parameter einen Zeiger auf eine HTTP_SSL_CLIENT_CERT_INFO Struktur, die das Clientzertifikat enthält, wenn eines verfügbar ist, oder NULL, wenn kein Zertifikat verfügbar ist.

Für URLs, die kein Clientzertifikat erfordern, können Sie die NegotiateClientCertificate-Methode aufrufen, bevor Sie aufrufen GetClientCertificate , um ein manuelles Laden des Clientzertifikats zu versuchen.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie Sie einen Zeiger auf die HTTP_SSL_CLIENT_CERT_INFO-Struktur abrufen, indem Sie die CHttpModule::OnBeginRequest-Methode implementieren.

void   checkForClientCert(IHttpContext*  pHttpContext)
{
   static long cnt;     
   // keep track of how many times we are called
   InterlockedIncrement (&cnt);  
   HRESULT hr = S_OK;
   IHttpRequest *pIHTTPR = pHttpContext->GetRequest();
   HTTP_REQUEST * pRawRequest = pIHTTPR->GetRawHttpRequest();
   HTTP_COOKED_URL hcu = pRawRequest->CookedUrl;

   // Send URL and count to the trace window
   TRC_MSGW_FULL(L"cnt = " << cnt << " URI: " << hcu.pFullUrl);

   // return immediately if not a HTTPS request
   if ( pRawRequest->pSslInfo == NULL ){
      TRC_MSG( "connection is not using SSL");
      return;
   }

   HTTP_SSL_CLIENT_CERT_INFO *pClientCertInfo=NULL;
   BOOL fccNeg;
   hr = pIHTTPR->GetClientCertificate(&pClientCertInfo,&fccNeg);

   // If you have not selected "Require Client Certificates" or called
   // NegotiateClientCertificate(), you  may get  ERROR_NOT_FOUND 

   if( hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND) ||
      pClientCertInfo == NULL ){
         TRC_HR_MSG(hr, "Cert not found" );
         return;
   }
   if(FAILED(hr)){
      LOG_ERR_HR("GetClientCertificate", hr);
      return;
   }	

   // You must verify pClientCertInfo != NULL

   if( fccNeg && pClientCertInfo != NULL){
      ULONG uSiz = pClientCertInfo->CertEncodedSize;
      TRC_MSG( "cert size: " << uSiz \
         << " Previously negotiated " << fccNeg );
      // compute the CRC check sum of the certificate
      unsigned long certCrc = genCRC(pClientCertInfo->pCertEncoded,
         pClientCertInfo->CertEncodedSize);
      TRC_MSG( "cert crc: " << certCrc );
   }
   else
      TRC_MSG( "No client certificate. fccNeg = " << fccNeg );
}

REQUEST_NOTIFICATION_STATUS
CMyHttpModule::OnBeginRequest(
                              IHttpContext*       pHttpContext,
                              IHttpEventProvider* // pProvider  
                              )
{
   checkForClientCert(pHttpContext);
   return RQ_NOTIFICATION_CONTINUE;
}

Weitere Informationen zum Erstellen und Bereitstellen eines nativen DLL-Moduls finden Sie unter Exemplarische Vorgehensweise: Erstellen eines Request-Level HTTP-Moduls mithilfe von nativem Code.

Sie können den Code optional kompilieren, indem Sie die __stdcall (/Gz) aufrufende Konvention verwenden, anstatt die aufrufende Konvention für jede Funktion explizit zu deklarieren.

Anforderungen

type BESCHREIBUNG
Client – IIS 7.0 unter Windows Vista
– IIS 7.5 unter Windows 7
– IIS 8.0 unter Windows 8
– IIS 10.0 auf Windows 10
Server – IIS 7.0 unter Windows Server 2008
– IIS 7.5 unter Windows Server 2008 R2
– IIS 8.0 unter Windows Server 2012
– IIS 8.5 unter Windows Server 2012 R2
– IIS 10.0 auf Windows Server 2016
Produkt – IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0
- IIS Express 7.5, IIS Express 8.0, IIS Express 10.0
Header Httpserv.h

Weitere Informationen

IHttpRequest-Schnittstelle
IHttpRequest::NegotiateClientCertificate-Methode