我正在编写一个服务器应用程序,它使用 CryptoAPI 和 Schannel 来设置与客户端的安全 SSL 连接。服务器要求客户端提交证书进行验证(通过在中设置ASC_REQ_MUTUAL_AUTH
标志AcceptSecurityContext
)。
我遇到的问题是某些客户端(即使用 的客户端javax.net.ssl
)没有传递他们的客户端证书(即使它已被配置为这样做)。我怀疑这是因为用于签署客户端证书的 CA 证书不在握手期间传递给客户端的 CA 列表中。
我尝试对以下内容进行变体以将 CA 证书添加到此列表中:
PCERT_CONTEXT caCertContext = ...; /* Imported from a DER formatted file */
HCERTSTORE systemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
0,
CERT_STORE_OPEN_EXISTING_FLAG |
CERT_SYSTEM_STORE_LOCAL_MACHINE,
L"ROOT");
bool ok = CertAddCertificateContextToStore(
systemStore,
caCertContext,
CERT_STORE_ADD_USE_EXISTING,
NULL);
if (!ok)
{
std::cerr << "Could not add certificate to system store!" << std::endl;
}
在上面的例子中CertAddCertificateContextToStore
总是失败。如果我更改CERT_SYSTEM_STORE_LOCAL_MACHINE
为,CERT_SYSTEM_STORE_CURRENT_USER
我会看到一个弹出窗口,要求我确认证书,但即使我接受 CA 证书也不会出现在发送给客户端的列表中。
我还尝试使用临时内存存储(我从这里获取的东西)扩展系统存储集合,但无济于事。
有人知道解决这个问题的方法吗?理想情况下以编程方式不使用任何 GUI 或外部工具?