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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL TLS服务器-使用客户端证书白名单相关的知识,希望对你有一定的参考价值。

我正在开发使用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_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函数中实现它。

以上是关于OpenSSL TLS服务器-使用客户端证书白名单的主要内容,如果未能解决你的问题,请参考以下文章

使用 openssl 生成证书

证书链和TLS Pinning

TLS证书验证失败

OpenSSL 客户端证书与服务器证书

使用OpenSSL创建CA和申请证书

为 SSL / TLS 配置 Proton 引发 openssl 错误版本号和 gRPC 客户端错误