Is it possible to implement certificate pinning using the Win32 WinHTTP API, and if so how? I.e. how can I check the returned server certificate against a 'known good' one, preferably without having to permanently write the cert into the local certificate store.
相关问题
- Multiple sockets for clients to connect to
- the application was unable to start correctly 0xc0
- What is the best way to do a search in a large fil
- Mechanize getting “Errno::ECONNRESET: Connection r
- glDrawElements only draws half a quad
(inspired by jww's answer)
Firstly I found this page to be excellent background reading about pinning and the choice between certificate and public key pinning.
I implemented certificate pinning using WinHTTP API as follows:
After WinHttpOpen but before WinHttpConnect, setup a callback for when requests are sent:
WinHttpSetStatusCallback(hSession, &callbackFunc, WINHTTP_CALLBACK_SENDING_REQUEST, NULL);
In the callback function, retrieve the raw certificate blob:
PCCERT_CONTEXT pCert=NULL; DWORD dwSize=sizeof(pCert); WinHttpQueryOption(hInternet, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &pCert, &dwSize);
Then if doing full certificate pinning, compare
sha1(pCert->pbCertEncoded)
against a known good certificate SHA1 thumbprint.-Or- if doing public key pinning instead, compare
sha1(pCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData)
against a known good SHA1 of a server public key.It looks like you can pin the certificate. You can set a callback with
WINHTTP_STATUS_CALLBACK
. When the callback is invoked withWINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
, you can check the certificate withWinHttpQueryOption
andWINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
. The server certificate is returned in aWINHTTP_CERTIFICATE_INFO
structure.There's a page at SSL in WinHTTP that offers more information.
The problem with the certificate store is another authority could claim to certify the site you're connecting to. In this case, the real trusted authority does not even need to be in the store to get pwn'd. That's one of the [obvious] problem with the web app/browser security model and the CA Zoo.