IPConnection.InitEncryption

From SunFlurry wiki
Revision as of 12:09, 13 March 2022 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  InitEncryption (Шифрование соединения)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, внешняя ошибка
Визуальность:Нет

Функция инициализирует шифрование клиентской стороны на существующем IP соединении (чаще всего TCP/IP). Связь должна быть уже установлена, шифрование может быть инициализировано уже после отсылки предварительной информации. На соединение с включенной функцией шифрования, накладываются некоторые ограничения на использование функций, к примеру, не получится использовать функции Receive или Peek. Блокирующие сокеты рекомендуются для использования совместно с шифрованным соединением, так как не все типы шифрования могут поддерживать иное. Чаще всего эта функция используется для включения шифрования на клиенте при обмене, на серверной стороне необходимо использовать функцию InitServerEncryption.

Синтаксис

IPConnection.InitEncryption(<Тип шифрования (STRING)>,<Путь и имя библиотеки шифрования (STRING)>,<Сертификаты и ключи (STRING)>,<Наименование метода клиента (STRING)>)

Аргументы

  • <Тип шифрования (STRING)> - Тип используемого шифрования. Последующие параметры будут зависеть от типа шифрования. На данный момент доступны следующие типы:
    • AES -- для шифрования используется алгоритм AES-256, никаких дополнительных данных не отсылается для установки протокола, клиент и сервер должны иметь одинаковый ключ шифрования при инициализации шифрования. Функцию InitEncryption можно вызывать как для сервера, так и для клиента. Второй параметр функции задает расписание шифрования AES-256, и должен являться ANSI строкой с размером 240 байт созданной с помощью функции CreateKeySchedule с первым параметром, равным нулю.
    • OpenSSL -- для шифрования инициализируются алгоритмы SSL/TLS, используемые при https соединениях с помощью бесплатных библиотек OpenSSL. Для серверной стороны необходимо пользоваться функцией InitServerEncryption вместо текущей. Второй, третий и четвертый параметры заданы следующим образом:
      • <Путь и имя библиотеки шифрования (STRING)> - задается путь и наименование библиотеки libssl*.dll, по этому же пути должна находиться библиотека libcrypto*.dll. Для 64-битных версий клиента, должны быть использованы 64-битные версии библиотеки (см. ProgramArchitecture). Работа библиотек была протестирована на версии 1.1.1 и на версии 3.0, рекомендуется использование указанных или более поздних версий.
      • <Сертификаты и ключи (STRING)> - (планируется к реализации) задается путь и имя личного сертификата, если он необходим при соединении. Сертификат должен иметь формат PEM.
      • <Наименование метода клиента (STRING)> - Аргумент может задавать имя определенного метода соединения. По умолчанию, используется метод OpenSSL TLS_client_method, однако, к примеру, можно форсировать использование TLSv1_1_client_method или TLSv1_client_method.
    • LibreSSL -- для шифрования инициализируются алгоритмы SSL/TLS, используемые при https соединениях с помощью бесплатных библиотек LibreSSL. Использование LibreSSL вместо OpenSSL позволяет загрузить информацию с сайтов, с которыми OpenSSL работает неверно. Для серверной стороны необходимо пользоваться функцией InitServerEncryption вместо текущей. Второй, третий и четвертый параметры заданы следующим образом:
      • <Путь и имя библиотеки шифрования (STRING)> - задается путь и наименование библиотеки libtls-*.dll, по этому же пути должны находиться библиотеки libssl-*.dll и libcrypto-*.dll. Для 64-битных версий клиента, должны быть использованы 64-битные версии библиотеки (см. ProgramArchitecture). Работа библиотек была протестирована на версии 2.5.5, рекомендуется использование указанной или более поздних версий.
      • <Сертификаты и ключи (STRING)> - (планируется к реализации) задается путь и имя личного сертификата, если он необходим при соединении. Сертификат должен иметь формат PEM.
      • <Наименование метода клиента (STRING)> - Аргумент не используется.

Примеры

//Пример показывает, как можно осуществить загрузку веб-страницы по ее адресу.
//Для загрузки по протоколу https требуется указание пути к библиотекам OpenSSL или LibreSSL.

  Function LoadPage(URL)
    bHTTPs:=pos("https://",Lowercase(URL));
    If pos("//",URL)>0 Then
      tearStr(URL,"//");
    EndIf;
    СтрДоб:=URL;    
    URL:=tearStr(СтрДоб,"/");
    //URL может содержать название параграфа
    СтрДоб:=TearStr(СтрДоб,"#");
    For i:=1 to 3 Do
      if bHTTPs Then
        tcp:=IPConnection.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=443"),1);
      Else
        tcp:=IPConnection.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=80"));
      EndIf;  
      if tcp.IsConnected Then
        Break;
      EndIf;
    EndDo;
    if not tcp.IsConnected Then
      Message("Could not connect: "+URL,"!");
      Exit;
    EndIf;
    СтрДоб:="/"+СтрДоб;
    if bHTTPs then
      //tcp.InitEncryption("LibreSSL","C:\LibreSSL255\libtls-15.dll");
      tcp.InitEncryption("OpenSSL","C:\OpenSSL111e\libssl-1_1.dll");
    endif;  
    tcp.HTTPSetOperation("GET "+СтрДоб+" HTTP/1.0");
    tcp.HTTPSetHeaderField("Host",tcp.HTTPPunycodeEncode(URL));
    tcp.HTTPSetHeaderField("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
    tcp.HTTPSetHeaderField("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    tcp.HTTPSetHeaderField("Accept-Language","en");
    tcp.HTTPSetHeaderField("Connection","Close");
    Стр:="";
    Try
      If tcp.HTTPSendAndReceive Then
        Стр:=tcp.HTTPBodyAsString;
        If _And(Pos(_NEWLINE,Стр)=0,Pos(Chr(10),Стр)>0) Then
          Стр:=Replace(Стр,Chr(10),_NEWLINE);
        EndIf;
      EndIf;
    Except
      Message("Could not load: "+URL,"!");
    EndTry;  
    Exit Стр;
  EndFunction

s:=LoadPage("https://en.wikipedia.org/wiki/Main_Page");
Message(s);