仅允许客户端使用由组织CA签名的证书进行连接

时间:2015-05-08 23:22:30

标签: ssl openssl ssl-certificate verification

我有OpenSSL服务器和客户端。

服务器只允许按函数SSL_CTX_load_verify_locations(ctx, cert, NULL)连接一个证书,但这还不够。我想为组织CA签名的证书启用所有客户端的连接。

我应该使用什么?

我已经阅读了有关“良好”客户端证书的文件夹的设置路径,但实际上并不是我想要的,它也不适用于我。

有什么想法吗?

1 个答案:

答案 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签署或认证。