Как сделать & quot; Аутентификацию клиента & quot; если я не могу предоставить закрытый ключ

Я хочу настроить свой локальный сервер для связи с моим клиентом. Они строят TLS-соединение, используя Openssl. Я пытаюсь реализовать двухстороннюю аутентификацию, как если бы сервер проверял клиента, а клиент также должен проверять сервер

Когда я использую сертификаты, сгенерированные мной, все работает нормально. Код выглядит следующим образом. Это код C ++ в клиенте. Я установил сертификат клиента, закрытый ключ и промежуточный сертификат. На стороне сервера я сохранил сертификат CA.

Отношения: CA подписывает промежуточный сертификат, промежуточный сертификат подписывает клиентский сертификат.

Как мы знаем, причина, по которой нам нужно предоставить закрытый ключ клиента, заключается в том, что клиент подпишет «вызов», а затем отправит его на сервер. Сервер может получить открытый ключ клиента по цепочке сертификатов и использовать его для декодирования зашифрованного «вызова», чтобы проверить, совпадают ли они. Вы можете увидеть эту ссылку для подробного процесса:
https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

Однако в моем сценарии у меня нет разрешения на получение закрытого ключа. У меня есть только API для вызова, который принимает дайджест или все, что мы хотим закодировать, в качестве входных данных и возвращает строку, закодированную закрытым ключом клиента.

Поэтому я не могу передать «ClientPrivateKeyFileTest» в TLS.

Я искал исходный код openssl, но все рукопожатия были сделаны в этой функции: SSL_do_handshake (), и мне не разрешено изменять эту функцию.

// load client-side cert and key
SSL_CTX_use_certificate_file(m_ctx, ClientCertificateFileTest, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(m_ctx, ClientPrivateKeyFileTest, SSL_FILETYPE_PEM);

// load intermediate cert
X509* chaincert = X509_new();
BIO* bio_cert = BIO_new_file(SignerCertificateFileTest, "rb");
PEM_read_bio_X509(bio_cert, &chaincert, NULL, NULL);
SSL_CTX_add1_chain_cert(m_ctx, chaincert)

m_ssl = SSL_new(m_ctx);

// get_seocket is my own API
m_sock = get_socket();

SSL_set_fd(m_ssl, m_sock)

// doing handshake and build connection
auto r = SSL_connect(m_ssl);

Я думаю, что все процессы рукопожатия будут выполнены после того, как я вызову SSL_connect (). Поэтому мне интересно, есть ли другой способ, которым я могу сделать, чтобы завершить аутентификацию клиента?

Например, я мог бы пропустить этап добавления закрытого ключа, но где-то настроить функцию обратного вызова, которая может обрабатывать все случаи, когда SSL должен использовать закрытый ключ для вычисления чего-либо.

PS: API — это черный ящик на клиентском компьютере.

Еще одна вещь, в эти дни я обнаружил, что движок openssl может помочь в решении этой проблемы. Но кто-нибудь знает, какой двигатель полезен для этой проблемы? Знак ЕС, проверка или другие?

Спасибо!!!!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …