Отпечаток надёжен ровно настолько, насколько надёжен канал, который сообщил вам, чего ожидать. Если значение, с которым вы сравниваете, пришло по тому же соединению, которое вы проверяете, сравнение не доказывает ничего, кроме того, что сторона, контролирующая это соединение, последовательна. Проверка должна идти в фиксированном порядке, а неудачный шаг должен останавливать вас, а не подталкивать к следующему. Вот порядок, которым я пользуюсь, когда клиент VPN сообщает, что сертификат изменился.

Сначала назовите объект, потом значение

Решите, к чему относится ожидаемое значение: к листовому сертификату сервера, к издавшему его CA или к открытому ключу внутри листа. Это три разные проверки, и они проваливаются по-разному. Совпавший отпечаток CA не закрепляет сервер, а хеш открытого ключа намеренно переживает перевыпуск, сохраняющий тот же ключ.

Запишите и алгоритм. SHA-256 сейчас обычное ожидание, но старые инструменты печатали SHA-1, если не попросить иначе, а 40-символьное шестнадцатеричное значение — признак того, что вы собираетесь сравнивать две разные вещи.

Получите ожидаемое значение по второму каналу

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

Просите полное значение и алгоритм, никогда не префикс. Двоеточия и регистр букв не важны, но усечение превращает проверку на 256 бит в игру в угадайки.

Если никто не может предоставить ожидаемое значение из независимого источника, честный результат состоит в том, что этот сертификат сегодня проверить нельзя. Сказать это лучше, чем закрепить то, что только что показал клиент, — так предупреждение превращается в привычку.

Извлеките значение на своей стороне

Для файла сертификата команда такая: openssl x509 -in server.crt -noout -fingerprint -sha256. Явный дайджест важен: без него вывод зависит от вашей версии OpenSSL. Результат — шестнадцатеричная строка, разделённая двоеточиями, поэтому уберите двоеточия и приведите обе стороны к нижнему регистру перед сравнением.

Для конечной точки, которая говорит по TLS напрямую, подключитесь и выведите сертификат через конвейер: openssl s_client -connect vpn.example.com:443 -servername vpn.example.com < /dev/null | openssl x509 -noout -fingerprint -sha256. Это работает для веб-панели администрирования или TLS-слушателя, но не для OpenVPN, чей канал управления находится внутри туннеля. Для OpenVPN читайте сертификат из профиля на диске, вместо того чтобы пытаться перехватить его из сокета.

Сравнение должно быть механическим. Нормализуйте оба значения с помощью tr -d ':' и приведения к одному регистру, затем сравните всю строку. Сравнивать на глаз — это способ, которым совпадающий префикс скрывает расхождение в последнем байте. Если строки различаются, считайте различие реальным, прежде чем искать объяснение.

Условия остановки

Остановитесь, если объект другой, потому что отпечаток CA не может обелить листовой сертификат, а лист не может обелить CA. Остановитесь, если алгоритм другой, потому что значение SHA-1 против значения SHA-256 вам ничего не говорит. Остановитесь, если отпечаток совпадает, но сертификат просрочен, отозван или выпущен на другое имя; совпадающий хеш не является проверкой действительности и не чинит сломанную цепочку. Остановитесь и в том случае, если серийный номер не совпадает с серийным номером в записи, с которой вы сверяетесь, потому что это самый дешёвый способ заметить подменённый сертификат.

Остановитесь, если новое значение пришло по каналу, который вы проверяли. Ротация может законно изменить отпечаток, но значение замены всё равно должно приходить из доверенного процесса, а не из диалога предупреждения, который вызвал вопрос.

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

После сравнения

Запишите, что вы сравнили, откуда пришло ожидаемое значение и когда. Если сертификат перевыпустили, обновите сохранённое ожидание по тому же доверенному каналу и отметьте новый серийный номер, потому что именно серийный номер делает следующую ротацию проверяемой.

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

Похожие статьи