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)