То же имя файла ca.crt, другой сертификат: что сравнивать
Два профиля могут поставляться с ca.crt разного содержания. Снимите отпечаток того, что загружает процесс, и затем проверьте, что это нужный вам якорь доверия.
Два профиля оба поставляют файл с именем ca.crt, один туннель поднимается, а другой завершается ошибкой цепочки. Открытие двух файлов рядом редко это решает, а отключение проверки решает это в неверном направлении. Вопрос, который ошибка на самом деле задаёт, уже: какой сертификат каждый процесс загружает как свой якорь доверия и являются ли эти два одним и тем же объектом? Ответьте на это сначала, и остальная диагностика получит направление. Имя файла — это этикетка упаковки, а путь, записанный в профиле, тоже не является авторитетным, поэтому всё зависит от того, что процесс действительно читает.
Найдите сертификат, который клиент действительно загружает
OpenVPN принимает центр сертификации в двух формах, и форма определяет, какие байты важны. Профиль может указывать на внешний файл через ca или встраивать сертификат в блок <ca> в самом профиле. Когда есть оба, побеждает встроенный блок, и файл рядом с профилем никогда не открывается.
Прочитайте сбойный профиль и выясните, какую форму он использует, прежде чем что-либо сравнивать. Копия, взятая из соседнего каталога или из пакета, откуда пришёл другой профиль, ничего не говорит о том, чему доверяет этот процесс. То же относится к пути в конфигурации: он разрешается относительно места запуска клиента, а это не всегда тот каталог, на который вы смотрите. Читайте профиль, а не папку.
Сертификаты идентифицируются по содержимому: открытый ключ, субъект и издатель, период действия и подпись над всем этим. Два файла с одинаковыми байтами — это один и тот же сертификат, как бы их ни называли, а два файла с одинаковым именем могут быть несвязанными центрами. Имя — это этикетка упаковки, а не идентичность.
Снимите отпечаток обеих копий с помощью openssl
Отпечаток — это хеш поверх DER-кодировки сертификата, формы, которую покрывает подпись, поэтому окончания строк и текст заголовка не могут на него повлиять. Вычислите его для каждого файла, и у вас будет две шестнадцатеричные строки, разделённые двоеточиями, которые либо совпадают, либо нет. Чтобы ответить на вопрос сравнения, в сертификате не нужно читать ничего другого.
openssl x509 -in /etc/openvpn/office/ca.crt -noout -fingerprint -sha256
openssl x509 -in ~/profiles/lab-ca.pem -noout -fingerprint -sha256
Заманчиво направить openssl на сам профиль, но он читает первый блок сертификата, который встречается в файле, а профиль обычно содержит <cert> перед <ca>. Извлеките блок центра, затем снимите отпечаток извлечённого файла, потому что именно эту копию клиент действительно будет использовать.
sed -n '/^<ca>$/,/^<\/ca>$/p' office.ovpn | sed '1d;$d' > /tmp/office-ca.pem
openssl x509 -in /tmp/office-ca.pem -noout -fingerprint -sha256
Одинаковые отпечатки означают, что материал доверия один и тот же, а у ошибки цепочки есть другая причина, и это другое расследование. Разные отпечатки означают разные сертификаты, и именно там начинается следующий раздел.
Прочитайте несовпадение, прежде чем предполагать атаку
Разные отпечатки означают разные сертификаты и ничего больше. Перевыпуск, ротация, переименованный центр или устаревший набор — все они дают разные файлы с полностью законными историями. Какой из них относится к развёртыванию — вопрос к оператору или к записи развёртывания, а не ко времени изменения файла. Архивы копируют метки времени, поэтому более новый файл не является автоматически правильным якорем.
Корень, который подписывает сам себя, — это нормально, поэтому находка такого не является доказательством проблемы. Задача проверяющего — построить путь от сертификата сервера до выданного ему якоря, и ошибка цепочки обычно означает, что этот путь не удалось завершить.
Проверьте, является ли якорь сбойного профиля центром, из которого развёртывание всё ещё выпускает сертификаты. Если отпечаток не совпадает ни с чем в записи развёртывания, профиль просто устарел, и никакая настройка на стороне клиента это не исправит.
Восстановите доверие, не отключая проверку
Краткосрочное решение — отключить проверку или добавить каждый сертификат цепочки как якорь. И то и другое заставляет сообщение исчезнуть, и то и другое меняет, какие серверы клиент будет принимать с этого момента. Включите проверку обратно, установите нужный якорь и повторите тест.
Если цепочка теперь строится, но появляется другая ошибка, это прогресс: проверка имени, даты действия и отзыв — это отдельные проверки с отдельными сообщениями. Держите пару отпечатков и исходный текст ошибки вместе в заявке, чтобы следующий человек видел, какой якорь был загружен и какой ожидался. Пара отпечатков достаточно мала, чтобы вставить её в записку о передаче, и следующий случай тогда занимает пять минут вместо половины дня.
Получите правильный центр по тому же аутентифицированному каналу, который доставил профиль. Скачивание сертификата с сервера потому, что его субъект кажется знакомым, — это другое действие, и оно тихо расширяет то, чему клиент будет доверять.