Когда я компилирую следующий код с 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;
Это все то же самое. Я установил openssl через brew, и при запуске версии openssl он показывает 1.0.2p 14 августа 2018, но delphi продолжает загружать libssl.0.9.8.dylib
Indy динамически загружает OpenSSL во время выполнения, пытаясь загрузить несколько вариантов имен файлов, пока не найдет совпадение. Если файлы dylib, которые вы хотите использовать, отсутствуют в папке приложения, вы можете использовать функцию IdOpenSSLSetLibPath()
при запуске приложения, чтобы сообщить Indy, где они находятся.
Я скомпилировал библиотеки как 32-битные, он создал libssl.1.0.0.dylib и libcrypto.1.0.0.dylib. Я скопировал их в <app> / Contents / MacOS, где я также нашел другие библиотеки, но они по-прежнему не загружаются. Затем я переименовал их в libssl.dylib и libcrypto.dylib, и снова ничего. Я не могу загрузить библиотеки. Затем я скопировал их в свою пользовательскую папку и установил путь к ним с помощью IdOpenSSLSetLibPath (), и снова то же самое, они не будут загружены.
Я также попытался загрузить их вручную через LoadLibrary, можно было загрузить только libcrypto.1.0.0.dylib, libssl.1.0.0.dylib также не удалось загрузить LoadLibrary, и я не знаю почему. Не все мои проекты больше не работают в macOS 10.12 и ниже из-за этой вещи openssl.
Что ж, если вызов LoadLibrary()
напрямую не удастся, то, очевидно, Инди тоже потерпит неудачу. Вам нужно выяснить, почему LoadLibrary()
дает сбой. Это может быть плохая сборка, отсутствие зависимости и т. д. Но вы не можете просто переименовать файлы, поскольку libssl зависит от libcrypto, а значит, и от исходного имени файла. Кроме того, почему вы используете OpenSSL 1.0.0, а не 1.0.2?
Я скомпилировал 1.0.2p, и обе библиотеки созданы. Опять же, я могу загрузить libcrypto с помощью LoadLibrary, но не libssl. Ошибка для libssl: «Нет такого файла или каталога», даже если библиотека есть. Я могу протестировать его также с помощью FileExists () и его найденного, я тоже могу загрузить библиотеку в поток памяти, так что она определенно есть, и я не понимаю, почему я не могу загрузить ее с помощью LoadLibrary.
В этом случае вполне вероятно, что отсутствует зависимость, которую требует libssl, а не сама libssl.
Думаю, я разобрался. При компиляции библиотек путь, по которому они создаются, жестко запрограммирован в библиотеках, и при перемещении их, например, в папку моего приложения, libssl ищет libcrypto в том месте, где он был создан, поэтому я понятия не имею, как я могу связать их, потому что каждый Mac будет иметь другое местоположение / путь для приложения.
звучит как ошибка конфигурации в проектах библиотеки. Вам следует спросить об этом сообщество OpenSSL.
Во-первых, держитесь подальше от
sslvSSLv2
иsslvSSLv3
, так как они небезопасны и их больше никто не использует. И вам также не следует использоватьsslvSSLv23
в свойствеSSLVersions
. Используйте толькоsslvTLSv1
и новее. Тем не менее, ошибка 54 - это «Сброс соединения одноранговым узлом», что означает, что сервер принудительно закрывает соединение на своем конце. Возможно, ему не нравится ваше рукопожатие SSL / TLS. Может это просто ошибка в 10.12 (так как в 10.13 работает). Кто знает. Без трассировки стека, ведущей к ошибке сокета, и трассировки необработанного TCP-трафика, на самом деле нет способа ответить на этот вопрос.