OpenSSL: неожиданный EOF с сайта www.openssl.org с использованием собственного примера программы

На компьютере с 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 в частности, чтобы понять, почему это происходит. Буду признателен за некоторые подсказки.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
411
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прочитав документацию, вы можете установить опцию SSL_OP_IGNORE_UNEXPECTED_EOF, чтобы смягчить эту ситуацию, но установка этой опции не решает основную проблему — соединение по-прежнему терпит неудачу, всего на один шаг позже, заканчиваясь SSL_ERROR_ZERO_RETURN.

Демонстрационный код явно проверяет наличие SSL_ERROR_ZERO_RETURN.

https://github.com/openssl/openssl/blob/3de3d481b269e9831d0b9abd3598b262647ae050/demos/guide/tls-client-block.c#L246-L259

Это указывает на нормальное завершение (т. е. партнер решил закрыть соединение). Поскольку в демо-версии используется HTTP/1.0, это нормально и ожидаемо (соединение всегда закрывается после одного запроса). Когда я использую опцию SSL_OP_IGNORE_UNEXPECTED_EOF с tls-client-block.c и подключаюсь к www.openssl.org, кажется, все работает так, как ожидалось. Данные HTTP возвращаются и выводятся на экран, а затем соединение закрывается.

Ответ принят как подходящий

Вероятно, ни для кого не стало сюрпризом, что это оказалась проблема конфигурации среды, а не проблема примера программы или целевого веб-сервера. Компания HTTP-прокси и еще много чего. Переход на бесплатную сеть решил эту проблему и привел к другой; OpenSSL не удалось загрузить необходимые сертификаты, например Может ли OpenSSL в Windows использовать системное хранилище сертификатов?. Реализация решения в принятом ответе также решила эту проблему, и теперь я могу успешно подключиться и получить данные HTTP.

Спасибо Мэтту Касвеллу за то, что нашли время ответить!

Другие вопросы по теме