Цифровая подпись с openssl

Я пытаюсь подписать и проверить подпись с помощью пары ключей RSA.

Вот как я генерирую пару ключей (которая отлично работает для шифрования / дешифрования):

ssh-keygen -t rsa -f mykey -N '' -b 2048
mv mykey mykey-priv.pem
ssh-keygen -f mykey.pub -e -m pem > mykey-pub.pem ; rm -f mykey.pub

Однако, когда я пытаюсь зашифровать хэш (используя закрытый ключ), а затем проверять его (используя открытый ключ), он не работает:

openssl dgst -sha256 /etc/hosts > /tmp/hash 
openssl rsautl -sign -inkey mykey-priv.pem -in /tmp/hash -out /tmp/signature
openssl rsautl -verify -pubin -inkey mykey-pub.pem -in /tmp/signature

Последняя строка дает мне невозможность загрузить открытый ключ

Что мне не хватает?

Если это актуально, я использую CentOS 3.9 (старый и устаревший, но у меня нет выбора здесь).

Наконец, вот пример пары ключей:

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA8nVhTRuinf4bGAda1ufF+VGG6f8kIFGt8/oCK74n9E6lXgpu
7KqeRzadaiONDh8GgQXn5bX9O2vOL+sL0xYa3W13eCoT7+4U51C/+8HqBxujRAVm
i4r/Ju+52kober+GSuIfoNF2nMA24EDy9tid0JgHcBJ0NTyhv6sPvNfcFR1Flbpo
LixTGCcn5S9A9NzJXiOkZ6abnxmyEmZsEaboowMay027GLWAw186GODbrGBByhjq
W6W6jcijb7EFdIYCEqtC6RsZmAiuPBK0LfW5078GE05oIZrG8GtQR8f7k8HDpEDF
+ZI53CZiLhrcXq6+tS4U57FqQs8ytUf6Gno7JwIDAQABAoIBAQCn7zd64gZLqmJ3
zThVG+obGyX4U3lhTVHQaD0ysR4ZcJPHxDA6ip7gsmprxr3/puupWD7b86a3jp8c
v4/MIEZxUk3qlDKFAAHIijy/kvuW+sSl65uwUZETFf5DvQq1hYzttxuzFwIx5kzc
HQBsi3MbtQGJ1a5Z5WofSMu4wEa289tAjHQiaXs8WEbgOctwS11lhFbDLwLagBFz
FL+J0C0oGjgNYaLJUihZKsMHCPZ0/LVFDcCus0ep7mQmvAEQ3FhSNNVakUL07XmM
MC6PTUxUvQa8vGDlRnXwGlIWVFNevvudvZjs02J7KWc3hUH9DqXiEm7cClJfoISB
HIq4WFvpAoGBAP0UHfCRyv4/2nZmizX05NG/qMNuz97G6Rir2ltw9wmrpvqK/n4r
d1JX19ECCx2nQM04C4Q7jQMmyqpF21Wf903PrGXPBa8j5XIDJy+YPC2RrifGsaHm
wN1EmYVfYZCphwmTIO2D05n/4Zkgze/KmhMnqpWn27De+LLfgcxsbET7AoGBAPVB
4RvpQCfKdP+ieKRopDE0v+UkdQCogdUz0rhwAdwzhXmUZIJ/Xb4a15DIN+zxKz2h
aiIJFkifKw5bQQQQjiIuRN73YpjQ6D9jWTdEs3E1zaWYFNPNAYqSi/1g/udgLL0N
RAOw5aNCDyOV4OZRESa9rhUUngfK4VrbqWIm1pLFAoGBAOBGWZn9uaTDNXjDuw6f
7b+rV4WJyBEmuR8x/JoYa/RX9+wEDTAGmQGR8yG3693lgFndFueiVn66e9OVgKBK
2MBOD/tRETp6VzVIcguNn5bKiUmanYRamAP+bQZy1mV6tr7XcdDKiFTrHCO1nIqq
QwxClLt3PAtsLX1m8QIV+4TNAoGBAMA161hWi2Mj9mHKUUZ4hAXUU3ggBFqJtYcD
4GeP0MVk03yfYc4sR6mPm9XqNHpL4BmjAWy/Nmmf5LyRo/itiNcc7/jWZL1jLEFR
eUApZYCaLBtVfy0nA8g4ZeIkPGHVK/rWBLHn13EFepvnAKVAb3KvQVlgGSH+THNK
qAs2aQAJAoGAabSXLpXsZTdy1lMUtZlvUhH4tLVgHFJGILMQ3bh2TTMnkaVbPFyy
KDeK+QJGaqjTx1SIXYgANR5cYI1xNge6aVA6T2aY2Dlq3qpAOK3sJWhEZYDxJKeq
Oy97h96/n14jdfh1U4TValcZfgVXqAfBMjxx0fPtSQjIn2RVjZRBpFs=
-----END RSA PRIVATE KEY-----


-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA8nVhTRuinf4bGAda1ufF+VGG6f8kIFGt8/oCK74n9E6lXgpu7Kqe
RzadaiONDh8GgQXn5bX9O2vOL+sL0xYa3W13eCoT7+4U51C/+8HqBxujRAVmi4r/
Ju+52kober+GSuIfoNF2nMA24EDy9tid0JgHcBJ0NTyhv6sPvNfcFR1FlbpoLixT
GCcn5S9A9NzJXiOkZ6abnxmyEmZsEaboowMay027GLWAw186GODbrGBByhjqW6W6
jcijb7EFdIYCEqtC6RsZmAiuPBK0LfW5078GE05oIZrG8GtQR8f7k8HDpEDF+ZI5
3CZiLhrcXq6+tS4U57FqQs8ytUf6Gno7JwIDAQAB
-----END RSA PUBLIC KEY-----
1
задан 20 May 2016 в 04:16
1 ответ

Кроме того: ssh-keygen -m только в относительно последних версиях OpenSSH, гораздо более свежих, чем я ожидал от CentOS 3.9. Вы использовали какой-то сторонний репозиторий или строили его сами или что-то в этом роде? В любом случае ...

То, что OpenSSH называет «PEM», не является тем типом PEM, который здесь используется OpenSSL.

Справочная информация: Библиотека OpenSSL уже давно поддерживает два типа структур открытого ключа, как в PEM, так и в DER форматы:

  • «устаревшая» структура, специфичная для каждого поддерживаемого алгоритма, с заголовками PEM, такими как
    ----- BEGIN RSA PUBLIC KEY -----
    ----- BEGIN DSA PUBLIC KEY- ----
    ----- BEGIN EC PUBLIC KEY -----
    реализуется подпрограммами PEM_ {запись, чтение} {RSA, DSA, EC} PublicKey

  • одна общая структура определено X.509 с именем SubjectPublicKeyInfo с заголовком PEM
    ----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ ----- !! обратите внимание на отсутствие названия алгоритма
    реализуется подпрограммами PEM_ {write, read} {, RSA, DSA, EC} PUBKEY

Однако в командной строке OpenSSL почти полностью используется последняя, ​​в том числе для rsautl -pubin . Вы можете видеть, что у вас есть первое. Почему?

OpenSSH , когда он недавно добавил параметр формата -m в экспорт ssh-keygen -e , необъяснимо назвал устаревшие структуры OpenSSL PEM , но общая структура OpenSSL X.509 PKCS8 - хотя это совсем не PKCS # 8, который является стандартным и распространенным форматом для закрытых ключей.

Итак ваши варианты:

  • использовать неверно выглядящую, но на самом деле верную опцию формата ssh-keygen -e -m pkcs8

  • преобразовать файл, который у вас есть, используя единственную операцию, которая выполняет устаревшую структура:
    openssl rsa -in sshpub_called_pem -RSAPublicKey_in -out goodpub -pubout
    , но только в OpenSSL 1.0.0 и выше.

  • если ваш файл закрытого ключа OpenSSH находится в формате, совместимом с OpenSSL ( - --- BEGIN RSA PRIVATE KEY ----- not ----- BEGIN OPENSSH PRIVATE KEY ----- , который также является недавним дополнением к OpenSSH) вы можете использовать OpenSSL вместо [1216 6] ssh-keygen -e :
    openssl rsa -in sshprivate -pubout -out pubforopenssl
    или в версии 1.0.0 и выше, блестящая новая альтернатива openssl pkey -in sshprivate -pubout -out pubforopenssl

ТАКЖЕ ВНИМАНИЕ! : rsautl -sign | -verify (по умолчанию) использует PKCS # 1-v1.5 (также известный как тип 01)заполнение, но НЕ подчиняется стандарту , который требует, чтобы вы также кодировали хэш в ASN.1 SEQUENCE . Подписи, созданные таким образом, НЕ будут проверяться в другом программном обеспечении, которое подчиняется стандарту, а подписи, созданные в другом программном обеспечении, дадут другие (хотя ЧАСТИЧНО совпадающие) результаты. Вместо этого рассмотрите возможность использования

 openssl {dgst -hashname | hashname} {-sign privatekey | -verify publickey}

, который выполняет полную операцию: хэширование данных, кодирование ASN.1, заполнение и знак RSA или, наоборот, проверку RSA, распаковку, декодирование и сопоставление; или

 openssl pkeyutl -sign|-verify -inkey key [-pubin] -pkeyopt digest:hashname

, где ключ является ключом RSA, который выполняет все PKCS # 1-v1.5 , кроме хеширования данных. Например:
https://stackoverflow.com/questions/9380856/openssl-signature-difference-when-using-c-routines-and-openssl-dgst-rsautl-
https://stackoverflow.com/ questions / 13419201 / why-are-the-rsa-sha256-signatures-i-generate-with-openssl-and-java-different
https://stackoverflow.com/questions/9951559/difference-between-openssl- rsautl-and-dgst
https://crypto.stackexchange.com/questions/27079/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign
https: //crypto.stackexchange.com/questions/27892/verify-a-rsa-signature-using-only-rsa-encryption

5
ответ дан 3 December 2019 в 17:04

Теги

Похожие вопросы