Статья продолжает цикл о работе с сокетами в CODESYS и посвящена библиотекам SysSocket2 и CmpTls. Из неё можно узнать, как создавать TLS-соединения, настраивать контекст и сокет, а также как сертификаты влияют на аутентификацию.
- Протокол TLS обеспечивает шифрование, аутентификацию и целостность передаваемых данных.
- Библиотека SysSocket2 поддерживает сокеты типов STD и TLS, а CmpTls управляет настройками TLS.
- Контекст создаётся функцией CmpTlsCreateContext, которая возвращает RTS_IEC_HANDLE.
- При создании сокета нужно указать его тип в структуре SysSocket2.SysSocket2_Parameter и вызвать SysSock2Create.
- Обмен данными выполняется функциями SysSock2Recv и SysSock2Send.
- Перенос сертификата сервера из доверительных в карантин приводит к ошибке рукопожатия и отсутствию соединения.
- TLS
- SysSocket2
- CmpTls
- CmpTlsCreateContext
- RTS_IEC_HANDLE
- SysSocket2_Parameter
- SysSock2Create
- SysSock2Recv
- SysSock2Send
Кому полезно: Инженерам АСУ ТП, разрабатывающим защищённые сетевые соединения на CODESYS.
Первоисточник: blog.engcore.ru
Выжимка составлена редакцией сайта с помощью ИИ по тексту статьи.
Продолжаем работать с сокетами в среде разработки Codesys. Пройдем обзорно по шифрованию, протоколу который это позволяет сделать и как это все реализуется.
- TLS
- SysSocket2 и CmpTls
- Cоздание контекста
- Создание сокета
- Обмен данными
- Отличие в работе SysSocket и SysSocket2 с TLS сокетом
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 в сеть будут отправлены пакеты следующего вида
Но на конечном устройстве все супер
Вторая важная вещь это Аутентификация. Благодаря сертификатам мы можем запретить обмен данными.
В ПЛК загружен сертификат сервера, благодаря которому у нас и проходит проверка.
Теперь я его перемещу из доверительных в карантин и снов организую соединение с сервером
Что же изменилось? Сервер прилег, показав ошибку рукопожатий
Контроллер не установил соединение, а в сети произошел занимательный диалог
Но как только мы снова начнем доверять нашему сертификату, то снова на нашей улице будет праздник и обмен сообщениями.
Источник:https://blog.engcore.ru/2022/08/22/rabota-s-socket-codesys-v35-2/
Источник: статья в сообществе ВКонтакте