วัตถุประสงค์ของอาร์กิวเมนต์ -nodes ใน openssl คืออะไร?


103

วัตถุประสงค์ของ-nodesอาร์กิวเมนต์ใน openssl คืออะไร?


2
Stack Overflow เป็นไซต์สำหรับคำถามเกี่ยวกับการเขียนโปรแกรมและการพัฒนา คำถามนี้ดูเหมือนจะไม่ตรงประเด็นเนื่องจากไม่เกี่ยวกับการเขียนโปรแกรมหรือการพัฒนา ดูหัวข้อที่ฉันสามารถถามได้ที่นี่ในศูนย์ช่วยเหลือ บางทีSuper UserหรือUnix & Linux Stack Exchangeอาจเป็นสถานที่ที่ดีกว่าในการถาม
jww

20
@jww ฉันไม่เห็นด้วย openssl เป็นชุดเครื่องมือระดับต่ำและนักพัฒนาต้องจัดการกับมันตลอดเวลา บรรทัดค่อนข้างเบลอและจะเป็นการสูญเสียครั้งใหญ่ที่ไม่อนุญาตให้มีคำถาม openssl ที่นี่เพียงเพราะมันเป็น CLI แทนที่จะเป็น C lib
gtd

@gtd - นั่นเป็นเรื่องร้องเรียนบ่อยครั้งเมื่อฉันตั้งค่าสถานะสิ่งเหล่านี้ ดูเพิ่มเติมที่ฉันจะโพสต์คำถามเกี่ยวกับ Dev Ops ได้ที่ไหน . (แต่ฉันคิดว่าฉันทำผิดกับคำถามนี้คำถามนี้มาจากปี 2011 และฉันเชื่อว่าในตอนนั้นฉันไม่ชอบที่จะลงโทษสำหรับการเปลี่ยนแปลงนโยบาย)
jww

2
@gtd - re: "openssl เป็นชุดเครื่องมือระดับต่ำและนักพัฒนาต้องจัดการกับมันตลอดเวลา" - นั่นคือสิ่งที่Super UserหรือUnix & Linux Stack Exchangeมีไว้สำหรับ "... มันจะเป็นการสูญเสียครั้งใหญ่ที่ไม่อนุญาตให้มีคำถาม openssl ... " - ยินดีต้อนรับคำถามการเขียนโปรแกรม openssl C เสมอ การสูญเสียคำถามที่ไม่เกี่ยวกับการเขียนโปรแกรมจะไม่พลาดเพราะ Stack Overflow เป็นไซต์การเขียนโปรแกรมและการพัฒนา มีไซต์อื่น ๆ ให้ไปเมื่อคุณไม่รู้วิธีใช้คำสั่ง
jww

ขอบคุณสำหรับลิงก์ฉันจะโพสต์คำตอบที่นั่นเนื่องจากคิดว่านี่เป็นปัญหาที่สำคัญมาก
gtd

คำตอบ:


124

ตัวเลือก-nodesนี้ไม่ใช่คำภาษาอังกฤษ "nodes" แต่เป็น "no DES" เมื่อกำหนดเป็นอาร์กิวเมนต์หมายความว่า OpenSSL จะไม่เข้ารหัสคีย์ส่วนตัวในไฟล์PKCS # 12

ในการเข้ารหัสคีย์ส่วนตัวคุณสามารถละเว้น-nodesและคีย์ของคุณจะถูกเข้ารหัสด้วย 3DES-CBC การเข้ารหัสคีย์ OpenSSL แจ้งให้คุณใส่รหัสผ่านและจะใช้รหัสผ่านที่จะสร้างคีย์การเข้ารหัสโดยใช้ฟังก์ชั่นคีย์รากศัพท์EVP_BytesToKey

ทั้งนี้ขึ้นอยู่กับรุ่นของ OpenSSL และตัวเลือกการรวบรวมคุณอาจจะสามารถให้ตัวเลือกเหล่านี้ในสถานที่ของ-nodes:

-des          encrypt private keys with DES
-des3         encrypt private keys with triple DES (default)
-idea         encrypt private keys with idea
-seed         encrypt private keys with seed
-aes128, -aes192, -aes256
              encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
              encrypt PEM output with cbc camellia

ในที่สุดที่ระดับไลบรารี OpenSSL เรียกใช้ฟังก์ชันPEM_write_bio_PrivateKeyด้วยอัลกอริทึมการเข้ารหัส (หรือไม่มี) ที่คุณเลือก


1
โดยการเข้ารหัสคุณหมายถึงรหัสผ่านหรือไม่?
Flimm

4
@Flimm: ป้องกันด้วยรหัสผ่านใช่ รหัสผ่านจะสร้างคีย์การเข้ารหัสโดยใช้อัลกอริธึมการมาของคีย์และการเข้ารหัสจะทำด้วยคีย์ไม่ใช่รหัสผ่าน วิธีเดียวในการใช้คีย์ที่เข้ารหัสคือการถอดรหัสก่อนซึ่งคุณจำเป็นต้องทราบรหัสผ่านที่เข้ารหัสเพื่อสร้างคีย์เดียวกัน
indiv

ทำไมฉันต้องเข้ารหัสไฟล์คีย์ส่วนตัวของฉัน สิ่งเหล่านี้ไม่ได้เผยแพร่ให้กับใครดังนั้นชื่อนี้ หรือว่าฉันผิด?
phil294

1
@Blauhirn: คุณเข้ารหัสไฟล์คีย์ส่วนตัวของคุณด้วยเหตุผลเดียวกับที่คุณเข้ารหัสไฟล์ใด ๆ : คุณไม่ต้องการให้คนที่ได้รับสำเนาสามารถอ่านหรือใช้งานได้ คุณควรเข้ารหัสคีย์ส่วนตัวหรือไม่นั้นขึ้นอยู่กับความสำคัญของคีย์และรูปแบบภัยคุกคามของคุณ
indiv

12

แก้ไข: nginx v1.7.3 ได้เพิ่มคำสั่งssl_password_fileซึ่งอ่านข้อความรหัสผ่านจากไฟล์ที่ระบุโดยพยายามใช้ข้อความรหัสผ่านแต่ละข้อความในบริบทที่เข้ารหัส-private.key

บุคคลที่ถูกต้องว่า-nodesอาร์กิวเมนต์หมายความว่า OpenSSL จะสร้างที่ไม่ได้เข้ารหัสprivate.key ; มิฉะนั้นจะมีรหัสผ่านพร้อมที่จะสร้างการเข้ารหัส-private.key ดูreq , pkcs12 , CA.pl

อย่างไรก็ตามฉันรู้สึกว่าจุดประสงค์ (สำหรับโปรแกรมเมอร์) เป็นเพราะ:

  • เซิร์ฟเวอร์ HTTP (เช่นApache , Nginx ) ไม่สามารถอ่านรหัสส่วนตัวที่เข้ารหัสโดยไม่มีข้อความรหัสผ่าน→
    • ตัวเลือก A - ทุกครั้งที่เซิร์ฟเวอร์ HTTP เริ่มทำงานต้องระบุข้อความรหัสผ่านสำหรับการเข้ารหัส - private.key
    • ตัวเลือก B - ระบุssl_password_file file.keys;ในhttp { }หรือserver { }บริบท [ อ้างอิง ]
    • ตัวเลือก C - ใช้-nodesเพื่อสร้างprivate.keyโดยไม่ต้องเข้ารหัส

มีประโยชน์: ล็อคprivate.key

  • {เพิ่มเซิร์ฟเวอร์ HTTP ในกลุ่มssl-cert }
  • sudo chown root:ssl-cert private.key- ch Ange เองเอ้อของprivate.keyเพื่อรากใช้งานSSL-CERTกลุ่ม
  • sudo chmod 640 private.key- เปลี่ยนสิทธิ์การเข้าถึงของprivate.keyให้กับเจ้าของ R / W, group R
  • ตอนนี้เซิร์ฟเวอร์ HTTP ควรจะสามารถที่จะเริ่มต้นและอ่านไม่ได้เข้ารหัสprivate.key

ตัวเลือกก

ความปลอดภัยที่แข็งแกร่งยิ่งขึ้น แต่เมื่อเซิร์ฟเวอร์รีสตาร์ทต้องพิมพ์ข้อความรหัสผ่านด้วยตนเองสำหรับการเข้ารหัส-private.key

ตัวเลือก B

ความปลอดภัยปานกลางและอาจมีความสมดุลที่ดีระหว่าง A / C

ตัวเลือก C

การรักษาความปลอดภัยที่อ่อนแอยังไม่ได้รับการแจ้งเตือนสำหรับ unencrypted private.keyวลีรหัสผ่าน


คำอธิบายที่ยอดเยี่ยม
rizidoro

1
Nginx สามารถอ่านคีย์ส่วนตัวที่เข้ารหัสได้ตั้งแต่เวอร์ชัน 1.7.3 ดูที่: nginx.org/en/docs/http/…
5lava

2
จุดประสงค์ของการนำ nginx และเวอร์ชันเข้าสู่การสนทนาคืออะไร? นอกจากนี้ (B) และ (C) ยังมีการรักษาความปลอดภัยที่เท่าเทียมกัน (กล่าวคือ ACL ของระบบไฟล์) ปัญหาที่คุณอธิบายคือปัญหาUnattended Key Storage Problemและเป็นปัญหาที่ไม่มีทางแก้ไข ดูหนังสือความปลอดภัยด้านวิศวกรรมของ Gutmann
jww

@jww คำถามถามว่า "มีจุดประสงค์อะไร ... ". ฉันพิจารณาบริบทของคำถาม (QnA สำหรับโปรแกรมเมอร์) ซึ่งฉันพยายามระบุผ่าน "อย่างไรก็ตามฉันรู้สึกว่าจุดประสงค์ (สำหรับโปรแกรมเมอร์) เป็นเพราะ:" โดยเฉพาะเรื่องความปลอดภัย .. อาจเป็นการสนทนาสำหรับsecurity.stackexchange.com
Jake Berger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.