Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mengambil sertifikat klien yang terkait dengan permintaan.
Sintaks
HRESULT GetClientCertificate(
OUT HTTP_SSL_CLIENT_CERT_INFO** ppClientCertInfo,
OUT BOOL* pfClientCertNegotiated
);
Parameter
ppClientCertInfo
[OUT] Penunjuk ke struktur HTTP_SSL_CLIENT_CERT_INFO .
pfClientCertNegotiated
[OUT] true jika sertifikat klien telah dinegosiasikan; jika tidak, false. Untuk informasi lebih lanjut, lihat bagian Keterangan.
Tampilkan Nilai
Sebuah HRESULT. Nilai yang mungkin termasuk, tetapi tidak terbatas pada, yang ada dalam tabel berikut.
| Nilai | Definisi |
|---|---|
| S_OK | Menunjukkan bahwa tidak ada kesalahan yang terjadi, tetapi tidak menjamin bahwa sertifikat ditemukan. Untuk informasi lebih lanjut, lihat bagian Keterangan. |
| HRESULT_FROM_WIN32(ERROR_NOT_FOUND) | Menunjukkan tidak ada sertifikat klien yang ditemukan. ERROR_NOT_FOUND didefinisikan dalam Winerror.h. |
| ERROR_INVALID_PARAMETER | Menunjukkan bahwa ppClientCertInfo parameter atau pfClientCertNegotiated adalah NULL. |
Keterangan
HRESULT yang berhasil tidak menjamin bahwa sertifikat klien ditemukan. Pengembang juga harus memverifikasi bahwa ppClientCertInfo bukan NULL.
Nilai pfClientCertNegotiatedtrue tidak menjamin bahwa ppClientCertInfo bukan NULL.
Pengembang dapat menggunakan GetClientCertificate metode untuk mengambil sertifikat klien yang terkait dengan permintaan saat ini. Setelah Anda memanggil GetClientCertificate metode , ppClientCertInfo parameter akan berisi penunjuk ke HTTP_SSL_CLIENT_CERT_INFO struktur, yang akan berisi sertifikat klien jika tersedia atau NULL jika tidak ada sertifikat yang tersedia.
Untuk URL yang tidak memerlukan sertifikat klien, Anda dapat memanggil metode NegotiateClientCertificate sebelum Anda memanggil GetClientCertificate untuk mencoba pemuatan manual sertifikat klien.
Contoh
Contoh berikut menunjukkan cara mendapatkan penunjuk ke struktur HTTP_SSL_CLIENT_CERT_INFO dengan menerapkan metode 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;
}
Untuk informasi selengkapnya tentang cara membuat dan menyebarkan modul DLL asli, lihat Panduan: Membuat modul HTTP Request-Level Dengan Menggunakan Kode Asli.
Anda dapat secara opsional mengkompilasi kode dengan menggunakan __stdcall (/Gz) konvensi panggilan alih-alih secara eksplisit mendeklarasikan konvensi panggilan untuk setiap fungsi.
Persyaratan
| Jenis | Deskripsi |
|---|---|
| Klien | - IIS 7.0 di Windows Vista - IIS 7.5 di Windows 7 - IIS 8.0 di Windows 8 - IIS 10.0 pada Windows 10 |
| Server | - IIS 7.0 di Windows Server 2008 - IIS 7.5 di Windows Server 2008 R2 - IIS 8.0 di Windows Server 2012 - IIS 8.5 di Windows Server 2012 R2 - IIS 10.0 di Windows Server 2016 |
| Produk | - 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 |
Lihat juga
Antarmuka IHttpRequest
Metode IHttpRequest::NegotiateClientCertificate