Вопрос или проблема
Я пытаюсь импортировать пару ключей RSA на более старую версию Cisco IOS (16.6.4). Эта старая версия, кажется, принимает только закрытые ключи, закодированные в формате PEM, которые зашифрованы с помощью DES или 3DES. По крайней мере, эти шифры – единственные варианты при экспортировании пары ключей, сгенерированной на IOS:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AD1E5D9E9F639C34
5Mjt+X9hZ6UCEi12axx6YTf4tvrf4xs61+90/YaGAZPPcL+Tyk2AKtq8jY5kzQxf
...
8K0+Fl8xKFtTdnaiyuN1jKgBg7WcwkmlBAmh3UxrmQ5awuuZUETuiA==
-----END RSA PRIVATE KEY-----
Это зашифрованный файл PKCS#1 в формате PEM.
Я хочу импортировать сгенерированную пару ключей с моего Linux-компьютера. Я понимаю, что мне нужен файл, чтобы он выглядел, как экспорт, показанный выше, зашифрованный с помощью DES или 3DES. Вот моя неудачная попытка.
Сначала я генерирую незашифрованную пару RSA ключей с использованием OpenSSL 3.4.0:
$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:1024 \
-out key.pem -outpubkey pub.pem
$ cat key.pem
-----BEGIN PRIVATE KEY-----
MIICdAIBADANBgkqhkiG9w0BAQEFAASCAl4wggJaAgEAAoGBAOC7vNjQatCODHKq
...
ImgXjyNR9xs=
-----END PRIVATE KEY-----
Похоже, что это PKCS#8-кодированный закрытый ключ (BEGIN PRIVATE KEY
в отличие от BEGIN RSA PRIVATE KEY
; также openssl asn1parse
показывает структуру, которая идентифицирует это как rsaEncryption
и затем двоичный блоб, вместо простого дампа материалов закрытого ключа).
Я читал, что ssh-keygen
может конвертировать PKCS#8 в PKCS#1 и зашифровывать его.
Моя версия OpenSSH (9.9p1) показывает в ssh-keygen(1)
:
-Z шифр
Указывает шифр, который использовать для шифрования при записи файла закрытого ключа в формате OpenSSH. Список доступных шифров может
быть получен с помощью “ssh -Q cipher”. По умолчанию “aes256-ctr”.
Так что я перечисляю все шифры, известные SSH:
$ssh -Q cipher
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
[email protected]
Тогда я пытаюсь:
$ ssh-keygen -Z 3des-cbc -f key.pem -m pem -p -N foobarbaz
Ваш идентификатор был сохранен с новым паролем.
Однако:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,40F4524E862B346BC384C20AEEC89C1C
VhjXes5OMDEfIkSiGWI89v2jZlxiPJ3KpBfhI0fr3d1ffVXvATK6F3K86SFfvikY
...
7K6eCoJ1+LE/e71Nrsm/SW3qcPJIEP3I8+DtwGerw5TYIH2wnFv/J6X6zfnLJjDn
-----END RSA PRIVATE KEY-----
Он говорит, что зашифровал его с помощью AES-128-CBC, несмотря на указание использовать
3des-cbc
(и несмотря на то, что в руководстве сказано, что aes-256-ctr
– это
значение по умолчанию). Какой бы доступный шифр я не ввёл из ssh -Q cipher
, он всегда
создает файл с AES-128-CBC.
Где я ошибаюсь или что я упускаю из виду?
Изменение
Читая внимательнее, я только что заметил, что в руководстве сказано
Указывает шифр, который использовать для шифрования при записи файла закрытого ключа в формате
OpenSSH.
И действительно:
$ ssh-keygen -Z 3des-cbc -p -N foobarbaz -f priv.key
$ tail -n +2 priv.key | head -n -1 | base64 -d | xxd -l 32
00000000: 6f70 656e 7373 682d 6b65 792d 7631 0000 openssh-key-v1..
00000010: 0000 0833 6465 732d 6362 6300 0000 0662 ...3des-cbc....b
Таким образом, он использует AES-128-CBC при конвертации в PEM, но учитывает параметр -Z
при использовании собственного формата.
Новый Вопрос
Тогда вопрос заключается в следующем: какой инструмент я могу использовать, чтобы зашифровать мой закрытый ключ RSA с помощью 3DES?
Используйте openssl pkey -traditional
, чтобы он создавал файл в формате PKCS#1/PEM. Добавьте опцию для выбранного шифра (если его вообще нужно зашифровывать – Cisco IOS его все равно расшифрует при импорте).
openssl pkey -in foo.key -out foo_pk1.key -traditional -des3
Основная причина, по которой ssh-keygen использует PKCS#1 в качестве традиционного формата ключа (до того, как OpenSSH внедрил свой собственный формат) заключается в том, что он использует libcrypto OpenSSL, и это просто формат, для которого у OpenSSL уже есть встроенные функции для загрузки/сохранения; поэтому инструменты OpenSSL являются основным выбором.
Альтернативно, PuTTY’s puttygen
поддерживает вывод в различных форматах, и то, что он в настоящее время называет “private-openssh”, также является традиционным PEM/PKCS#1 с шифрованием 3DES:
puttygen foo.key -o foo_pk1.key -O private-openssh
Ответ или решение
Для решения проблемы, связанной с импортом ключевой пары RSA на устаревшую версию Cisco IOS (16.6.4), требуется глубокое понимание форматов ключей и методов шифрования. Рассмотрим различные подходы к конвертации PKCS#8 в PKCS#1, используя шифрование 3DES, которое поддерживается данной версией Cisco IOS. Исходя из описания проблемы, ssh-keygen хоть и поддерживает различные методы шифрования, но по умолчанию использует AES-128-CBC при конвертации в PEM-формат, что не является совместимым с требованиями Cisco IOS. Это требует использования альтернативных инструментов, таких как OpenSSL или PuTTY’s puttygen.
Теория
Формат PKCS#1 используется для хранения RSA-параметров и является традиционным стандартом для хранения приватных RSA-ключей в PEM-формате. PKCS#8, с другой стороны, является более современным форматом, который может включать как закрытые, так и открытые ключи, а также поддерживает шифрование с использованием различных алгоритмов. Для настройки шифрования и совместимости с устаревшими системами, такими как Cisco IOS 16.6.4, которые поддерживают только DES или 3DES, необходимо конвертировать ключ в формат PKCS#1 с заданным шифрованием.
Пример
Для конвертации и шифрования ключа с использованием OpenSSL используйте следующее руководство. Если оригинальный ключ сформирован в PKCS#8, его первым делом необходимо конвертировать в PKCS#1:
-
Генерация нешифрованного ключа в PKCS#8:
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:1024 -out key.pem
-
Конвертация в формат PKCS#1 и шифрование с использованием 3DES:
openssl pkey -in key.pem -out key_pkcs1.pem -traditional -des3
Применение
Ваше основное требование заключается в обеспечении совместимости с Cisco IOS 16.6.4, который принимает только закрытые ключи в PKCS#1 формате, зашифрованные DES или 3DES. Вышеупомянутый метод с использованием OpenSSL позволяет выполнить это требование путём использования ключевой опции -traditional
, которая производит файл в формате PKCS#1, и -des3
, которая отвечает за шифрование 3DES.
В качестве альтернативы, вы можете использовать PuTTY’s puttygen, который также поддерживает данный формат шифрования:
- Использование PuTTY’s puttygen:
puttygen key.pem -o key_pkcs1.pem -O private-openssh
Это создаст закрытый ключ в формате PKCS#1, зашифрованный с помощью 3DES, который может быть импортирован в Cisco IOS.
Заключение
Использование инструмента OpenSSL является наиболее универсальным и стабильным способом для конвертации ключей между различными форматами с требуемым шифрованием. Несмотря на существование различных библиотек и инструментов, OpenSSL остаётся основным выбором для многих профессионалов в сфере безопасности и IT благодаря своей открытой архитектуре и поддержке многочисленных алгоритмов шифрования. Ваша задача станет проще, если организовать последовательный процесс конвертации и шифрования, как описано в данном руководстве. Таким образом, ключ будет успешно импортирован в Cisco IOS, обеспечивая одновременно защиту данных и функциональность системы.