使用非持久性根证书使用Wininet进行Https客户端身份验证

时间:2019-05-16 17:47:20

标签: c++ authentication ssl https wininet

我正在通过https与需要客户端身份验证的服务器通信。

要使其正常工作,我必须使用 Microsoft管理控制台(mms)将服务器根证书导入Windows的全局证书存储中。

但是我正在尝试使其静默运行。

所以我的问题是:

如何告诉Wininet给定的证书是根证书,以便它可以用来检查整个证书链?

(没有用户处理,也没有管理员特权,也没有系统级注册)

更多详细信息:

我有(a)证书+(b)客户的私钥。

我有(c)服务器的根证书。

我构建了一个包含(a)和(b)的pfx文件:

openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile root.pem -out test.pfx

现在,我可以使用 test.pfx 构建证书存储 CS (使用PFXImportCertStore)。

在构建请求期间,我设置了来自 CS 的所有证书(使用InternetSetOption(INTERNET_OPTION_CLIENT_CERT_CONTEXT)

这是我的代码的极简摘要:

CRYPT_INTEGER_BLOB blob ;
blob.pbData = ...pointer to a buffer containing test.pfx
blob.cbData = ...size of this buffer
HCERTSTORE cs = PFXImportCertStore( &blob,L"pw",PKCS12_NO_PERSIST_KEY ) ;
HINTERNET ses = InternetOpen("test",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0) ;
HINTERNET con = InternetConnect( ses,"server",4444,NULL,NULL,INTERNET_SERVICE_HTTP,0,NULL ) ;
HINTERNET req = HttpOpenRequest( con,"POST",NULL,NULL,NULL,NULL,INTERNET_FLAG_SECURE,NULL ) ;
PCCERT_CONTEXT pc = CertEnumCertificatesInStore( cs,0 ) ;
for (; pc ; pc = CertEnumCertificatesInStore( cs,pc ))
    InternetSetOption( req,INTERNET_OPTION_CLIENT_CERT_CONTEXT,(void*)pc,sizeof( CERT_CONTEXT )) ;
HttpSendRequest( req,NULL,0,NULL,0 ) ;

但是它并不能正常工作。

我必须在Windows的证书存储区中插入根证书(c)。

此外,插入pfx文件中的证书(c)无效。

我可以在openssl命令行中忽略它。

由于我希望它静默运行,并且此根证书仅用于此单独请求,因此我想知道是否可以将其标记为 root (在PFXImportCertStoreInternetSetOption步骤)?

PS 我正在使用Visual Studio 2017 / Windows 10 x64。

PPS 这是我上一篇文章的续集:Client authentication (certificat + private key) using WinInet

0 个答案:

没有答案