Инструменты разработчика · SHA хеш-калькулятор
Сертификат и отпечатки пальцев SSH: как SHA-256 идентифицирует открытый ключ
· Фон
ша-256 криптография безопасность
Отпечаток пальца — это хэш сертификата или ключа, достаточно короткий, чтобы его можно было прочитать вслух. В этом посте объясняется, как вычисляются отпечатки пальцев TLS и SSH, почему отпечатки пальцев SHA-1 заменяются и что доказывает совпадение.
Подсказка ключа хоста, которую вы всегда принимаете — то, что строка SHA256: просит вас сравнить.
Когда вы впервые подключаетесь к серверу через SSH, вы видите запрос на принятие ключа хоста. В приглашении отображается отпечаток пальца: `SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8` или аналогичный. Этот отпечаток пальца представляет собой хэш открытого ключа сервера. Вас попросят внеполосно (вне протокола SSH) подтвердить, что вы узнали этот ключ. В приглашении также обычно отображается тип ключа (RSA, ED25519, ECDSA) и формат отпечатка пальца. Если вы раньше видели отпечаток этого ключа по доверенному каналу, вы можете уверенно набрать «да». В противном случае принятие означает доверие сети к доставке правильного ключа.
Отпечаток пальца — это просто результат работы криптографической хэш-функции, примененной к закодированному ключу. Для SSH ключ кодируется как двоичный объект (формат OpenSSH), и хеш вычисляется на основе этого объекта. Отпечаток пальца короче полного ключа, поэтому его можно читать и набирать. Один и тот же отпечаток всегда будет результатом одного и того же ключа, поэтому вы можете сравнить отпечаток, опубликованный в нескольких местах или каналах.
Отпечаток пальца соответствует хешу кодировки — сертификат DER или объект открытого ключа в качестве входных данных.
Ключи хоста SSH и сертификаты TLS кодируются по-разному, но принцип снятия отпечатков пальцев идентичен. Для SSH отпечаток пальца вычисляется на основе материала открытого ключа. Для сертификатов TLS отпечаток вычисляется на основе всего сертификата (включая эмитента, даты действия и другие поля). Когда вы подключаетесь к веб-серверу, браузер не отображает вам отпечаток сертификата, поскольку TLS использует другую модель доверия: браузер доверяет набору предустановленных центров сертификации (ЦС), и эти ЦС ручаются за сертификат. SSH не использует предустановленные центры сертификации; вместо этого вы доверяете определенным ключам и сохраняете их локально в `~/.ssh/known_hosts`.
Поскольку отпечаток включает в себя все байты сертификата для TLS, изменение дат действия без повторной подписи приводит к получению другого отпечатка. Для SSH отпечаток пальца представляет собой только открытый ключ, поэтому отпечаток пальца стабилен, пока ключ не изменяется.
Этот калькулятор демонстрирует длины SHA-1 и SHA-256; Рекомендации по политике отпечатков пальцев требуют источников протокола
Исторически отпечатки пальцев SSH отображались в шестнадцатеричном формате MD5. MD5 криптографически взломан, и коллизии практичны. Сообщество безопасности перешло на отпечатки пальцев SHA-256 по умолчанию. Вы по-прежнему можете видеть оба формата, отображаемые вашим клиентом SSH: `SHA256: base64` и `MD5: hex`. Отпечаток пальца SHA-256 — это тот, которому можно доверять при проверке личности. Если вы видите обе версии, сравните версию SHA-256 с отпечатком пальца из надежного источника (веб-сайт сервера, подписанное электронное письмо от администратора, внутренняя вики). Отпечаток MD5 менее надежен, поскольку существуют коллизии MD5.
Изменение формата отпечатков пальцев является видимым признаком криптографического перехода. Более старые версии OpenSSH отображали только MD5. В современных версиях по умолчанию отображается SHA-256. Команда `ssh-keygen -l -f /path/to/key` отображает отпечаток ключа в формате по умолчанию для вашей версии ssh-keygen; вы можете принудительно использовать определенный формат с помощью флага `-E` (например, `-E sha256` или `-E md5`).
SSH в base64 SHA256: format — изменение кодировки, из-за которого отпечатки пальцев стали короче шестнадцатеричных.
SSH отпечатки пальцев base64 используют вариант формата: перед ними ставится имя алгоритма и двоеточие, например, `SHA256:base64string`. Это отличается от формата целостности подресурса (SRI), который использует дефис и включает только стандартный формат Base64. Формат SSH включает метку, которая однозначно определяет, какой алгоритм создал дайджест. Когда вы видите отпечаток пальца в выводе SSH, алгоритм всегда отображается. Когда вы видите атрибут целостности SRI, алгоритм кодируется как префикс с дефисом.
Вывод base64 хеш-калькулятора ToolAcre SHA имеет стандартную форму; чтобы соответствовать отпечаткам SSH, добавьте к началу `SHA256: ` (имя алгоритма, двоеточие и пробел). Шестнадцатеричная форма калькулятора отличается от формы, отображаемой SSH, хотя она представляет тот же дайджест и в равной степени подходит для целей проверки.
Что доказывает совпадение: вы храните те же байты ключа, которые опубликовала другая сторона, и ничего о владельце ключа без внешней проверки.
Совпадение отпечатков пальцев доказывает две вещи: во-первых, вы храните те же байты ключа, которые опубликовала другая сторона, и, во-вторых, что ни ключ, ни отпечаток пальца не были изменены с момента вычисления дайджеста. Он не подтверждает личность владельца ключа и не разрешает какие-либо конкретные действия. Внеполосная проверка отпечатка пальца является необходимым, но недостаточным условием доверия к ключу. Вы также должны убедиться, что человек, опубликовавший отпечаток пальца, является тем, за кого себя выдает.
На практике, если администратор публикует отпечаток SSH сервера во внутренней сети компании или в подписанном электронном письме, вы можете убедиться, что он соответствует запросу, который вы получаете при подключении. Если отпечаток пальца не совпадает, вы можете с уверенностью отклонить соединение, поскольку кто-то перехватывает ваш трафик или изменился ключ сервера. Если отпечатки пальцев совпадают, вы знаете, что у вас правильный ключ. Принадлежит ли этот ключ нужному серверу — это отдельный вопрос, на который вы можете ответить, проверив канал публикации (выглядит ли страница интрасети законной? Действительно ли электронное письмо исходит от учетной записи этого администратора?).
Рабочий пример — проверка отпечатка пальца по отпечатку пальца, опубликованного через доверенный канал, шаг за шагом
Отпечаток сертификата служит той же цели: он уникально идентифицирует конкретный сертификат. Если сервер TLS меняет свой сертификат (например, во время продления), новый сертификат будет иметь другой отпечаток пальца. Закрепление сертификата — жесткое кодирование отпечатка пальца или небольшого набора приемлемых отпечатков пальцев в приложении — это метод обеспечения безопасности, позволяющий обнаружить изменения сертификата. Если сервер предоставляет сертификат с другим отпечатком пальца, приложение отклоняет его. Это защищает от скомпрометированного центра сертификации, выдающего поддельный сертификат, которому в противном случае браузер доверял бы.
Закрепление сертификата требует тщательного управления: если сервер обновит свой сертификат, а вы этого не ожидали, ваше приложение отклонит действительный новый сертификат. Вместо этого многие приложения используют закрепление открытого ключа, при котором закрепляется открытый ключ, а не весь сертификат. Это позволяет продлить сертификат без отклонения, если используется тот же ключ.
Рабочий пример: проверка с помощью инструментов, поддерживающих протокол, поскольку ToolAcre хеширует вставленный UTF-8 текст, а не DER или SSH байты связи.
Вычислить отпечаток пальца вручную для проверки несложно. Сохраните сертификат или ключ в файл, используйте `openssl dgst -sha256 filename` или `ssh-keygen -l -f filename -E sha256` для отображения отпечатка пальца и сравните его с тем, который показал вам сервер. Хэш-калькулятор ToolAcre SHA также может вычислить дайджест, если вы вставите ключевые байты, но помните, что калькулятор хэширует вставляемый вами текст UTF-8, а не двоичные файлы. Если ключ имеет формат PEM (текст с заголовком `-----BEGIN CERTIFICATE-----` и байтами в кодировке Base64), вы можете вставить его в калькулятор. Если он имеет формат DER (двоичный), вам необходимо сначала использовать инструменты командной строки или преобразовать его в PEM.
Граница важна: ToolAcre хэширует UTF-8 текст, который вы вставляете в интерфейс калькулятора. Он не читает файлы с вашего устройства (все вычисления происходят в браузере, на вашей вкладке, без сети). Если у вас есть файл ключа на диске, вы можете открыть его в текстовом редакторе, скопировать текст и вставить в калькулятор, если он в формате PEM. Или вы можете использовать инструменты командной строки, такие как `openssl`, `ssh-keygen` или `sha256sum`, для локального вычисления хеша.
Вывод: сравните отпечатки вне диапазона — хеш-калькулятор ToolAcre SHA показывает, как выглядят дайджесты SHA-1 и SHA-256 в зависимости от длины, которую используют отпечатки пальцев.
Хэш-калькулятор ToolAcre SHA отображает дайджесты SHA-1 и SHA-256 для любого ввода текста. Если вы вставите сертификат в формате PEM или открытый ключ SSH, калькулятор вычислит оба дайджеста. Для ключей SSH калькулятор хеширует вставленный вами текст; если вы вставите стандартный формат открытого ключа SSH в кодировке Base64, дайджест не будет соответствовать отпечатку SSH, поскольку SSH применяет собственное форматирование (формат провода) перед хешированием. Для прямого сопоставления вам нужен ключ в том же формате, который SSH использует внутри себя, и который не является общедоступным форматом отображения.
Для отпечатков сертификатов поведение аналогично: если вы вставите текст сертификата в кодировке PEM, калькулятор хэширует этот текст. Отпечаток сертификата вычисляется по закодированным байтам сертификата (формат DER), а не по текстовой оболочке PEM. Байты одинаковые, но кодировка текста отличается. Чтобы сопоставить отпечаток сертификата из OpenSSL или средства просмотра сертификатов браузера, вам необходимо предоставить байты DER, которые не читабельны для человека. Цель калькулятора — хэшировать текст UTF-8, который вы можете вставить и прочитать, делая границу четкой: он хеширует вводимый текст, а не файлы криптографических ключей в их стандартных двоичных формах или формах проводного протокола.