ASIO + SSL от Boost не работают в некоторых условиях - PullRequest
2 голосов
/ 23 февраля 2012

Существует клиент-серверное приложение, написанное с использованием ASIO Boost (Boost v.1.48) + OpenSSL (v.1.0.0d). Полный OpenSSL (динамические / статические библиотеки и двоичные файлы) создается на заказ, тесты после сборки проходят корректно, и он статически связывается с клиентом и сервером. Код ASIO работает в асинхронном режиме. Все контексты SSL ASIO используют

boost::asio::ssl::context::sslv23
метод. Описание проблемы следующее.

Конфигурация 0

Сервер: работает под Win7 Prof SP1 (Comp0). Он использует самозаверяющий закрытый ключ (PK0) и открытый сертификат (PC0), сгенерированный с помощью специально созданных двоичных файлов OpenSSL, упомянутых выше. Сервер имеет бесконечное время ожидания. Клиент: работает под WinXP Prof SP3 (Comp1). Он использует публичный сертификат сервера (PC0). Время ожидания клиента составляет 20 секунд.

Клиенты успешно подключаются к серверу, но закрывают соединение на 20 секунд в методе рукопожатия SSL (boost :: asio :: ssl :: stream :: async_handshake). FAIL .

Конфигурация 1

Сервер и клиент работают на одном и том же Win7 Prof SP1 (Comp0), используют тот же интерфейс Ethernet и тот же PK0 / PC0, что и в конфигурации 0.

Клиенты успешно подключают рукопожатия, отправляют / получают данные и закрывают соединение. УДАЧИ .

Конфигурация 2

Сервер: работает под Win7 Prof SP1 (Comp0). Он использует самозаверяющий закрытый ключ (PK1) и открытый сертификат (PC1), сгенерированные специально созданными двоичными файлами OpenSSL, НО PK1 и PC1 генерируются пол года назад. PK0 / PC0 генерируются сегодня. Все ключи генерируются одними и теми же двоичными файлами OpenSSL (v.1.0.0d). Клиент: работает под WinXP Prof SP3 (Comp1). Используется открытый сертификат сервера (ПК1).

Клиенты успешно подключают рукопожатия, отправляют / получают данные и закрывают соединение. УДАЧИ .

Конфигурация 3

Сервер и клиент работают на одной и той же Win7 Prof SP1 (Comp0), используют тот же интерфейс Ethernet и тот же PK1 / PC1, что и в конфигурации 2.

Клиенты успешно подключают рукопожатия, отправляют / получают данные и закрывают соединение. Obviousely УСПЕХ .

Изменение версии OpenSSL до последней стабильной версии (v.1.0.0g) дает те же результаты.

Проблема не в рабочей конфигурации 0. У кого-нибудь когда-нибудь была такая проблема? Есть ли идеи, где может быть проблема? В каком направлении необходимо двигаться, чтобы решить проблему?

Обновление # 1 . Код, скомпилированный с использованием метода tlsv1 вместо sslv23, также не работает в конфигурации 0.

Окончательное обновление . Проблема исправлена. Причина в том, что системная дата Comp1 была в прошлом, то есть PK0 / PC0 будут выпущены в будущем для этого компьютера, и OpenSSL завершится неудачно в процедуре рукопожатия. PC1 выпущен в прошлом для Comp1, и он работает с ним без проблем. Для диагностики причины проблемы я использовал следующую команду, выполняемую на клиентском компьютере:

openssl s_client -connect server_ip:server_port
, где server_ip - адрес сервера, а server_port - порт прослушивания сервера. Теперь задача состоит в том, чтобы найти причину, по которой рукопожатие истекает, а не возвращает ошибку. Но это другая история. Я надеюсь, что мой пост поможет кому-то в будущем.

1 Ответ

2 голосов
/ 24 февраля 2012

Проблема исправлена. Причина в том, что системная дата Comp1 была в прошлом, то есть PK0 / PC0 будут выпущены в будущем для этого компьютера, и OpenSSL завершится неудачно в процедуре рукопожатия. PC1 выпущен в прошлом для Comp1, и он работает с ним без проблем. Для диагностики причины проблемы я использовал следующую команду, выполняемую на клиентском компьютере:

openssl s_client -connect server_ip:server_port
где server_ip - адрес сервера, а server_port - порт прослушивания сервера. Теперь задача состоит в том, чтобы найти причину, по которой рукопожатие истекает, а не возвращает ошибку. Но это другая история. Я надеюсь, что мой пост поможет кому-то в будущем.
...