Буквы в объяснении RSA называют поля внутри одного объекта, а не файлы, которые выдаёт инструмент PKI. Файл закрытого ключа содержит структуру, первые поля которой открыты, а последующие не должны никогда покидать машину, завершающую туннель. Между этими двумя фактами лежит большинство практических вопросов о том, какой файл отвечает на какой вопрос. Это руководство сначала читает структуру, а затем команды, которые её проверяют, не выливая её.

Убедитесь, что ключ RSA, прежде чем искать простые числа

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

Эти три команды только для чтения отвечают на вопрос и записывают версию инструмента.

openssl version
openssl x509 -in vpn-client.crt -noout -text
openssl pkey -in vpn-client.key -noout -text

Версия важна, потому что имена параметров перемещались между основными выпусками. В выводе сертификата найдите строку алгоритма открытого ключа и размер ключа; в выводе ключа ключ RSA печатает модуль и открытую экспоненту. Ключ на эллиптической кривой печатает вместо этого именованную кривую, и никакой поиск не даст из него n или q.

Читайте структуру, а не base64

PEM — это base64, обёрнутый в строки заголовка, и его декодирование даёт DER, то есть сериализованную структуру, а не одно огромное целое число. Закрытые ключи RSA путешествуют в двух обычных контейнерах, PKCS#1 и PKCS#8, и оба сводятся к одному и тому же набору чисел.

В случае двух простых чисел закрытая структура несёт девять полей: версию, модуль n, открытую экспоненту e, закрытую экспоненту d, простые числа p и q, две экспоненты CRT и коэффициент CRT. RFC 8017 раздел A.1 определяет эти компоненты и раскладку ASN.1, а также допускает больше двух простых чисел, поэтому общий анализатор может печатать дополнительные записи простых чисел. Обратите внимание на порядок, потому что он объясняет частую ошибку: открытая половина хранится внутри закрытого файла, так что наличие открытого поля не делает этот файл безопасным для передачи. Всё после него — материал, который должен оставаться на хосте.

Кодирование добавляет слой, который легко спутать с содержимым. openssl asn1parse рисует структуру как дерево, чтобы порядок полей стал видимым, и он ничего не расшифровывает и не сообщает, пригоден ли ключ.

Сопоставьте сертификат с ключом, не печатая ключ

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

openssl pkey -in vpn-client.key -pubout -out /tmp/key.pub
openssl x509 -in vpn-client.crt -pubkey -noout > /tmp/cert.pub
cmp /tmp/key.pub /tmp/cert.pub && echo MATCH

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

Знайте, чем не являются соседние файлы

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

FileAnswersDoes not prove
vpn-client.keyPossession of the private keyThat the identity is enrolled
vpn-client.crtA signed binding of public key to identityThat the client holds the matching key
vpn-client.csrThe requested binding and public keyThat access was granted
dh2048.pemGroup parameters for key exchangeAny RSA component
crl.pemRevocation status for certificatesAnything about a private key

Две из этих записей путают с параметрами RSA достаточно часто, чтобы назвать их дважды. Файл параметров Diffie-Hellman содержит групповые параметры для установления ключа и ни одного простого числа RSA, хотя он тоже печатается как большое простое число. Список отзыва публикует статус сертификатов и не является местом, где мог бы спрятаться закрытый показатель.

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

Зафиксируйте сопоставление, затем проверьте рукопожатие

Прежде чем что-либо менять, сохраните вывод проверки с датой и версией OpenSSL. Тогда более позднюю ротацию можно сравнить с доказательствами, а не с памятью.

openssl verify -CAfile ca.crt vpn-client.crt
openssl x509 -in vpn-client.crt -noout -subject -issuer -dates

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

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

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