IPConnection.InitServerEncryption

From SunFlurry wiki
Jump to: navigation, search
  InitServerEncryption (Шифрование соединения)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, внешняя ошибка
Визуальность:Нет

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

Синтаксис

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

Аргументы

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

Примеры

//Пример показывает создание TLS сервера для осуществления простого обмена (в этом случае, не с помощью https протокола)
//При работе с https протоколом, можно пользоваться стандартными функциями, типа HTTPReceiveHeader, HTTPSend и пр.

аСервер:=IPConnection.ListenEx(8000);

//Ожидаем соединения
While 1 Do
  аСервер.Wait(10,4);
  аКлиент:=аСервер.Accept();
  If isEmpty(аКлиент) Then
    Continue;
  EndIf;
  //Появилось новое соединение
  Try
    Message("Внешнее соединение от: "+TCP.PeerAddress);
    TCP.IsBlocking:=1;
    TCP.InitServerEncryption("OpenSSL","C:\OpenSSL111e\libssl-1_1.dll","C:\OpenSSL111e\bin\PEM\server.pem"+_NEWLINE+"C:\OpenSSL111e\bin\PEM\server.pem");
    Message("Получено сообщение от клиента: "+TCP.ReceiveStr);
    If not TCP.SendStr("Answer to a message") Then
      Message("Ошибка отправки ответа!","!");
    EndIf;
    Message("Обмен прошел успешно!")
  Except
    Message(PopError(),"!");
  EndTry;
EndDo;