我正在开发使用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上的“检查客户是否仍被批准”功能吗?
答案 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
函数中实现它。