Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
2 дня мудохался с ошибками Could not load SSL library и Error connecting with ssl

весь интернет перерыл, обновился до 9.0.50, попробовал кучу всяких dll от openssl и собранных только для Indy, оставалось только на 10ку перейти, потом купить типа саму среду и весь тот бред что советуют в тырнетах

Суть проблемы в совместимости библиотек ssleay32.dll и libeay32.dll с Indy 9 в большинстве случаев с IdSSLOpenSSLHeaders.pas (частично наверное и IdSSLOpenSSL), в котором есть кривая функция Load, подгружающая эти библиотеки и проверяющая их "версию" (тестирование указателей на нахождение функций в либах). Поскольку функций там тьма, где в какой версии либ реализовано хрен поймешь, при отсутствии их естественно вываливается 1 ошибка, однако с подсунутыми валится вторая, но заметил особенность случайно - если либ нету на машине после получения первой ошибки подсовываем при запущенном EXE имеющие DLL и видим вдруг не с того не с сего - GET проходит, чудиса!? перезапускаем прогу - хертам, 2ая ошибка

лезем в эту Load и видим вот такую ересь
  if hIdCrypto = 0 then hIdCrypto := LoadLibrary(SSLCLIB_DLL_name);
  If hIdSSL = 0 Then hIdSSL := LoadLibrary(SSL_DLL_name) else exit;

  @IdSslCtxSetCipherList := LoadFunction(fn_SSL_CTX_set_cipher_list);
  @IdSslCtxNew := LoadFunction(fn_SSL_CTX_new);
  @IdSslCtxFree := LoadFunction(fn_SSL_CTX_free);
и бла бла бла

и в конце
  result :=
    (@IdSslCtxSetCipherList<>nil) and
    (@IdSslCtxNew<>nil) and
и тады

т.е. либа грузится, а потом начинается херня по ее проверке, хедеры при этом не освобождаются, но и доступа снаружи до этого бреда нет

вариант использованный мной следующий - поскольку мне не нужен весь функционах из хрен пойми какой либы подо что то собранный, просто напросто после инициализации всех переменных до гетов с постами делаю
IdSSLOpenSSLHeaders.Load

И ВСЕ!!! никаких версий не ищу, чужие исходники не правлю, если где вывалится дальше ошибка какой то функции нет - отдельно задебажу
10 июл 19, 09:53    [21923967]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
wolverin,

SSL конечно же, звиняйте
вопщим так для истории, кому немного допилить надо старые проги без тупых советов по обновлению
10 июл 19, 09:58    [21923970]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
если что откель брал инди и длл
https://indy.fulgan.com/
10 июл 19, 10:05    [21923976]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
а ну еще указывать надо SSLOptions.Method := sslvSSLv23;
10 июл 19, 10:15    [21923987]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
мож кому вариант патча пригодится
http://www.cyberforum.ru/post4978037.html

мне не помогло )
10 июл 19, 10:20    [21923993]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Cobalt747
Member

Откуда:
Сообщений: 2122
wolverin,

там есть такая функция IdSSLOpenSSLHeaders.WhichFailedToLoad
10 июл 19, 10:36    [21924005]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
Cobalt747,

есть, но перебирать и дальше дллки искать какую же надо нет никакого желания, в ручную делаете Load погнали дальше до ошибки
10 июл 19, 10:39    [21924009]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
wolverin
до ошибки

которой скорее всего и не будет
10 июл 19, 10:40    [21924011]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6529
wolverin,

проект большой или в начале?
если что (ну тупик то есть), переходите на Synapse :)
10 июл 19, 11:00    [21924027]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
Кроик Семён,

проект вообще лохматых годов, надо всего лишь json отправлять на https
10 июл 19, 11:01    [21924028]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6529
wolverin,

подумайте, может переход на Synapse будет и не таким затратным.


На всякий случай прикладываю код из моего проекта, вдруг пригодится

+ function SendHttpPostRequest

UNIT ...

INTERFACE

USES Classes;


   function SendHttpPostRequest(const AURL, APOSTData: string;
                                const AAnswer: TStream;
                                var AErrMsg: string;
                                const AUserName: string='';
                                const APassword: string=''): Boolean; overload;

   function SendHttpPostRequest(const AURL, APOSTData: string;
                                var AAnswer: string;
                                var AErrMsg: string;
                                const AUserName: string='';
                                const APassword: string=''): Boolean; overload;


IMPLEMENTATION

USES ssl_openssl, httpsend;


//------------------------------------------------------------------------------
//based on Synapse
//For HTTPS-Support:
//  1) USES ssl_openssl;
//  2) copy libeay32.dll
//  3) copy ssleay32.dll

function SendHttpPostRequest(const AURL, APOSTData: string;
                             const AAnswer: TStream;
                             var AErrMsg: string;
                             const AUserName: string;
                             const APassword: string): Boolean;
var
   HTTP: THTTPSend;
begin
   AErrMsg:='';

   HTTP := THTTPSend.Create();
   try
      HTTP.UserName:=AUserName;
      HTTP.Password:=APassword;

      //-- ShowMessage(HTTP.Sock.SSL.LibName);

      WriteStrToStream(HTTP.Document, APOSTData);
      HTTP.MimeType := 'application/x-www-form-urlencoded';
      Result := HTTP.HTTPMethod('POST', AURL);
      if Result then
         AAnswer.CopyFrom(HTTP.Document, 0)
      else
         AErrMsg:=HTTP.Sock.LastErrorDesc;
   finally
      FreeAndNil(HTTP);
   end;
end;
//------------------------------------------------------------------------------
function SendHttpPostRequest(const AURL, APOSTData: string;
                             var AAnswer: string;
                             var AErrMsg: string;
                             const AUserName: string;
                             const APassword: string): Boolean;
var
   Mem   : TMemoryStream;
   iLen  : integer;
begin
   AAnswer:='';
   AErrMsg:='';

   Mem:=TMemoryStream.Create();
   try
      Result:=SendHttpPostRequest(AURL,APOSTData,
                                  Mem,
                                  AErrMsg,
                                  AUserName, APassword);

      if Result then
      begin
         mem.Position:=0;
         iLen:=mem.Size;
         
         SetLength(AAnswer, iLen);
         if iLen>0 then
            mem.ReadBuffer(AAnswer[1],iLen);
      end
   finally
      FreeAndNil(Mem);
   end;
end;

END.

10 июл 19, 11:18    [21924045]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30502

вот потому я и не рекомендую никому начинать НОВЫЕ проекты на базе индюков...

Posted via ActualForum NNTP Server 1.5

10 июл 19, 12:23    [21924111]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 891
подумайте, может переход на Synapse будет и не таким затратным.


Как-то я пробовал делать обмен через https при помощи Synapse. Не понравилось то, что на этапе инициализации происходит возня с криптографией и прога из-за этого грузится на секунду дольше. В Indy и OverbyteIcs такой возни нет.
10 июл 19, 13:02    [21924142]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
Кроик Семён
подумайте, может переход на Synapse будет и не таким затратным.

) спасибо, не было бы привязки к старому локальному виндовому приложению - написал бы это все на java
10 июл 19, 13:48    [21924171]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
evgen29
Member

Откуда:
Сообщений: 125
забей на Инди. Старые серты может не читать.
Там нужно еще заморочиться поискать библиотеку под разные типы сертов.
Держи класс(только лишнее убери), использует com-объект винды для доступа к ссш:
unit HTTPClassUnit;

interface
uses ActiveX, ComObj, Variants, SysUtils;

type
  TSSHCom = class(TObject)
  private
    { Public declarations }
    class function Request(const URI, method, protocol: string; const data: string = ''; const token: string = ''; const location: string = ''): Widestring;
  public
    class function RequestHTTPS(const URI, method: string; const data: string = ''; const token: string = ''): Widestring;
    class function RequestHTTP(const URI, method: string; const data: string = ''; const token: string = ''): Widestring;
  end;

implementation
uses IniClassUnit, LogUnit, uLkJSON;

class function TSSHCom.Request(const URI, method, protocol: string; const data: string = ''; const token: string = ''; const location: string = ''): Widestring;
var
  Request: OleVariant;
  Resp, proxystr: string;
  status: integer;
  js: TlkJSONobject;
begin
  Request := CreateOleObject('WinHttp.WinHttpRequest.5.1');
  proxystr := IniRep.proxystr;
  if trim(proxystr) <> '' then
    Request.SetProxy(2, proxystr);
  LogClass.WriteLog('');
  LogClass.WriteLog('===========================================================');
  LogClass.WriteLog('proxystr=' + proxystr);
  LogClass.WriteLog('data=' + data);
  LogClass.WriteLog('token=' + token);
  LogClass.WriteLog('method=' + method);

  if location = '' then
  begin
    Request.Open(method, protocol + '://' + HostName + '/' + URI, False);
  end
     else
  begin
    Request.Open(method, location, False);
  end;
  Request.SetRequestHeader('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0');
  if trim(token) <> '' then
    Request.SetRequestHeader('Authorization', 'token ' + token);
  Request.SetRequestHeader('cache-control', 'no-cache');
  Request.SetRequestHeader('Accept-Language', 'ru');
  Request.SetRequestHeader('content-type', 'application/json');
  Request.SetRequestHeader('Accept-Charset', 'utf-8');
  Request.Send(data);
  LogClass.WriteLog('response_text=' + Request.ResponseText + ',status='+IntToStr(Request.Status));
  LogClass.WriteLog('===========================================================');
  LogClass.WriteLog('');  
  if Request.Status = 200 then
    result := Request.ResponseText else
  begin
    js := TlkJSON.ParseText(Request.ResponseText) as TlkJSONobject;
    if Request.Status = 301 then
      result := Self.Request(URI, method, protocol, data, token, Request.getResponseHeader('Location'))
    else
      raise Exception.Create(Request.ResponseText);
  end;
end;

class function TSSHCom.RequestHTTPS(const URI, method: string; const data: string = ''; const token: string = ''): Widestring;
begin
  result := TSSHCom.Request(URI, method, 'https', data, token);
end;

class function TSSHCom.RequestHTTP(const URI, method: string; const data: string = ''; const token: string = ''): Widestring;
begin
  result := TSSHCom.Request(URI, method, 'http', data, token);
end;

end.
10 июл 19, 14:34    [21924214]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Cobalt747
Member

Откуда:
Сообщений: 2122
Мимопроходящий
вот потому я и не рекомендую никому начинать НОВЫЕ проекты на базе индюков...

НОВЫЕ проекты на базе СТАРЫХ Indy.
10 июл 19, 15:40    [21924252]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Cobalt747
Member

Откуда:
Сообщений: 2122
Мы вот работаем на 10-ке, и прекрасно подходят стандартные сборки от OpenSSL
10 июл 19, 15:41    [21924254]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 543
Cobalt747
Мы вот работаем на 10-ке, и прекрасно подходят стандартные сборки от OpenSSL
Аналогично.
Единственное, что в мобильных приложения вместо TidHttp используем TNetHTTPClient, тогда с ssl вообще нет проблем
10 июл 19, 17:01    [21924313]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
L_argo
Member

Откуда:
Сообщений: 932
Cobalt747
Мы вот работаем на 10-ке, и прекрасно подходят стандартные сборки от OpenSSL
+1000.
Мудохался на 9-ке. Поставил 10 и все залетало.
11 июл 19, 10:17    [21924597]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30502

10.07.2019 15:40, Cobalt747 пишет:
> НОВЫЕ проекты на базе СТАРЫХ Indy.

любые индюки со временем становятся СТАРЫМИ.
а на совместимость эти "творцы" всегда плевали,
исключительно из любви к искусству.

если есть возможность не вляпаться в это Г,
то нужно эту возможность непременно использовать.

Posted via ActualForum NNTP Server 1.5

11 июл 19, 12:03    [21924739]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1976
wolverin,

Случайно не к Рудате соединяешься?
11 июл 19, 12:21    [21924760]     Ответить | Цитировать Сообщить модератору
 Re: SLL Indy 9 vs D7  [new]
wolverin
Member

Откуда:
Сообщений: 1029
Valery_B
Случайно не к Рудате соединяешься?

нет, к атоловским онлайн-кассам
1 авг 19, 06:29    [21939406]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить