Сгенерированный открытый ключ из закрытого ключа отличается в 2 случаях - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь сгенерировать пару секретный ключ и открытый ключ.Я хочу использовать закрытый ключ, чтобы подписать мой JWT и отправить открытый ключ третьему лицу для декодирования моего JWT.

На моем терминале Mac OS я сгенерировал свои ключи следующим образом:

ssh-keygen -m PEM -t rsa -b 2048

Теперь у меня есть pkey & pkey.pub как закрытый и открытый ключи соответственно.Теперь в моей консоли rails я попытался получить закрытый ключ, который работает следующим образом:

rsa_private = OpenSSL :: PKey :: RSA.new (File.read ("/ path / to /private / key / pkey "))

rsa_private.to_s
" ----- BEGIN RSA PRIVATE KEY ----- \ nCONTENTS_OF_PKEY_FILE \ n ----- END RSA PRIVATE KEY----- \ n "

Теперь в rails я могу получить открытый ключ из сгенерированного закрытого ключа, например:

pub_key = rsa_private.public_key

Но когда я пытаюсь распечатать его содержимое, оно отличается от того, что есть в pkey.pub, сгенерированном при запуске команды ssh-keygen.

pub_key выглядит примерно так:

"----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ ----- \ nSOME_CONTENT \ n ----- КОНЕЦ ПУБЛИЧНОГО КЛЮЧА ---- \ n "

Но мой файл pkey.pub выглядит иначе, примерно так:

ssh-rsa SOME_OTHER_CONTENT user@user.local

Итак, мой вопрос, как я могу получить 2 разных открытых ключа для одного и того же закрытого ключа?Какой из них я использую для декодирования моего JWT?

1 Ответ

0 голосов
/ 25 апреля 2019

Ключи должны быть одинаковыми, но кодироваться по-разному.

Пара ключей RSA состоит из нескольких чисел, секретный ключ - все эти данные, открытый ключ - тот же, с удаленной частной частью.

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

PEM-формат (формат с BEGIN PUBLIC KEY и данными Base64) более распространен для общих ключей, поэтому лучше его использовать.

Обновление: Формат PEM - это DER64 в кодировке base64 с верхним и нижним колонтитулами. DER, в свою очередь, является двоичным представлением ASN.1. Но SSH использует формат кодирования с использованием разных ключей (RFC4716)

Пример:

% ssh-keygen -m PEM -t rsa -N '' -b 1024 -f ./rsa

% cat rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDRNFYxsULk6x90T0EE8iS3skfJJ407ef3WJJClre0k2sLJUJX6/Xbc3ObxNjixXcgIXp2H4oVOnNpujqFF/XM81zlpLjGT/4igtK1FjIHIaFyRheGuwplgwCkXlxAe/oH1Bb4nFXlD/kORmGgSfSE9BpH+HQU3IzyU1i0X9K828Q== vasfed@Vasiliys-MacBook-Pro.local

% ssh-keygen -e -m PEM -f ./rsa.pub
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBANE0VjGxQuTrH3RPQQTyJLeyR8knjTt5/dYkkKWt7STawslQlfr9dtzc
5vE2OLFdyAhenYfihU6c2m6OoUX9czzXOWkuMZP/iKC0rUWMgchoXJGF4a7CmWDA
KReXEB7+gfUFvicVeUP+Q5GYaBJ9IT0Gkf4dBTcjPJTWLRf0rzbxAgMBAAE=
-----END RSA PUBLIC KEY-----

% ssh-keygen -e -m PKCS8 -f ./rsa.pub
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRNFYxsULk6x90T0EE8iS3skfJ
J407ef3WJJClre0k2sLJUJX6/Xbc3ObxNjixXcgIXp2H4oVOnNpujqFF/XM81zlp
LjGT/4igtK1FjIHIaFyRheGuwplgwCkXlxAe/oH1Bb4nFXlD/kORmGgSfSE9BpH+
HQU3IzyU1i0X9K828QIDAQAB
-----END PUBLIC KEY-----

Выше 3 разных кодировки одного и того же ключа, здесь ASN-декодированные версии последних двух (через https://lapo.it/asn1js):

PEM, минимальный минимум (модуль и показатель степени, без метаданных):

SEQUENCE (2 elem)
  INTEGER (1024 bit) 146908353891476107599563957703741990254320034409224509383359005248419…
  INTEGER 65537

PKCS8, здесь мы видим точно такие же числа, но на этот раз с некоторыми метаданными:

SEQUENCE (2 elem)
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.1.1 rsaEncryption (PKCS #1)
    NULL
  BIT STRING (1 elem)
    SEQUENCE (2 elem)
      INTEGER (1024 bit) 146908353891476107599563957703741990254320034409224509383359005248419…
      INTEGER 65537
...