次の方法で共有


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 ではないことも確認する必要があります。

pfClientCertNegotiatedtrue値は、 が 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 メソッド