Delphi FMX и Indy на OSX возвращают ошибки сокета, но не на ПК

Когда я компилирую следующий код с Windows в качестве цели, он отлично загружает сайт, компилируя его для OSX 10.12.x, Indy возвращает ошибку сокета № 54. В OSX 10.13 High Sierra тот же код работает нормально. После нескольких дней попыток я просто не могу понять.

Кто-нибудь знает обо мне?

Я использую Delphi 10.2 Tokyo.

id:=TIdHTTP.Create(nil);
ssl:=TIdSSLIOHandlerSocketOpenSSL.Create(id);
id.IOHandler:=ssl;
id.HTTPOptions:=[hoWantProtocolErrorContent,hoNoProtocolErrorException];
id.RedirectMaximum:=5;
id.ReadTimeout:=30000;
id.HandleRedirects:=true;

ssl.SSLOptions.SSLVersions:=[sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2,sslvSSLv2,sslvSSLv23,sslvSSLv3];

s:=id.Get('https://www.fleurtygirl.net/');

ssl.Free;
id.free;

Во-первых, держитесь подальше от sslvSSLv2 и sslvSSLv3, так как они небезопасны и их больше никто не использует. И вам также не следует использовать sslvSSLv23 в свойстве SSLVersions. Используйте только sslvTLSv1 и новее. Тем не менее, ошибка 54 - это «Сброс соединения одноранговым узлом», что означает, что сервер принудительно закрывает соединение на своем конце. Возможно, ему не нравится ваше рукопожатие SSL / TLS. Может это просто ошибка в 10.12 (так как в 10.13 работает). Кто знает. Без трассировки стека, ведущей к ошибке сокета, и трассировки необработанного TCP-трафика, на самом деле нет способа ответить на этот вопрос.

Remy Lebeau 14.08.2018 21:02

Это все то же самое. Я установил openssl через brew, и при запуске версии openssl он показывает 1.0.2p 14 августа 2018, но delphi продолжает загружать libssl.0.9.8.dylib

user7415109 15.08.2018 12:04

Indy динамически загружает OpenSSL во время выполнения, пытаясь загрузить несколько вариантов имен файлов, пока не найдет совпадение. Если файлы dylib, которые вы хотите использовать, отсутствуют в папке приложения, вы можете использовать функцию IdOpenSSLSetLibPath() при запуске приложения, чтобы сообщить Indy, где они находятся.

Remy Lebeau 15.08.2018 18:10

Я скомпилировал библиотеки как 32-битные, он создал libssl.1.0.0.dylib и libcrypto.1.0.0.dylib. Я скопировал их в <app> / Contents / MacOS, где я также нашел другие библиотеки, но они по-прежнему не загружаются. Затем я переименовал их в libssl.dylib и libcrypto.dylib, и снова ничего. Я не могу загрузить библиотеки. Затем я скопировал их в свою пользовательскую папку и установил путь к ним с помощью IdOpenSSLSetLibPath (), и снова то же самое, они не будут загружены.

user7415109 15.08.2018 22:56

Я также попытался загрузить их вручную через LoadLibrary, можно было загрузить только libcrypto.1.0.0.dylib, libssl.1.0.0.dylib также не удалось загрузить LoadLibrary, и я не знаю почему. Не все мои проекты больше не работают в macOS 10.12 и ниже из-за этой вещи openssl.

user7415109 15.08.2018 23:03

Что ж, если вызов LoadLibrary() напрямую не удастся, то, очевидно, Инди тоже потерпит неудачу. Вам нужно выяснить, почему LoadLibrary() дает сбой. Это может быть плохая сборка, отсутствие зависимости и т. д. Но вы не можете просто переименовать файлы, поскольку libssl зависит от libcrypto, а значит, и от исходного имени файла. Кроме того, почему вы используете OpenSSL 1.0.0, а не 1.0.2?

Remy Lebeau 15.08.2018 23:05

Я скомпилировал 1.0.2p, и обе библиотеки созданы. Опять же, я могу загрузить libcrypto с помощью LoadLibrary, но не libssl. Ошибка для libssl: «Нет такого файла или каталога», даже если библиотека есть. Я могу протестировать его также с помощью FileExists () и его найденного, я тоже могу загрузить библиотеку в поток памяти, так что она определенно есть, и я не понимаю, почему я не могу загрузить ее с помощью LoadLibrary.

user7415109 16.08.2018 10:53

В этом случае вполне вероятно, что отсутствует зависимость, которую требует libssl, а не сама libssl.

Remy Lebeau 16.08.2018 11:20

Думаю, я разобрался. При компиляции библиотек путь, по которому они создаются, жестко запрограммирован в библиотеках, и при перемещении их, например, в папку моего приложения, libssl ищет libcrypto в том месте, где он был создан, поэтому я понятия не имею, как я могу связать их, потому что каждый Mac будет иметь другое местоположение / путь для приложения.

user7415109 16.08.2018 11:34

звучит как ошибка конфигурации в проектах библиотеки. Вам следует спросить об этом сообщество OpenSSL.

Remy Lebeau 16.08.2018 17:49
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
309
0

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