Я разрабатываю клиент-серверное приложение 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 функция «проверить, подтвержден ли еще клиент», которую я могу использовать?