- 这是我之前的问题的进化,那个问题与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的证书链)。
值得一提的是,我可以使用以下cURL命令行连接我的服务器:
curl https://my.server --cert Client_cert.pem --key Client_key.pem --cacert Root_cert.pem
这证明了这是可能的!
阅读WinInet文档,我找到了一个名为“Handling Authentication”的页面,但它全部都是关于用户名:密码的,没有关于证书的内容。
我发现我必须使用Crypt32库:我必须使用CertCreateCertificateContext创建证书上下文,然后将其插入证书存储中,然后将该存储用于我的连接... 好吧,我必须承认我很高兴能找到一个好的教程或一些代码示例! 顺便说一下,我不知道如何将我的私钥插入到那个东西中... 提前致谢!
PFXImportCertStore
导入它,但现在我有了一个全新的HCERTSTORE
,我不知道如何将它传递给我的https连接... 它没有使用InternetSetOption
... 我没有看到任何使用HCERTSTORE
作为参数的Internet或Http函数。 - Captain'Flam