使用WinHttp的客户端身份验证(证书+私钥)

时间:2019-03-20 10:14:52

标签: c++ ssl winapi https winhttp

我正在尝试使用Win32 API在https与服务器进行通信。

这是一个非常简单的代码:

HINTERNET ses = WinHttpOpen(L"test",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0 ) ;
HINTERNET con = WinHttpConnect(ses,L"stackoverflow.com",INTERNET_DEFAULT_HTTPS_PORT,0 ) ;
HINTERNET req = WinHttpOpenRequest(con,L"GET",NULL,NULL,WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,WINHTTP_FLAG_SECURE ) ;
WinHttpSendRequest( req,WINHTTP_NO_ADDITIONAL_HEADERS,0,WINHTTP_NO_REQUEST_DATA,0,0,0 ) ;
WinHttpReceiveResponse( req,NULL ) ;
char buffer [10000] ;
unsigned long size ;
WinHttpReadData( req,reinterpret_cast<void*>( buffer ),sizeof( buffer )-1,&size ) ;
buffer[size] = 0 ;
cout << buffer << endl ;

只要我与“经典” https服务器(如 stackoverflow.com )进行通信,一切都会顺利进行。 问题是当我尝试与请求客户端身份验证的服务器通信时。

我有3个.pem文件:客户端的证书和私钥,以及用于验证客户端证书的根证书(即长度为2的证书链)。

有关信息,我可以使用以下cULR命令行连接服务器:

curl https://my.server --cert Client_cert.pem --key Client_key.pem --cacert Root_cert.pem 所以我知道这是可能的!

在阅读win32 API文档后,我发现关键是要调用 WinHttpSetOption,但在选项WINHTTP_OPTION_CLIENT_CERT_CONTEXTWINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST之间不清楚。 而且我没有找到如何传递我的数据(cert + key文件)。

有什么明智的建议吗? 预先感谢!

0 个答案:

没有答案