ssh-keygen 9.9p1 создал зашифрованный закрытый ключ RSA в формате PKCS#1 с ошибкой использования доступного шифрования 3DES – вместо этого используется aes-128-cbc

Вопрос или проблема

Я пытаюсь импортировать пару ключей 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:

  1. Генерация нешифрованного ключа в PKCS#8:

    openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:1024 -out key.pem
  2. Конвертация в формат 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, который также поддерживает данный формат шифрования:

  1. Использование PuTTY’s puttygen:
    puttygen key.pem -o key_pkcs1.pem -O private-openssh

Это создаст закрытый ключ в формате PKCS#1, зашифрованный с помощью 3DES, который может быть импортирован в Cisco IOS.

Заключение

Использование инструмента OpenSSL является наиболее универсальным и стабильным способом для конвертации ключей между различными форматами с требуемым шифрованием. Несмотря на существование различных библиотек и инструментов, OpenSSL остаётся основным выбором для многих профессионалов в сфере безопасности и IT благодаря своей открытой архитектуре и поддержке многочисленных алгоритмов шифрования. Ваша задача станет проще, если организовать последовательный процесс конвертации и шифрования, как описано в данном руководстве. Таким образом, ключ будет успешно импортирован в Cisco IOS, обеспечивая одновременно защиту данных и функциональность системы.

Оцените материал
Добавить комментарий

Капча загружается...