OpenSSL TLS服务器-使用客户端证书白名单



我正在开发一个使用OpenSSL的C++客户端/服务器应用程序。服务器使用白名单以便只接受某些客户端。

在服务器上,我生成了一个自签名的根证书(rootCA.pem(,它也用作服务器证书。(我将来将使用一个单独的服务器证书,这是对我的应用程序的描述(。客户端生成CSR,服务器使用根证书(rootCA.pem(对其进行签名。然后,这些客户端证书将发送给客户端供其使用,并放置在"clientCertificate"文件夹中。我正在尝试接受来自已批准客户端的连接,但它不起作用。

SSL_CTX_use_certificate_file(ctx, "rootCA.pem", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "serverPrivateKey.pem", SSL_FILETYPE_PEM);
STACK_OF(X509_NAME) *list;
list = SSL_load_client_CA_file("rootCA.pem");
SSL_CTX_set_client_CA_list(ctx, list);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
SSL_CTX_load_verify_locations(ctx, NULL, "clientCertificate")

我犯了明显的错误吗?

如果我只使用前两行(仅SSL_CTX_use_certificate_fileSSL_CTX_use_PrivateKey_file(并注释其他行,则应用程序可以工作。

"rootCA.pem"具有digitalSignature keyUsage字段。

另一个问题是,假设握手有效,那么我如何通过简化从"clientCertificatesFolder"中删除证书来断开客户端的连接?我是否可以使用OpenSSL中的"检查客户端是否仍然获得批准"功能?

通常服务器在尝试连接之前不需要知道客户端的证书。服务器可以使用受信任的CA证书进行TLS客户端身份验证。

SSL_CTX_load_verify_locations(ctx, "rootCA.pem", NULL)
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, callback);

这样,TLS服务器只接受具有有效证书链和客户端证书的正确私钥的客户端。(=证书链的根证书必须在"rootCA.pem"中(。

如果仍然需要某种白名单,可以在callback函数中实现。

最新更新