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