Где в файле ключа VPN живут n, e, d, p и q из RSA
n, e, d, p и q находятся внутри одной структуры, а не в именах файлов. Прочитайте ключ RSA для VPN с помощью OpenSSL и сопоставьте его с сертификатом, не печатая секреты.
Буквы в объяснении 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 остаётся отдельным от собственного сертификата и от каждого клиентского ключа. Запрос тоже не сертификат: он несёт запрошенные сведения и открытый ключ с подписью над запросом, что делает его входными данными регистрации, а не доказательством права.
| File | Answers | Does not prove |
|---|---|---|
| vpn-client.key | Possession of the private key | That the identity is enrolled |
| vpn-client.crt | A signed binding of public key to identity | That the client holds the matching key |
| vpn-client.csr | The requested binding and public key | That access was granted |
| dh2048.pem | Group parameters for key exchange | Any RSA component |
| crl.pem | Revocation status for certificates | Anything 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
После сравнения открытого ключа пройдите путь, который потребляет пару: поднимите туннель, убедитесь, что сертификат предъявляется и принимается, и проверьте, какую идентичность записал шлюз. Если ключ и сертификат совпадают, а аутентификация всё равно не проходит, неисправность в доверии, сопоставлении идентичности или политике доступа, а не в паре.
Для отката держите прежний ключ и сертификат в каталоге с датой и восстанавливайте оба вместе, никогда только один из двух. Ключ без сертификата и сертификат без ключа снаружи терпят неудачу одинаково, что делает наполовину восстановленные пары дорогими для распутывания в два часа ночи.