Работа с сокетами в Codesys V3.5 #2. Библиотеки SysSocket2 и CmpTls

Продолжаем работать с сокетами в среде разработки Codesys. Пройдем обзорно по шифрованию, протоколу который это позволяет сделать и как это все реализуется.

TLS

Протокол TLS предназначен для предоставления трёх услуг всем приложениям, работающим над ним, а именно: шифрование, аутентификацию и целостность. Технически, не все три могут использоваться, однако на практике, для обеспечения безопасности, как правило используются все три:

  • Шифрование – сокрытие информации, передаваемой от одного компьютера к другому;
  • Аутентификация – проверка авторства передаваемой информации;
  • Целостность – обнаружение подмены информации подделкой.

Для того чтобы установить криптографически безопасный канал данных, узлы соединения должны согласовать используемые методы шифрования и ключи. Протокол TLS однозначно определяет данную процедуру, подробнее это рассмотрено в пункте TLS Handshake. Следует отметить, что TLS использует криптографию с открытым ключом, которая позволяет узлам установить общий секретный ключ шифрования без каких-либо предварительных знаний друг о друге.

Важно ли это? Максимально. С точки зрения кибербезопасности OT(АСУТП) максимально дырявая, чего только стоят открытые 502 порты, что смотрят наружу. Раньше всех «спасал» воздушный зазор, но новые времена и все такое…

SysSocket2 и CmpTls

SysSocket2 стандартная библиотека Codesys, которая дает доступ к программному интерфейсу для коммуникации по протоколам TCP/IP чем-то похож на SysSocket, но умеет в два типа сокетов STD и TLS, интересуют сейчас вторые.

CmpTls требуется для управления настройками TLS, которые будут использоваться в других приложениях.

Эти библиотеки необходимо добавлять в менеджере библиотек.

Cоздание контекста

Контекст, в рамках Codesys это указатель на структуру, которая содержит все необходимые данные для работы соединения.

Создание происходит при помощи функции CmpTlsCreateContext, которая возвращает нам RTS_IEC_HANDLE.

По входным параметрам функции:

hCert — Обращение к сертификату. Закрытый ключ этого сертификата должен быть доступен. Может быть RTS_INVALID_HANDLE для клиентских соединений. Если сервер требует сертификат клиента, соединение в этом случае будет неудачным.

tlsMethod — версия протокола, по стандарту TLS v1.2

cipherList — список шифров. Оставьте 0, чтобы получить значение по умолчанию. По умолчанию будут использоваться шифры с ВЫСОКОЙ стойкостью шифрования и обменом ключами Diffie Hellman.

verifyMode — как проверять однорангового пользователя. Настройки различаются для клиента и сервера.

Ну и результат этого действия.

Пример создания контекста

Вот мой контекст, где я указываю, метод шифрования TLS v 1.2 и включаю проверку партнера, если вы хотите просто шифровать данные, то можно выключить проверку.

Создание сокета

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

SysSocket2.SysSocket2_Parameter — как раз и есть той структурой куда требуется положить все данные.

Пример создания структуры

И дальше создаем сам хэндлер для сокета функцией SysSock2Create. На вход отдаем указатель на параметры и указатель на результат выполнения функции, возвращает функция хэндлер для работы.

Обмен данными

Ничем не отличается от версии с SysSocket кроме того, что теперь функции называются SysSock2Recv и SysSock2Send

Отличие в работе SysSocket и SysSocket2 с TLS сокетом

Вот так выглядят пакеты в сети при обычном незащищенном обмене данными

Запрос от клиента
Ответ от сервера

При использовании SysSocket2 с TLS в сеть будут отправлены пакеты следующего вида

Запрос от клиента
Ответ от сервера

Но на конечном устройстве все супер

Сообщение запроса
Сообщение ответа

Вторая важная вещь это Аутентификация. Благодаря сертификатам мы можем запретить обмен данными.

Сертификат сервера

В ПЛК загружен сертификат сервера, благодаря которому у нас и проходит проверка.

Место нахождения сертификата

Теперь я его перемещу из доверительных в карантин и снов организую соединение с сервером

Что же изменилось? Сервер прилег, показав ошибку рукопожатий

Контроллер не установил соединение, а в сети произошел занимательный диалог

Но как только мы снова начнем доверять нашему сертификату, то снова на нашей улице будет праздник и обмен сообщениями.

Обратная связь

Телеграм канал с новостями и заметками здесь.

Телеграм-бот для ваших предложений и вопросов здесь

Группа в VK здесь

Почта для связи: info@engcore.ru

Ответить