IHttpRequest::GetClientCertificate メソッド
要求に関連付けられているクライアント証明書を取得します。
構文
HRESULT GetClientCertificate(
OUT HTTP_SSL_CLIENT_CERT_INFO** ppClientCertInfo,
OUT BOOL* pfClientCertNegotiated
);
パラメーター
ppClientCertInfo
[OUT] HTTP_SSL_CLIENT_CERT_INFO 構造体へのポインター。
pfClientCertNegotiated
[OUT] true
クライアント証明書が既にネゴシエートされている場合は 。それ以外の場合は false
。 詳細については、「解説」を参照してください。
戻り値
HRESULT
。 有効な値を次の表に示しますが、これ以外にもあります。
値 | 定義 |
---|---|
S_OK | エラーが発生しなかったことを示しますが、証明書が見つかったという保証はありません。 詳細については、「解説」を参照してください。 |
HRESULT_FROM_WIN32(ERROR_NOT_FOUND) | クライアント証明書が見つからなかったことが示されます。 ERROR_NOT_FOUNDは Winerror.h で定義されています。 |
ERROR_INVALID_PARAMETER | または pfClientCertNegotiated パラメーターが NULL であることをppClientCertInfo 示します。 |
解説
HRESULT が成功しても、クライアント証明書が見つかったという保証はありません。 開発者は、が ppClientCertInfo
NULL ではないことも確認する必要があります。
pfClientCertNegotiated
のtrue
値は、 が NULL ではないことをppClientCertInfo
保証するものではありません。
開発者は、 メソッドを GetClientCertificate
使用して、現在の要求に関連付けられているクライアント証明書を取得できます。 メソッドを GetClientCertificate
呼び出すと、 ppClientCertInfo
パラメーターには構造体への HTTP_SSL_CLIENT_CERT_INFO
ポインターが含まれます。この構造体には、使用可能な場合はクライアント証明書が格納され、使用可能な証明書がない場合は NULL が含まれます。
クライアント証明書を必要としない URL の場合は、 を呼び出す前に NegotiateClientCertificate メソッドを呼び出 GetClientCertificate
して、クライアント証明書の手動読み込みを試みることができます。
例
次の例では、CHttpModule::OnBeginRequest メソッドを実装して、HTTP_SSL_CLIENT_CERT_INFO構造体へのポインターを取得する方法を示します。
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;
}
ネイティブ DLL モジュールを作成してデプロイする方法の詳細については、「 チュートリアル: ネイティブ コードを使用したRequest-Level HTTP モジュールの作成」を参照してください。
必要に応じて、各関数の呼び出し規約を __stdcall (/Gz)
明示的に宣言するのではなく、呼び出し規約を使用してコードをコンパイルできます。
要件
Type | 説明 |
---|---|
Client | - Windows Vista 上の IIS 7.0 - Windows 7 上の IIS 7.5 - Windows 8 上の IIS 8.0 - Windows 10の IIS 10.0 |
サーバー | - Windows Server 2008 の IIS 7.0 - Windows Server 2008 R2 の IIS 7.5 - Windows Server 2012 の IIS 8.0 - Windows Server 2012 R2 の IIS 8.5 - Windows Server 2016の IIS 10.0 |
製品 | - 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 |
参照
IHttpRequest インターフェイス
IHttpRequest::NegotiateClientCertificate メソッド