Как сгенерировать ключ 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, без которого это было бы невозможно.

Сожалею только об одном - что, сколько бы я ни гуглил, никто не может начать 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 требует восстановить Монику
или, другими словами - как к публичному ключу из вашей команды (которая немного отличалась от моей). Мне просто нужна подобранная пара. Это только «достаточно хорошая» безопасность.
Mawg говорит восстановить Монику
4
@Mawg: ваша opensslкоманда выводит открытый ключ, соответствующий предоставленному закрытому ключу - открытые ключи не зашифрованы (они не секретные), поэтому использование -passoutне имеет смысла. Вы, вероятно, захотите использовать -passinтам, чтобы указать кодовую фразу, которая использовалась для шифрования закрытого ключа на первом этапе. Я тоже кое-что добавил к ответу.
caf
@caf, спасибо за отличный отзыв (снова +1). Однако я, по-видимому, слишком туп, чтобы мне было разрешено использовать OpenSSL. Мне нужен ключ в файле, но по какой-то причине я openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemэтого не делаю. Не могли бы вы дать мне две команды - одну для генерации закрытого ключа в файл, а вторую - для генерации открытого ключа (также в файле)? Извините за такую ​​неприятность, но я играл с этим и просто не могу заставить его работать :-(
Mawg говорит восстановить Монику
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
}
Стюарт Кардалл
источник