Bagaimana cara menghasilkan kunci openSSL menggunakan frasa sandi dari baris perintah?


107

Pertama - apa yang terjadi jika saya tidak memberikan frasa sandi? Apakah semacam frase pseudo random digunakan? Saya hanya mencari sesuatu yang "cukup baik" untuk mencegah peretas biasa.

Kedua - bagaimana cara membuat pasangan kunci dari baris perintah, memberikan frasa sandi pada baris perintah?


Saya akhirnya membuatnya berfungsi menggunakan perintah ini, menggunakan exec () yang umumnya dianggap tidak aman untuk digunakan, lebih baik memberikan PassPhrase dalam sebuah file. Saya dapat menerima risiko ini karena saya yakin bahwa PHP hanya akan dijalankan di PC saya (yang menjalankan windows & tidak memiliki perintah PS).

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

Banyak terima kasih kepada @caf, yang tanpanya hal ini tidak akan mungkin terjadi.

Hanya satu penyesalan - bahwa, tidak peduli berapa banyak saya Google, tidak ada yang bisa openssl_pkey_new()bekerja dengan Xampp di Windows (yang merupakan cara yang tepat untuk menghasilkan pasangan kunci)


4
mengapa openssl_pkey_new()... cara yang "tepat" untuk menghasilkan pasangan kunci?
Jake Berger

Windows tidak (biasanya) memiliki pstetapi sejak Vista memilikiwmic process get commandline
dave_thompson_085

Jawaban:


210

Jika Anda tidak menggunakan frasa sandi, maka kunci privat tidak dienkripsi dengan penyandian simetris apa pun - keluarannya sama sekali tidak terlindungi.

Anda dapat membuat pasangan kunci, memberikan kata sandi pada baris perintah menggunakan permintaan seperti (dalam hal ini, kata sandinya adalah foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Namun, perhatikan bahwa frasa sandi ini dapat diambil oleh proses lain yang berjalan di mesin pada saat itu, karena argumen baris perintah umumnya terlihat oleh semua proses.

Alternatif yang lebih baik adalah menulis frasa sandi ke dalam file sementara yang dilindungi dengan izin file, dan menentukan bahwa:

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

Atau berikan frasa sandi pada input standar:

openssl genrsa -aes128 -passout stdin 3072

Anda juga dapat menggunakan pipa bernama dengan file: opsi, atau deskriptor file.


Untuk kemudian mendapatkan kunci publik yang cocok, Anda perlu menggunakan openssl rsa, memberikan frasa sandi yang sama dengan -passinparameter seperti yang digunakan untuk mengenkripsi kunci pribadi:

openssl rsa -passin file:passphrase.txt -pubout

(Ini mengharapkan kunci pribadi terenkripsi pada input standar - sebagai gantinya Anda dapat membacanya dari file menggunakan -in <file>).


Contoh pembuatan pasangan kunci pribadi dan publik 3072-bit dalam file, dengan pasangan kunci pribadi yang dienkripsi dengan kata sandi foobar:

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

+1 Hebat, berhasil! Terima kasih, jika Anda dapat membantu sedikit lebih banyak maka Anda akan mendapatkan jawabannya ... mengapa ini tidak berhasil? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg mengatakan kembalikan Monica

atau, dengan kata lain - cara menggunakan kunci publik dari perintah Anda (yang sedikit berbeda dari milik saya). Saya hanya butuh pasangan yang cocok. Ini hanya keamanan yang "cukup baik".
Mawg mengatakan memulihkan Monica

4
@Mawg: opensslPerintah Anda mengeluarkan kunci publik yang sesuai dengan kunci pribadi yang disediakan - kunci publik tidak dienkripsi (bukan rahasia), jadi penggunaan -passouttidak masuk akal. Anda mungkin ingin menggunakannya di -passinsana, untuk memberikan frasa sandi yang digunakan untuk mengenkripsi kunci privat pada langkah pertama. Saya juga menambahkan sesuatu ke jawabannya.
kafe

@caf, terima kasih atas tanggapan yang bagus (+1 lagi). Namun, saya tampaknya terlalu bodoh untuk diizinkan menggunakan OpenSSL. Saya ingin kunci dalam sebuah file dan, untuk beberapa alasan, openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemtidak melakukannya. Bisakah Anda memberi saya dua perintah - satu untuk membuat kunci pribadi menjadi file dan yang kedua untuk membuat kunci publik (juga dalam file)? Maaf mengganggu, tapi saya telah bermain-main dengannya & tidak bisa membuatnya bekerja :-(
Mawg mengatakan kembalikan Monica

3
@Mawg: OpenSSL tidak suka jika -outparameter muncul setelah 2048- sungguh, itu seharusnya menjadi hal terakhir pada baris perintah (saya telah memperbarui jawaban saya seperti itu). Lihat contoh terakhir, saya pikir itu yang Anda inginkan. Adapun AES-128, seseorang yang saya percayai dalam masalah ini merekomendasikannya melalui AES-256.
kafe

9

genrsatelah diganti olehgenpkey & ketika dijalankan secara manual di terminal, ia akan meminta kata sandi:

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

Namun ketika dijalankan dari skrip, perintah tidak akan meminta kata sandi sehingga untuk menghindari kata sandi dapat dilihat sebagai proses gunakan fungsi dalam shellskrip:

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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.