OpenSSL не может загрузить открытый ключ
Попытка зашифровать текстовое сообщение через командную строку на OSX Yosomite 10.10.2
Созданная публика .pem
ключ как это:
ssh-keygen -f ~/.ssh/id_rsa.pub -e -t PKCS8 > id_rsa.pem
Если я пытаюсь зашифровать myMessage.txt
openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt
я получил unable to load Public key
Если я тогда наберу:
openssl asn1parse -in id_rsa.pem
Возвращает: Error: offset too large
Но я понятия не имею, как это исправить. Что я должен изменить, чтобы это работало?
5 ответов
До сих пор не знаю, что пошло не так в моем вопросе, но нашел решение:
1) Создать ключ RSA:
$ openssl genrsa -out key.pem 1024
$ openssl rsa -in key.pem -text -noout
2) Сохраните открытый ключ в файле pub.pem:
$ openssl rsa -in key.pem -pubout -out pub.pem
$ openssl rsa -in pub.pem -pubin -text -noout
3) Зашифровать некоторые данные:
$ echo test test test > file.txt
$ openssl rsautl -encrypt -inkey pub.pem -pubin -in file.txt -out file.bin
4) Расшифровать зашифрованные данные:
$ openssl rsautl -decrypt -inkey key.pem -in file.bin
Отлично работает
Спасибо Мареку Марколе за предоставление информации http://openssl.6102.n7.nabble.com/Re-Can-I-use-my-own-keys-with-openssl-for-RSA-enc-dec-td12506.html
Я столкнулся с этой проблемой также и думаю, что хороший совет здесь:
Кажется, что команда шифрования OpenSSL хочет открытый ключ SSL вместо открытого ключа RSA.
Теперь мы знаем достаточно, чтобы настроить пример, чтобы он работал. Открытый ключ SSL может быть сгенерирован из открытого ключа RSA с
openssl rsa -in id_rsa.pem -RSAPublicKey_in -pubout > id_pub.pem
Затем можно выполнить этап шифрования с
openssl rsautl -encrypt -inkey id_pub.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt
Команда OpenSSL по умолчанию в MacOSX Yosemite на момент написания этой статьи выглядит как 0.9.8zg. Команда rsa в этой версии не поддерживает возможность запуска первой команды выше. Я работал над этим, установив OpenSSL 1.0.1p.
У меня была такая же проблема, когда я извлекал открытый ключ из сертификата.
openssl x509 -pubkey -noout -in cert.crt > pubKey.pem
После этого я хотел напечатать информацию о ключе с помощью команды ниже.
openssl rsa -text -pubin -in pubKey.pem
И получает ошибку: unable to load Public Key
Решение
Я открыл pubKey.pem в notepad++, и в меню " Кодирование" была выбрана LE BOM UCS-2. Поэтому я изменил его на кодировку UTF-8. Размер pubKey.pem после изменения кодировки составлял половину исходного. Тогда это работает как шарм.
Протестировано в Windows и powershell
Ваше первоначальное решение должно работать, у вас есть небольшая опечатка: чтобы указать формат ключа (PKCS8), используется параметр -m, а не параметр -t (он обозначает тип ключа: dsa, ecdsa, ed25519 или rsa). См. Справочную страницу ssh-keygen.
ssh-keygen -f ~ /.ssh / id_rsa.pub -e -m PKCS8> id_rsa.pem
Затем вы можете зашифровать, используя это:
openssl rsautl -encrypt -inkey ~ /.ssh / id_rsa.pem -pubin -in ~ / Desktop / myMessage.txt -out ~ / Desktop / encrypted.txt
И вы можете расшифровать, используя:
openssl rsautl -decrypt -inkey ~ /.ssh / id_rsa -in ~ / Desktop / encrypted.txt -out ~ / Desktop / decrypted.txt
Вы можете проверить разницу между исходными и расшифрованными файлами, используя текстовый редактор или эту команду diff:
diff ~ / Рабочий стол / myMessage.txt ~ / Рабочий стол / decrypted.txt
Фактически, команда openssl rsautl -encrypt ожидает открытый ключ с форматом кодировки "PEM PKCS8 public key", но ssh-keygen генерирует закрытый ключ в этом формате и открытый ключ в другом формате, адаптированном к файлу authorized_keys в~/.ssh
каталог (вы можете открывать ключи в текстовом редакторе, чтобы увидеть разницу между форматами).
Мне пришлось бороться с этой темой на OSX (Ventura)
- разрешения (неправильные разрешения, не удалось прочитать...)
- неправильный формат (PEM/PKCS8 вместо «типа SSH»)
я пришел с этим решением
# generate a PRIVATE KEY
openssl genpkey -algorithm RSA -aes-256-cbc -outform PEM -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# create a passphrase made of 4 chars minimum
# SUDO ! change permissions to 600 at most
sudo chmod 600 private_key.pem
# but 400 should work and is event more secure
sudo chmod 400 private_key.pem
# SUDO again
# extract THE PUBLIC KEY in PKCS8 file format
sudo ssh-keygen -e -f private_key.pem -m PKCS8 > public_key.pem
# enter your passphrase
передайте открытый ключ тому, кто хочет защитить файл data.in.txt. Чтобы зашифровать его, он или она сделает следующее:
# SUDO again
sudo openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in data.in.txt -out data.enc.txt
Вы получаете зашифрованный файл (data.enc.txt) для расшифровки:
# SUDO again
sudo openssl pkeyutl -decrypt -inkey private_key.pem -in data.enc.txt -out data.out.txt
# then you can read the confidential information
cat data.out.txt
вы можете сделать тот же метод, чтобы он/она извлекли свой открытый ключ, чтобы зашифровать ваш открытый ключ и защитить его перед отправкой.