我正在处理一个客户端-服务器应用程序,其中服务器是一个基于SSL证书执行客户端验证的Web服务器。服务器信任一个根CA证书。客户端是一个用C++开发的Windows应用程序,它有一个由中间CA签名的证书,该证书又由根CA签名。我可以通过使用WINHTTP_OPTION_CLIENT_CERT_调用WinHttpSetOptionapi,在https连接期间设置客户端证书CONTEXT作为选项。但是,这将只设置客户端证书,而不是整个链。服务器在其存储中没有中间CA,因此无法验证客户端。
如果客户端的证书存储区中已经存在完整的证书链,是否有方法在WinHttp中设置完整的客户端证书链?
3条答案
按热度按时间31moq8wy1#
服务器必须事先有CA证书,它不会信任客户端交给它的根CA。(我不确定它(服务器端)是否会信任由可信CA签名的中间CA,但我倾向于说不)。
信任客户端发送的某个随机CA会破坏整个证书验证点,您将不知道客户端提交的数据是否真正有意义。因此,将根和中间CA证书添加到服务器的证书存储中。(如果您没有访问权限,您将不得不与管理员交谈,让他们来做这件事)。
yshpjwxd2#
我看不出你做的有什么不对。
您正在实施mTLS。客户端有一个私钥,用于向服务器验证自己。大多数情况下,客户端将自己生成此私钥,并通过CSR将其发送到服务器。在您的情况下,您可以让某个CA为您生成此私钥。
mTLS用来代替客户端登录到服务器的其他方式。客户端本身并不关心证书链。客户端不需要验证自己。它只是发送一个通过其私钥编码的令牌。服务器需要根证书或中间证书来验证客户端发送的密钥。通常您只需将此根证书安装到您的普通证书存储中(服务器端),以便服务器可以验证客户端。
jfewjypa3#
只有我能找到的是将子CA添加到系统存储。在服务启动或安装过程中,打开CA证书存储并将证书上下文添加到其中。