OpenSSL TLS Server - использовать белый список сертификатов клиентов - PullRequest
0 голосов
/ 17 февраля 2020

Я разрабатываю клиент-серверное приложение C ++, которое использует OpenSSL. Сервер использует белый список для приема только определенных клиентов.

На сервере я создаю самозаверяющий сертификат root (rootCA.pem), который также используется в качестве сертификата сервера. (Я буду использовать отдельный сертификат сервера в будущем, это описание моего приложения сейчас). Клиенты генерируют CSR, которые подписываются сервером с использованием сертификата root (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" имеет поле keySsature digitalSignature.

Еще один вопрос: предположим, что у меня работает рукопожатие, как мне затем отключить клиентов, упростив удаление их сертификата из "clientCertificatesFolder"? Есть ли в OpenSSL функция «проверить, подтвержден ли еще клиент», которую я могу использовать?

1 Ответ

0 голосов
/ 17 февраля 2020

Обычно серверу не нужно знать сертификаты клиентов перед попытками подключения. Сервер может выполнять аутентификацию клиента TLS с использованием доверенного сертификата CA.

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 принимает только клиентов, которые имеют действительную цепочку сертификатов и правильный закрытый ключ сертификата клиента. (= root сертификат цепочки сертификатов должен быть в "rootCA.pem").

Если какой-то белый список все еще действительно необходим, вы можете реализовать его в функции callback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...