Продолжаем работать с сокетами в среде разработки 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
