На компьютере с Windows 10 я настроил проект OpenSSL 3.3 через vcpkg и скомпилировал пример программы, который они предоставили по адресу https://github.com/openssl/openssl/blob/master/demos/guide/tls- client-block.c
Я попытался сделать HTTPS-запрос к www.openssl.org:443 с помощью этой программы (полная командная строка: tls-client-block www.openssl.org 443
), но соединение не удалось с выводом журнала:
Failed to connect to the server
2C7C0000:error:0A000126:SSL routines::unexpected eof while reading:ssl\record\rec_layer_s3.c:692:
Прочитав документацию, вы можете установить опцию, чтобы смягчить это, SSL_OP_IGNORE_UNEXPECTED_EOF
, но установка этой опции не решает основную проблему — соединение по-прежнему не удается, всего один шаг спустя, заканчиваясь на SSL_ERROR_ZERO_RETURN
.
Попытка установить соединение с wget https://www.openssl.org:443/
работает; как и веб-браузер, что неудивительно. Но я не уверен, что кто-то из них использует OpenSSL сзади, поскольку не думаю, что это системная библиотека в Windows.
Похоже, что сервер просто отклоняет клиент, настроенный в официальном примере, и я еще недостаточно знаю о TLS в целом и OpenSSL в частности, чтобы понять, почему это происходит. Буду признателен за некоторые подсказки.
Прочитав документацию, вы можете установить опцию SSL_OP_IGNORE_UNEXPECTED_EOF, чтобы смягчить эту ситуацию, но установка этой опции не решает основную проблему — соединение по-прежнему терпит неудачу, всего на один шаг позже, заканчиваясь SSL_ERROR_ZERO_RETURN.
Демонстрационный код явно проверяет наличие SSL_ERROR_ZERO_RETURN.
Это указывает на нормальное завершение (т. е. партнер решил закрыть соединение). Поскольку в демо-версии используется HTTP/1.0, это нормально и ожидаемо (соединение всегда закрывается после одного запроса). Когда я использую опцию SSL_OP_IGNORE_UNEXPECTED_EOF
с tls-client-block.c и подключаюсь к www.openssl.org, кажется, все работает так, как ожидалось. Данные HTTP возвращаются и выводятся на экран, а затем соединение закрывается.
Вероятно, ни для кого не стало сюрпризом, что это оказалась проблема конфигурации среды, а не проблема примера программы или целевого веб-сервера. Компания HTTP-прокси и еще много чего. Переход на бесплатную сеть решил эту проблему и привел к другой; OpenSSL не удалось загрузить необходимые сертификаты, например Может ли OpenSSL в Windows использовать системное хранилище сертификатов?. Реализация решения в принятом ответе также решила эту проблему, и теперь я могу успешно подключиться и получить данные HTTP.
Спасибо Мэтту Касвеллу за то, что нашли время ответить!