Блог

OPC UA перестал подключаться после обновления: сертификат, доверие и политика безопасности

Вчера SCADA читала теги с ПЛК без замечаний. Сегодня после обновления прошивки, смены сертификата или установки патча на сервере клиент показывает «BadSecurityChecksFailed», «BadCertificateUntrusted» или просто зависает на этапе подключения. При этом ping до контроллера проходит, порт 4840 открыт, а соседний Modbus TCP по той же сети работает. Знакомая картина: связь есть, а сессия OPC UA не поднимается.

Здесь разбирается именно разрыв после изменения, а не ввод OPC UA с нуля. Не будет обзора всех профилей и не будет учебника по моделированию адресного пространства. Фокус на том, что чаще всего ломается на объекте: срок и замена сертификата, доверие в trust store, несовпадение SecurityPolicy и MessageSecurityMode, учетные данные пользователя и сетевые фильтры, которые внезапно начинают резать handshake.

Короткий ответ

После обновления OPC UA чаще всего отваливается из-за нового сертификата сервера, которому клиент еще не доверяет, или из-за смены политики безопасности на одной стороне без синхронизации на другой. Проверьте срок действия сертификата, совпадение thumbprint в trust store клиента, выбранные SecurityPolicy и режим подписи/шифрования, логин и пароль пользователя, а также не блокирует ли firewall промежуточные порты и фрагментированные пакеты handshake.

Порядок диагностики: зафиксировать текст ошибки клиента, сравнить настройки до и после обновления, открыть лог сервера OPC UA, проверить сертификаты на обеих сторонах, временно снизить уровень безопасности только в тестовой среде для локализации, затем вернуть требуемый режим и оформить доверие по регламенту.

Что меняется при обновлении

Обновление прошивки ПЛК, среды разработки, OPC-сервера на шлюзе или клиента SCADA/MES редко затрагивает только «логику тегов». Чаще пересоздается или перевыпускается сертификат приложения, меняется набор поддерживаемых политик безопасности, сбрасывается каталог доверенных сертификатов или меняется политика пользователей. Клиент, настроенный на старый thumbprint и режим SignAndEncrypt с Basic256Sha256, продолжает пытаться подключиться по прежнему профилю и получает отказ еще до чтения первого тега.

Полезно до любых работ сохранить экспорт настроек endpoint: URL, SecurityPolicy, MessageSecurityMode, тип аутентификации, имя пользователя (без пароля в открытом виде в общий чат), срок действия сертификата сервера и список доверенных сертификатов клиента. После обновления сравнение занимает десять минут и сразу отсекает половину версий «мы ничего не трогали».

Сертификат и срок действия

Сертификат OPC UA у приложения, как правило, самоподписанный или выпущенный внутренним УЦ предприятия. Он привязан к имени хоста или к конкретному Application URI. Если после обновления изменился URI приложения или сгенерировался новый ключ, старый сертификат перестает совпадать с ожиданиями клиента, даже если срок еще не истек.

Проверьте дату Not After в свойствах сертификата на сервере и в том файле, который клиент считал доверенным. Просроченный сертификат дает однозначный отказ. Чуть коварнее ситуация, когда сертификат новый и формально валидный, но клиент хранит в trust store предыдущую версию. Некоторые клиенты показывают диалог «принять сертификат», другие молча пишут BadCertificateUntrusted в журнал.

На объекте с несколькими клиентами (SCADA, MES, утилита администратора) доверие нужно обновить в каждом trust store или централизовать через корневой УЦ. Одноразовое «нажали OK на одной станции» оставляет остальные без связи.

Trust store: где теряется доверие

Trust store клиента - это список сертификатов, которым разрешено устанавливать защищенный канал. После cold start контроллера, замены модуля или восстановления из резервной копии каталог доверенных сертификатов на сервере тоже может обнулиться. Тогда сервер отклоняет клиентский сертификат, если политика требует взаимной аутентификации.

Сверьте три точки: сертификат, который сервер предъявляет клиенту; сертификат, который клиент предъявляет серверу (если используется); записи в rejected folder, куда OPC UA складывает непринятые peer-сертификаты. Наличие свежего файла в rejected - прямой указатель: связь доходит до обмена сертификатами, но доверие не оформлено.

Практический прием: экспортировать сертификат сервера с рабочего endpoint через штатную утилиту или браузер сертификатов, сравнить отпечаток (thumbprint SHA-1 или SHA-256 - смотрите, что показывает ваш клиент) с тем, что записан у клиента. Одна лишняя цифра в отпечатке означает, что доверяют не тому файлу.

SecurityPolicy и MessageSecurityMode

Даже при валидных сертификатах стороны должны договориться о политике шифрования. Сервер после обновления может отключить устаревший Basic128Rsa15 и оставить только Basic256Sha256 или Aes256_Sha256_RsaPss. Клиент, жестко прошитый на старый policy, не найдет общего endpoint и выдаст ошибку выбора endpoint или таймаут на CreateSession.

MessageSecurityMode задает, подписывается ли трафик, шифруется ли он или передается без защиты на уровне сообщений (None). Смешение режимов типично после копирования проекта: в конфигурации клиента стоит SignAndEncrypt, а на сервере для данного пользователя разрешен только Sign. В логе сервера это часто видно как отказ на этапе ActivateSession.

Снимите список endpoints через OPC UA клиент-эксплорер (любой штатный инструмент, уже используемый на объекте) и сравните с настройками рабочего подключения. Не подключайтесь сразу к «первому в списке» - у сервера их может быть несколько на одном порту с разными policy.

Пользователь, роли и блокировка учетки

Аутентификация Username/Password остается распространенной на шлюзах и SCADA. После обновления мог сброситься набор пользователей, измениться политика сложности пароля или истечь срок действия учетной записи интеграции. Симптом снаружи похож на сетевую проблему: CreateSession проходит, ActivateSession возвращает BadUserAccessDenied.

Проверьте, не включилась ли анонимная политика только для чтения на сервере, а клиент по-прежнему шлет имя пользователя с неверным паролем. И наоборот: сервер требует подписанный канал с пользователем, а клиент пытается Anonymous на endpoint с None. Журнал сервера в этот момент полезнее, чем десяток кликов в клиенте.

На объектах с доменной интеграцией отдельно смотрят синхронизацию часов: сильный skew между клиентом и сервером иногда ломает проверку токенов и сертификатов в связке с Kerberos или внешним IdP. Для встроенного пользователя OPC UA достаточно сверить часы в пределах допуска, указанного в документации платформы.

Firewall и сеть после изменений

Обновление иногда совпадает с переносом VLAN, сменой правил на межсетевом экране или включением глубокой инспекции пакетов. OPC UA использует TCP, но handshake и большие ответы Browse могут вести себя иначе, чем короткий Modbus TCP.

Проверьте, что разрешен именно порт endpoint (часто 4840, но на объекте может быть другой), что нет асимметричной маршрутизации после смены шлюза по умолчанию и что NAT не подменяет Application URI, если сертификат привязан к имени. Для диагностики снимите trace на клиенте и сервере в окно одной попытки подключения: если TCP SYN-ACK есть, а дальше RST или обрыв после ClientHello OPC - копайте policy и сертификаты; если SYN уходит в таймаут - сеть.

Промышленные сегменты с ограничением broadcast не мешают OPC UA point-to-point, но изменение пути через диагностический ноутбук «в обход» firewall часто создает ложное ощущение, что «с ноутбука работает, со SCADA нет». Фиксируйте маршрут и правила для реального IP клиента SCADA, а не для администратора.

Обновление шлюза, ПЛК и несколько endpoint

На объекте OPC UA часто стоит не «напрямую в контроллер», а на промышленном шлюзе, встроенном сервере HMI или в ПО на IPC рядом с линией. Обновление любого звена меняет цепочку. Типичный сценарий: прошивку ПЛК обновили, сертификат на контроллере остался прежним, а шлюз перевыпустил свой сертификат при установке патча. Клиент SCADA подключен к шлюзу, а инженер проверяет сертификат на ПЛК и не находит проблему.

Зафиксируйте топологию: кто для клиента является OPC UA Server, где проходит граница доверия, есть ли промежуточный aggregation server. При диагностике проверяйте endpoint на том узле, к которому реально подключается клиент. Если используется проброс через reverse connect или discovery server, после обновления мог измениться URL в конфигурации клиента, хотя IP остался тем же.

Несколько endpoint на одном хосте с разными policy - норма. Клиент мог быть настроен на «удобный» endpoint с Sign, а после обновления остался только SignAndEncrypt. В списке endpoints это видно сразу; в сохраненном проекте клиента - только если открыть свойства подключения, а не нажимать Connect с прошлым ярлыком.

Ротация сертификатов без ночного простоя

Плановая смена сертификата должна идти по регламенту, а не в ответ на внезапный отказ в понедельник утром. За 30 дней до истечения срока выпустите новый сертификат, добавьте его в trust store клиентов параллельно со старым, переключите сервер на новый, убедитесь в работе всех клиентов, затем удалите старый из доверенных. На производстве с одним клиентом это делается в окно планового ТО; с пятью клиентами - таблица «кто обновлен» обязательна.

Если внутренний УЦ перевыпускает корневой сертификат, цепочка ломается у всех приложений сразу. Такие события редки, но именно они совпадают с «после обновления» в широком смысле. Храните экспорт корневого УЦ в паспорте связей и проверяйте цепочку не только leaf-сертификата сервера.

Промежуточные прокси TLS, если они появились при модернизации ИБ, могут терминировать шифрование и подменять сертификат. OPC UA клиент в этом случае видит сертификат прокси, а не ПЛК. После включения инспекции трафика на корпоративном firewall симптом тот же: «вчера работало». Согласуйте с ИБ режим passthrough для промышленного VLAN или явно доверьте сертификат прокси на всех SCADA-станциях.

Паспорт связи OPC UA на объекте

Чтобы не восстанавливать цепочку из памяти, ведите одностраничный паспорт на каждую пару клиент-сервер: Application URI сервера, URL endpoint, SecurityPolicy, MessageSecurityMode, тип аутентификации, дата окончания сертификата, thumbprint, ответственный за обновление, дата последней успешной проверки Browse. При любом обновлении прошивки или ПО пункт «проверка OPC UA» входит в чек-лист завершения работ, рядом с «проверка Modbus» и «проверка аварий».

На стенде FAT имеет смысл один раз намеренно перевыпустить сертификат и пройти процедуру восстановления доверия по инструкции, написанной для дежурной смены. Если инструкция держится только в голове интегратора, объект уязвим к отпуску и болезни.

Таблица: ошибка клиента, причина, проверка

Ошибка или симптом клиента Вероятная причина Что проверить
BadCertificateUntrusted Новый или просроченный сертификат сервера, нет записи в trust store Срок Not After, thumbprint, папка rejected, принятие сертификата на клиенте
BadSecurityChecksFailed Несовпадение policy, режима или поврежденный сертификат Список endpoints, SecurityPolicy, MessageSecurityMode на обеих сторонах
BadUserAccessDenied Неверный пароль, роль, блокировка пользователя Учетная запись интеграции, лог ActivateSession, политика паролей
EndpointUrl mismatch Изменился IP, имя хоста или порт после обновления Строка подключения, SAN в сертификате, DNS и hosts
Таймаут на CreateSession Firewall, неверный порт, сервер не запущен TCP-доступность порта, служба OPC UA, trace сети
BadCertificateHostNameInvalid Сертификат выдан на другое имя CN/SAN, способ подключения по IP вместо имени
Соединение есть, Browse пустой Неверный namespace или права пользователя Индекс namespace, роли на узлах, сравнение с эталонным клиентом
Работает с одного клиента, не с другого Trust store обновлен только на одной станции Сравнить отпечатки и policy на обеих машинах
После обновления ПЛК отвалилось всё Сброс trust store на сервере, новый Application URI Сертификаты на сервере, список доверенных клиентских cert
Периодический обрыв раз в сутки Автообновление сертификата или смена суточного задания Планировщик, журнал УЦ, корреляция по времени

Пошаговая диагностика на объекте

Начните с журнала клиента и сервера в одну метку времени. Запишите точный код ошибки OPC UA, не переводя его на бытовой язык. Затем откройте список endpoints и убедитесь, что выбранный URL совпадает с тем, что реально слушает сервер.

Дальше цепочка сертификатов: срок, отпечаток, соответствие имени. Если доверие оформлено, но ошибка сохраняется, сравните policy построчно. Только после этого меняйте пароль или копируйте trust store с рабочей станции - и то по регламенту, с фиксацией в журнале изменений.

В тестовой среде допустимо временно подключиться с более слабой policy или режимом None, чтобы подтвердить, что проблема именно в слое безопасности, а не в адресации тегов. На работающем производстве ослабление policy без согласования недопустимо: используйте дублирующий контроллер или стенд.

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

Частые вопросы

Можно ли просто отключить сертификаты и жить с None?
На тестовом стенде - для локализации. На производстве это редко проходит ИБ и часто запрещено внутренним стандартом. Решение должно быть временным и задокументированным.

Почему после «принятия» сертификата связь все равно падает?
Принят сертификат сервера, но не настроен клиентский cert при взаимной аутентификации, или не совпадает policy. Проверьте вторую половину handshake.

Нужно ли перевыпускать сертификат при смене IP?
Если в сертификате жестко прописано имя, а подключаются по IP, проверка имени может не пройти. Либо подключение по имени из SAN, либо новый сертификат по процедуре УЦ.

Как не повторить ситуацию при следующем обновлении?
Включите напоминание о сроке сертификата, храните параллельно старый и новый thumbprint в паспорте связей, пропишите в чек-листе обновления шаг синхронизации trust store на всех клиентах.

Ссылки по теме

Обсуждение