Compartir a través de


IHttpRequest::GetClientCertificate (Método)

Recupera el certificado de cliente asociado a la solicitud.

Sintaxis

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

Parámetros

ppClientCertInfo
[OUT] Puntero a una estructura de HTTP_SSL_CLIENT_CERT_INFO .

pfClientCertNegotiated
[OUT] true si el certificado de cliente ya se ha negociado; de lo contrario, false. Para obtener más información, vea la sección Comentarios.

Valor devuelto

Una clase HRESULT. Entre los valores posibles se incluyen los que se indican en la tabla siguiente, entre otros.

Value Definición
S_OK Indica que no se ha producido ningún error, pero no garantiza que se haya encontrado un certificado. Para obtener más información, vea la sección Comentarios.
HRESULT_FROM_WIN32(ERROR_NOT_FOUND) Indica que no se encontró ningún certificado de cliente. ERROR_NOT_FOUND se define en Winerror.h.
ERROR_INVALID_PARAMETER Indica que el ppClientCertInfo parámetro o pfClientCertNegotiated es NULL.

Comentarios

Un HRESULT correcto no garantiza que se haya encontrado un certificado de cliente. Los desarrolladores también deben comprobar que ppClientCertInfo no es NULL.

Un pfClientCertNegotiated valor de true no garantiza que no ppClientCertInfo sea NULL.

Los desarrolladores pueden usar el GetClientCertificate método para recuperar el certificado de cliente asociado a la solicitud actual. Después de llamar al GetClientCertificate método , el ppClientCertInfo parámetro contendrá un puntero a una HTTP_SSL_CLIENT_CERT_INFO estructura, que contendrá el certificado de cliente si uno está disponible o NULL si no hay ningún certificado disponible.

Para las direcciones URL que no requieren un certificado de cliente, puede llamar al método NegotiateClientCertificate antes de llamar GetClientCertificate a para intentar cargar manualmente el certificado de cliente.

Ejemplo

En el ejemplo siguiente se muestra cómo obtener un puntero a la estructura HTTP_SSL_CLIENT_CERT_INFO mediante la implementación del método CHttpModule::OnBeginRequest .

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;
}

Para obtener más información sobre cómo crear e implementar un módulo DLL nativo, consulte Tutorial: Creación de un módulo HTTP de Request-Level mediante código nativo.

Opcionalmente, puede compilar el código mediante la __stdcall (/Gz) convención de llamada en lugar de declarar explícitamente la convención de llamada para cada función.

Requisitos

Tipo Descripción
Remoto - IIS 7.0 en Windows Vista
- IIS 7.5 en Windows 7
- IIS 8.0 en Windows 8
- IIS 10.0 en Windows 10
Servidor - IIS 7.0 en Windows Server 2008
- IIS 7.5 en Windows Server 2008 R2
- IIS 8.0 en Windows Server 2012
- IIS 8.5 en Windows Server 2012 R2
- IIS 10.0 en Windows Server 2016
Producto - 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
Encabezado Httpserv.h

Consulte también

IHttpRequest (interfaz)
IHttpRequest::NegotiateClientCertificate (Método)