我有OpenSSL服务器和客户端。
服务器只允许按函数SSL_CTX_load_verify_locations(ctx, cert, NULL)
连接一个证书,但这还不够。我想为组织CA签名的证书启用所有客户端的连接。
我应该使用什么?
我已经阅读了有关“良好”客户端证书的文件夹的设置路径,但实际上并不是我想要的,它也不适用于我。
有什么想法吗?
答案 0 :(得分:0)
SSL_CTX_load_verify_locations(ctx, cert, NULL)
...我想为组织CA签名的证书的所有客户启用连接。我应该使用什么?
在服务器上,您需要调用SSL_CTX_set_client_CA_list
让服务器发送CA列表(并触发客户端)。在您的情况下,列表是一个CA--组织的CA或组织内的从属CA.
您可以在SSL_CTX_set_client_CA_list(3)
找到OpenSSL手册页。它也在 SSL_CTX_load_verify_locations(3)
手册页上进行了讨论。
以下是如何 查找 使用它的示例(OpenSSL以自我记录代码而闻名):
$ cd openssl-1.0.2a
$ grep -R SSL_CTX_set_client_CA_list * | grep -v doc
...
apps/s_server.c: SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAfile));
...
以下是OpenSSL如何使用它apps/s_server.c
:
char* caFile = NULL;
...
else if (strcmp(*argv, "-CAfile") == 0) {
caFile = *(++argv);
...
if ((!SSL_CTX_load_verify_locations(ctx, caFile, caPath)) ||
(!SSL_CTX_set_default_verify_paths(ctx))) {
ERR_print_errors(bio_err);
}
...
if (caFile != NULL) {
SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(caFile));
您可以找到SSL_load_client_CA_file(3)
的手册页。
相关,在OpenSSL邮件列表中:Does STACK_OF(X509_NAME)
need to be free'd when using SSL_load_client_CA_file?
假设您的组织PKI看起来像这样:
++++++++++++++++
+ Organization +
+ Root CA +
++++++++++++++++
|
+-------------------+------------------+
| | |
+--------------+ +--------------+ +--------------+
| Client Auth | | Server Auth | | Other ... |
| Sub CA | | Sub CA | | Sub CA |
+--------------+ +--------------+ +--------------+
您可能希望发送Client Authentication
从属CA.如果在其他一个CA弧中发生某些事情,则会限制损坏。
问题案例是Diginotar,根CA受到损害。在这种情况下,您需要将整个PKI刻录到地面并重新开始。
从属CA将具有basicConstraint=critical, CA=true
。但他们不是自签名的。相反,它们将由Organizational Root CA
签署或认证。