Як створити ключ openSSL за допомогою парольної фрази з командного рядка?


107

По-перше - що станеться, якщо я не даю фразу? Чи використовується якась псевдо випадкова фраза? Я просто шукаю щось "досить добре", щоб утримати випадкових хакерів.

По-друге - як мені створити пару ключів з командного рядка, подаючи парольну фразу в командному рядку?


Нарешті я змусив його працювати за допомогою цих команд, використовуючи exec (), який, як правило, вважається небезпечним у використанні, краще подати PassPhrase у файл. Я можу прийняти цей ризик, оскільки я впевнений, що PHP буде коли-небудь виконуватися на моєму ПК (який запускає windows і не має команди PS).

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 2048
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

Багато хто дякує @caf, без якого це було б неможливо.

Лише одне шкодую - що, скільки б я не Google, ніхто, здається, не може openssl_pkey_new()працювати з Xampp в Windows (це правильний спосіб генерувати ключові пари)


4
чому openssl_pkey_new()... правильний спосіб генерування пари ключів?
Джейк Бергер

Windows (як правило) не має, psале оскільки Vista маєwmic process get commandline
dave_thompson_085

Відповіді:


210

Якщо ви не використовуєте парольну фразу, то приватний ключ не зашифрований жодним симетричним шифром - він виводиться повністю незахищеним.

Ви можете створити ключ, подавши пароль у командному рядку, використовуючи виклик типу (у цьому випадку пароль є foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Однак зауважте, що ця парольна фраза може бути схоплена будь-яким іншим процесом, що працює на машині в той час, оскільки аргументи командного рядка, як правило, видно для всіх процесів.

Кращою альтернативою є написання парольної фрази у тимчасовий файл, захищений дозволами файлів, і вказати, що:

openssl genrsa -aes128 -passout file:passphrase.txt 3072

Або введіть пароль на стандартному вході:

openssl genrsa -aes128 -passout stdin 3072

Ви також можете використовувати названу трубку з file:опцією або дескриптор файлу.


Щоб потім отримати відповідний відкритий ключ, потрібно використовувати openssl rsa, подаючи ту саму парольну фразу з -passinпараметром, який використовувався для шифрування приватного ключа:

openssl rsa -passin file:passphrase.txt -pubout

(Це очікує зашифрованого приватного ключа на стандартному вході. Ви можете замість цього прочитати його з файлу за допомогою -in <file>).


Приклад створення 3072-бітної пари приватних і відкритих ключів у файлах, при цьому пара приватних ключів зашифрована паролем foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

+1 Чудово, що працює! Дякую, якщо ти можеш просто допомогти маленькому підліткові, то отримаєш відповідь ... чому це не вийде? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg каже відновити Моніку

або, простіше кажучи - як відкрити ключ від вашої команди (який трохи відрізнявся від мого). Мені просто потрібна відповідна пара. Це лише "достатньо хороша" безпека.
Мауг каже, що повернемо Моніку

4
@Mawg: Ваша opensslкоманда виводить відкритий ключ, що відповідає наданому приватному ключу - відкриті ключі не шифруються (вони не є секретними), тому використовувати -passoutнемає сенсу. Ви, мабуть, хочете використати -passinтам, щоб на першому кроці поставити пароль, який використовувався для шифрування приватного ключа. Я також щось додав у відповідь.
caf

@caf, дякую за чудовий відгук (ще раз +1). Однак я, мабуть, занадто німий, щоб дозволити використовувати OpenSSL. Я хочу, щоб ключ у файлі і чомусь openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemцього не робив. Чи можете ви, будь ласка, дати мені дві команди - одна для створення приватного ключа у файл, а друга для створення відкритого ключа (також у файлі)? Вибачте за таку неприємність, але я пограв з цим, і просто не можу змусити його працювати :-(
Мауг каже, що повертаю Моніку

3
@Mawg: OpenSSL не сподобається, якщо -outпарам з'явиться після 2048- дійсно, це повинно бути останнє в командному рядку (я оновив свою відповідь як таку). Дивіться останній приклад, я думаю, що саме цього ви хочете. Що стосується AES-128, хтось , кому я довіряю у цих питаннях, рекомендує це над AES-256.
caf

9

genrsaбуло заміненоgenpkey & при запуску вручну в терміналі, він запропонує ввести пароль:

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096

Однак при запуску зі скрипту команда не запитуватиме пароль, щоб уникнути перегляду паролем у процесі використання функції у shell скрипті:

get_passwd() {
    local passwd=
    echo -ne "Enter passwd for private key: ? "; read -s passwd
    openssl genpkey -aes-256-cbc -pass pass:$passwd -algorithm RSA -out $PRIV_KEY -pkeyopt rsa_keygen_bits:$PRIV_KEYSIZE
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.