วิธีสร้างคีย์ 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()... วิธีที่ "เหมาะสม" ในการสร้างคู่คีย์
Jake Berger

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:อ็อพชันหรือ file descriptor


ในการรับคีย์สาธารณะที่ตรงกันคุณต้องใช้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 กล่าวว่าคืนสถานะ Monica ใน

หรือกล่าวอีกนัยหนึ่ง - วิธีการคีย์สาธารณะจากคำสั่งของคุณ (ซึ่งแตกต่างจากของฉันเล็กน้อย) ฉันแค่ต้องการคู่ที่ตรงกัน นี่เป็นเพียงการรักษาความปลอดภัยที่ "ดีเพียงพอ" เท่านั้น
Mawg กล่าวว่าคืนสถานะ Monica ใน

4
@Mawg: opensslคำสั่งของคุณกำลังส่งออกคีย์สาธารณะที่ตรงกับคีย์ส่วนตัวที่ให้มา - คีย์สาธารณะไม่ได้เข้ารหัส (ไม่ใช่ความลับ) ดังนั้นการใช้-passoutจึงไม่มีเหตุผล คุณอาจต้องการใช้ที่-passinนั่นเพื่อจัดหาข้อความรหัสผ่านที่ใช้ในการเข้ารหัสคีย์ส่วนตัวในขั้นตอนแรก ฉันได้เพิ่มบางอย่างในคำตอบด้วย
คาเฟ่

@caf ขอบคุณสำหรับข้อเสนอแนะที่ดี (+1 อีกครั้ง) อย่างไรก็ตามฉันดูเหมือนจะโง่เกินกว่าที่จะได้รับอนุญาตให้ใช้ OpenSSL ฉันต้องการคีย์ในไฟล์และด้วยเหตุผลบางประการopenssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemไม่ทำเช่นนั้น คุณช่วยให้คำสั่งสองคำสั่งกับฉันได้ไหมคำสั่งหนึ่งในการสร้างคีย์ส่วนตัวลงในไฟล์หนึ่งวินาทีเพื่อสร้างคีย์สาธารณะ (เช่นในไฟล์) ขอโทษที่ทำให้รำคาญ แต่ฉันเล่นไปเรื่อย ๆ และไม่สามารถทำให้มันใช้งานได้ :-(
Mawg พูดว่าคืนสถานะ Monica

3
@Mawg: OpenSSL ไม่ชอบถ้า-outพารามิเตอร์มาตาม2048จริงนั่นควรจะเป็นสิ่งสุดท้ายในบรรทัดคำสั่ง (ฉันได้อัปเดตคำตอบของฉันแล้ว) ดูตัวอย่างสุดท้ายฉันคิดว่านั่นคือสิ่งที่คุณต้องการ สำหรับ AES-128 คนที่ฉันไว้วางใจในเรื่องเหล่านี้แนะนำให้ใช้ AES-256
คาเฟ่

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.