我正在通过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 (在PFXImportCertStore
或InternetSetOption
步骤)?
PS 我正在使用Visual Studio 2017 / Windows 10 x64。
PPS 这是我上一篇文章的续集:Client authentication (certificat + private key) using WinInet。