Compartilhar via


Método IHttpRequest::GetClientCertificate

Recupera o certificado do cliente associado à solicitação.

Sintaxe

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

Parâmetros

ppClientCertInfo
[OUT] Um ponteiro para uma estrutura HTTP_SSL_CLIENT_CERT_INFO .

pfClientCertNegotiated
[OUT] true se o certificado do cliente já tiver sido negociado; caso contrário, false. Para obter mais informações, consulte a seção Comentários.

Valor Retornado

Um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.

Valor Definição
S_OK Indica que nenhum erro ocorreu, mas não garante que um certificado foi encontrado. Para obter mais informações, consulte a seção Comentários.
HRESULT_FROM_WIN32(ERROR_NOT_FOUND) Indica que nenhum certificado de cliente foi encontrado. ERROR_NOT_FOUND é definido em Winerror.h.
ERROR_INVALID_PARAMETER Indica que o ppClientCertInfo parâmetro ou pfClientCertNegotiated é NULL.

Comentários

Um HRESULT bem-sucedido não garante que um certificado do cliente foi encontrado. Os desenvolvedores também devem verificar se não ppClientCertInfo é NULL.

Um pfClientCertNegotiated valor de true não garante que o ppClientCertInfo não seja NULL.

Os desenvolvedores podem usar o GetClientCertificate método para recuperar o certificado do cliente associado à solicitação atual. Depois de chamar o GetClientCertificate método , o ppClientCertInfo parâmetro conterá um ponteiro para uma HTTP_SSL_CLIENT_CERT_INFO estrutura, que conterá o certificado do cliente se um estiver disponível ou NULL se nenhum certificado estiver disponível.

Para URLs que não exigem um certificado de cliente, você pode chamar o método NegotiateClientCertificate antes de chamar GetClientCertificate para tentar um carregamento manual do certificado do cliente.

Exemplo

O exemplo a seguir demonstra como obter um ponteiro para a estrutura HTTP_SSL_CLIENT_CERT_INFO implementando o 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 obter mais informações sobre como criar e implantar um módulo DLL nativo, consulte Passo a passo : criando um módulo HTTP Request-Level usando código nativo.

Opcionalmente, você pode compilar o código usando a __stdcall (/Gz) convenção de chamada em vez de declarar explicitamente a convenção de chamada para cada função.

Requisitos

Tipo Descrição
Cliente – IIS 7.0 no Windows Vista
– IIS 7.5 no Windows 7
– IIS 8.0 no Windows 8
– IIS 10.0 no Windows 10
Servidor – IIS 7.0 no Windows Server 2008
– IIS 7.5 no Windows Server 2008 R2
– IIS 8.0 no Windows Server 2012
– IIS 8.5 no Windows Server 2012 R2
– IIS 10.0 no Windows Server 2016
Produto - 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
parâmetro Httpserv.h

Consulte Também

IHttpRequest Interface
Método IHttpRequest::NegotiateClientCertificate