Можно ли реализовать закрепление сертификата с помощью Win32 WinHTTP API, и если да, то как? т.е. как я могу проверить возвращенный сертификат сервера на «известный исправный», желательно без необходимости постоянной записи сертификата в локальное хранилище сертификатов.
Закрепление сертификата с помощью WinHTTP API
Ответы (2)
(вдохновленный ответом jww)
Во-первых, я нашел эту страницу отличной базой для чтения о закреплении и выборе между сертификатом и общедоступным ключом. закрепление ключей.
Я реализовал закрепление сертификата с помощью WinHTTP API следующим образом:
После WinHttpOpen, но до WinHttpConnect настройте обратный вызов при отправке запросов:
WinHttpSetStatusCallback(hSession, &callbackFunc, WINHTTP_CALLBACK_SENDING_REQUEST, NULL);
В функции обратного вызова извлеките необработанный большой двоичный объект сертификата:
PCCERT_CONTEXT pCert=NULL; DWORD dwSize=sizeof(pCert); WinHttpQueryOption(hInternet, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &pCert, &dwSize);
Затем, если вы выполняете полное закрепление сертификата, сравните
sha1(pCert->pbCertEncoded)
с отпечатком известного хорошего сертификата SHA1.-Или- если вместо этого выполняется закрепление открытого ключа, сравните
sha1(pCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData)
с заведомо исправным SHA1 открытого ключа сервера.
CryptEncodeObject(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, ...)
перед хешированием. Кстати, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST теперь также кажется устаревшим, без очевидной замены :-(
- person bobince; 24.08.2015
CertGetCertificateContextProperty(pCertContext, CERT_HASH_PROP_ID, thumbprint, &thumbprint_size)
для получения отпечатка, то есть хэша SHA1.
- person Robert; 28.01.2021
Можно ли реализовать закрепление сертификата с помощью Win32 WinHTTP API, и если да, то как?
Похоже, вы можете закрепить сертификат. Вы можете установить обратный вызов с помощью WINHTTP_STATUS_CALLBACK
. Когда обратный вызов вызывается с помощью WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
, вы можете проверить сертификат с помощью WinHttpQueryOption
и WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
. Сертификат сервера возвращается в структуре WINHTTP_CERTIFICATE_INFO
.
Есть страница по адресу SSL в WinHTTP., предлагающий дополнительную информацию.
... без необходимости постоянно записывать сертификат в локальное хранилище сертификатов.
Проблема с хранилищем сертификатов заключается в том, что другой орган может претендовать на сертификацию сайта, к которому вы подключаетесь. В этом случае настоящему доверенному лицу даже не нужно находиться в магазине, чтобы получить pwn'd. Это одна из [очевидных] проблем с моделью безопасности веб-приложений/браузеров и CA Zoo.