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_file和SSL_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服务器-使用客户端证书白名单的主要内容,如果未能解决你的问题,请参考以下文章