Я хочу настроить свой локальный сервер для связи с моим клиентом. Они строят 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 может помочь в решении этой проблемы. Но кто-нибудь знает, какой двигатель полезен для этой проблемы? Знак ЕС, проверка или другие?
Спасибо!!!!
Задача ещё не решена.
Других решений пока нет …