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

时间:2019-03-25 17:45:56

标签: ssl authentication certificate windows c++

我正在尝试使用WinInet(通过Win32 API)在与服务器的https中进行通信。

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

HINTERNET ses = InternetOpenA("test",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0) ;
HINTERNET con = InternetConnectA(ses,"stackoverflow.com",INTERNET_DEFAULT_HTTPS_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,NULL) ;
HINTERNET req = HttpOpenRequestA(con,"GET",NULL,NULL,NULL,NULL,INTERNET_FLAG_SECURE,NULL) ;
HttpSendRequestA(req,NULL,0,NULL,0) ;
DWORD read ;
char  str[3000] ;
InternetReadFile(req,reinterpret_cast<void*>(str),sizeof(str)-1,&read);
str[read] = 0 ;
cout << &str[0] << endl ;

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

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

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

curl https://my.server --cert Client_cert.pem --key Client_key.pem --cacert Root_cert.pem

这是可能的证明!

在阅读WinInet文档时,我发现了一个名为“处理身份验证”的页面,但这全都与用户名:密码有关,与证书无关。

我发现我必须使用Crypt32库:我使用 CertCreateCertificateContext 创建证书上下文(使用来自 client_cert.pem 的二进制数据),然后使用 InternetSetOptionA 。但是随后, HttpSendRequestA 失败,并显示错误12157 ...

我必须承认,我将很高兴找到一个不错的教程或一些代码示例!顺便说一下,我对如何将我的私钥插入这些东西一无所知……

谢谢!

0 个答案:

没有答案