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

时间:2020-02-17 11:19:23

标签: c++ openssl

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

在服务器上,我生成一个自签名的根证书(rootCA.pem),该证书也用作服务器证书。 (将来我将使用单独的服务器证书,现在正在描述我的应用程序)。 客户端生成CSR,这些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_file SSL_CTX_use_PrivateKey_file )并注释其他内容,则该应用程序可以正常工作。

“ rootCA.pem”具有digitalSignature keyUsage字段。

另一个问题是,假设我正在握手,那么如何通过简化从“ clientCertificatesFolder”中删除其证书的方式断开客户端的连接?我可以使用OpenSSL上的“检查客户是否仍被批准”功能吗?

1 个答案:

答案 0 :(得分:0)

通常,服务器在尝试连接之前不需要知道客户端证书。 服务器可以使用受信任的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函数中实现它。