Как правильно заставить Indy TIdHttp использовать библиотеки SSL из определенной папки? - PullRequest
0 голосов
/ 26 мая 2019

Я успешно использую TIdHttp от Indy (версия 10 с Delphi 2009) для отправки данных по https с использованием кода ниже

var
  HttpClient: TIdHttp;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  FormData : TIdMultiPartFormDataStream;

begin
  FormData := TIdMultiPartFormDataStream.Create;
  HttpClient:= TIdHttp.Create;
  IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
  HttpClient.IOHandler := IdSSLIOHandler;
  ...
  <the rest of the code that uses HttpClient in the normal way> 
  ...

Однако, похоже, это работает, только если файлы SSL libeay32.dll и ssleay32.dll находятся в той же папке, что и мой exe.Мне нужно, чтобы они загружались из подпапки ProgramData.

Если я копирую libeay32.dll и ssleay32.dll из папки exe и помещаю их в папку C:\ProgramData\CommonData\, а затем задаю путь SSL с помощью IdOpenSSLSetLibPath (см. Ниже), я получаю сообщение об ошибке, утверждающее, что он не может загрузить библиотеки SLL.

var
  HttpClient: TIdHttp;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  FormData : TIdMultiPartFormDataStream;

begin
  FormData := TIdMultiPartFormDataStream.Create;
  HttpClient:= TIdHttp.Create;
  IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
  IdOpenSSLSetLibPath('C:\ProgramData\CommonData');  //set path to libeay32.dll and  ssleay32.dll
  HttpClient.IOHandler := IdSSLIOHandler;
   ...
  <the rest of the code that uses HttpClient in the normal way> 
  ...

Использование showmessage(whichfailedtoload ) в обработчике исключений, кажется, подтверждает, что это C:\ProgramData\CommonData\libeay32.dll, который первымне удается загрузить.Поэтому Indy ищет в правильном месте, где должен найти идентичный файл.

Я не знаю, должен ли я вызывать IdOpenSSLSetLibPath до или после создания HttpClient, или до или после назначения IdSSLIOHandler, но это не так.кажется, не имеет большого значения в любом случае.

Я проверил эти сообщения здесь и здесь , а также сообщение на форуме здесь

Может кто-нибудь сказать мне, почемуидентичные библиотеки SSL загружаются и работают правильно, когда они находятся в папке exe, но не в подпапке ProgramData, назначенной с помощью IdOpenSSLSetLibPath?- Еще лучше, как заставить это работать!

Кстати, я даже использовал утилиту сравнения двоичных файлов, чтобы гарантировать идентичность файлов SSL в двух местах, а также использовал PE, чтобы убедиться, что когда это работаетон действительно использует библиотеки DLL в папке exe, а не откуда-либо еще.

1 Ответ

0 голосов
/ 26 мая 2019

Полагаю, я мог бы найти ответ.Файлы SSL, которые я получил от openssl-1.0.0j-win32-vc.zip.Когда я снова попытался использовать openssl-1.0.2r-i386-win32.zip, загруженный из https://indy.fulgan.com/SSL/, он работал правильно, когда файлы находились в подпапке ProgramData.Таким образом, похоже, что файлы 1.0.0j могли включать в себя некоторую зависимость от других файлов, чего нет в 1.0.2r.

Это нелегко, хотя сайт фулгана для загрузки упоминается в некоторых сообщениях SO, как будто очевидно, что мы должны знать об этом, не все сообщения упоминают об этом, а некоторые просто говорят «получите последнюю версию»библиотеки.Пытаться выяснить, какие из них самые последние и где они, довольно сложно.Даже на сайте fulgan есть как 1.0.2r, так и 1.0.2q, и нет никаких указаний относительно того, какой из них является последним (если буква не является каким-то алфавитным номером версии)

...