ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-02 21:05:52  阅读:362  来源: 互联网

标签:wininet c ssl https winapi


>这是我的previous question的演变,这是关于WinHttp.
>我希望这是正确的方法……

我正在尝试使用WinInet(来自Win32 API)与服务器进行https通信.

这是一个极简主义的代码:

HINTERNET ses = InternetOpen("test",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0) ;
HINTERNET con = InternetOpenUrl( ses,"https://stackoverflow.com",NULL,0,0,0 ) ;
DWORD read ;
char  str [3000] ;
InternetReadFile( con,reinterpret_cast<void*>( str ),sizeof( str )-1,&read ) ;
str[read] = 0 ;
cout << &str[0] ;
InternetCloseHandle( con ) ;
InternetCloseHandle( ses ) ;

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

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

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

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

这证明它是可能的!

阅读WinInet文档后,我找到了一个名为“Handling Authentication”的页面,但它完全是关于用户名:密码,并且没有关于证书的内容.

我发现我必须使用Crypt32库:我必须使用CertCreateCertificateContext创建证书上下文,然后将其插入certificat商店,然后使用该商店进行连接…
好吧,我必须承认,我很乐意找到一个好的教程或一些代码示例!
顺便说一句,我没有关于如何将我的私钥插入那些东西的线索……

提前致谢 !

解决方法:

您必须使用INTERNET_OPTION_CLIENT_CERT_CONTEXT将证书传递给WinInet,并致电InternetSetOption()

INTERNET_OPTION_CLIENT_CERT_CONTEXT

84

This flag is not supported by InternetQueryOption. The lpBuffer
parameter must be a pointer to a CERT_CONTEXT structure and not a
pointer to a CERT_CONTEXT pointer. If an application receives
ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED, it must call InternetErrorDlg
or use InternetSetOption to supply a certificate before retrying the
request. CertDuplicateCertificateContext is then called so that the
certificate context passed can be independently released by the
application.

所以,例如:

InternetSetOption(hI,INTERNET_OPTION_CLIENT_CERT_CONTEXT,(void*)cert,sizeof(CERT_CONTEXT));

顺便说一句,curl调用不是很好的例子,因为curl使用的是使用OpenSSL的libcurl.

标签:wininet,c,ssl,https,winapi
来源: https://codeday.me/bug/20191002/1844588.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有