หลีกเลี่ยงการถามรหัสผ่านเพื่อขอกุญแจและแจ้งข้อมูล DN


90

ฉันใช้รหัสต่อไปนี้เพื่อสร้างกุญแจ:

apt-get -qq -y install openssl;
mkdir -p /etc/apache2/ssl;
openssl genrsa -des3 -out server.key 1024;
openssl req -new -key server.key -out server.csr;
cp server.key server.key.org;
openssl rsa -in server.key.org -out server.key;
openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt;
mv server.crt  /etc/apache2/ssl/cert.pem;
mv server.key  /etc/apache2/ssl/cert.key;
rm -f server.key.orig;
rm -f server.csr

ฉันมีสองคำถาม:

  1. ฉันจะข้ามข้อความแจ้งรหัสผ่านได้อย่างไร จะปลอดภัยหรือไม่ที่ฉันจะทำเช่นนั้น? (เช่นเดียวกับที่มันไม่ควรโง่เขลาอย่างจริงจังเหมือนใคร ๆ ก็ควรจะแฮ็คใบรับรอง)

  2. ฉันจะหลีกเลี่ยงการพร้อมท์สำหรับชื่อประเทศองค์กร ฯลฯ ได้อย่างไรฉันหวังว่าฉันจะให้พวกเขาได้ในหน้าจอพร้อมรับคำสั่ง (หน้า man จะแสดงเฉพาะตัวเลือกระดับบนสุดสำหรับ OpenSSL)

คำตอบ:


150

แก้ไข:นี่เป็นคำตอบที่ได้รับความนิยมสูงสุดของฉันและไม่กี่ปีที่ผ่านมาดังนั้นฉันจึงได้เพิ่มตัวแปร ECDSA หากคุณสามารถใช้ ECDSA คุณควร


คุณสามารถให้ข้อมูลทั้งหมดในบรรทัดคำสั่ง

การสร้างใบรับรองโดยใช้รหัสผ่านน้อยกว่าด้วยตนเองในขั้นตอนเดียว:

เวอร์ชั่น RSA

openssl req \
    -new \
    -newkey rsa:4096 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

รุ่น ECDSA

openssl req \
    -new \
    -newkey ec \
    -pkeyopt ec_paramgen_curve:prime256v1 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

คำสั่งย่อย openssl ทั้งหมดมี man page ของตนเอง man reqดู


โดยเฉพาะการตอบคำถามของคุณและเพื่อให้ชัดเจนยิ่งขึ้นเกี่ยวกับตัวเลือกที่มีผล:

  1. -nodesสัญญาณธงได้เข้ารหัสกุญแจสำคัญที่ทำให้คุณไม่ต้องใช้รหัสผ่าน คุณสามารถใช้-passout argธง ดูPASS PHRASE ARGUMENTSในopenssl(1)หน้า man สำหรับวิธีการจัดรูปแบบหาเรื่อง

  2. การใช้การ-subjตั้งค่าสถานะคุณสามารถระบุหัวเรื่อง (ตัวอย่างคือด้านบน)


3
การอ่านเนื้อหาผ่าน "-subj" นั้นใช้งานได้ดี แต่สำหรับฉัน - เฉพาะเมื่อไม่ได้ตั้งค่า OPENSSL_CONF IOW: หากตั้ง OPENSSL_CONF ไว้ OpenSSL จะลองอ่านจากที่นั่นและเพิกเฉยต่ออาร์กิวเมนต์บรรทัดคำสั่ง "-subj" เอาฉันไปคิดดู
oberstet

oberstet: ใช่นั่นเป็นเรื่องจริง
bahamat

เป็นไปได้หรือไม่ที่จะส่งคีย์หัวเรื่องจาก stdin? ฉันได้ลอง "-key stdin", "-key fd: 1" และ "-key -" .. โดยไม่มีโชค
oberstet

1
@JeremyBaker: ไม่คุณต้องมีสองขั้นตอนสำหรับสิ่งนั้น งด-x509และ-daysสร้าง CSR แทนใบรับรองจากนั้นใช้วิธีการลงนาม CA ตามปกติของคุณ
บาฮามาต

1
@jww - และเวลานั้นมาถึงแล้ว เริ่มต้นด้วย Chrome v58 เมื่อพยายามโหลดหน้าเว็บที่ปลอดภัย แต่ใบรับรองไม่มีหัวเรื่องที่ตรงกันชื่อ Alt จะแสดงหน้าข้อผิดพลาดความเป็นส่วนตัวพร้อมข้อความแสดงข้อผิดพลาด "NET :: ERR_CERT_COMMON_NAME_INVALID" คลิกที่ปุ่มขั้นสูงเพื่อแสดงข้อความ "... ใบรับรองความปลอดภัยมาจาก [missing_subjectAltName]"
ซอฟต์แวร์ Insomniac

11

-passinตัวเลือกไม่ได้หลอกลวงให้คุณใช่ไหม?

ด้วยfile:pathnameแบบฟอร์มคุณสามารถค่อนข้างปลอดภัยด้วยสิทธิ์ 600 สำหรับไฟล์นั้น


เห็นตัวเลือกในหน้าคน ดูเหมือนว่าฉันจะมีข้อความรหัสผ่านในลักษณะนั้นได้โดยไม่ต้องแจ้งให้ทราบ ขอบคุณ!

และด้วย-passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/
......

5

คำตอบที่ยอมรับนั้นต้องการการแก้ไขเล็กน้อย สาย EC:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

ควรจะเป็น:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

บน MacOS - OpenSSL 1.0.2f ติดตั้งผ่านทาง brew ฉันตรวจสอบคำตอบที่ยอมรับตามที่อธิบายไว้ด้านล่าง

  • หากต้องการแสดงเส้นโค้งรูปไข่ที่มีอยู่:

    $ openssl ecparam -list_curves
    
  • วิธีสร้างไฟล์คีย์:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • วิธีสร้างใบรับรองโดยไม่ต้องใส่รหัสผ่าน:

    openssl req \
        -new \
        -newkey ec:secp256k1.pem \
        -days 365 \
        -nodes \
        -x509 \
        -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \
        -keyout server.key \
        -out server.crt
    
  • วิธีดูใบรับรอง:

    $ openssl x509 -noout -text -in server.crt
    

สิ่งนี้แตกต่างจากคำตอบที่ยอมรับได้อย่างไร
Ramhound

1
ข้อแตกต่างที่สำคัญคือฉันจะแสดงขั้นตอนการสร้างไฟล์ pem อย่างชัดเจน คำตอบที่ยอมรับนั้นหายไป \ สองตัวอักษรและทำให้ฉันคิดว่าคำสั่งนั้นไม่ถูกต้อง
อังเดรสุระ

1
คุณอาจต้องการพูดถึงความจริงที่ว่า หากคำตอบที่ได้รับการยอมรับนั้นไม่สมบูรณ์และขาดอักขระสำคัญในการเน้นความแตกต่างและวิธีการที่คำตอบของคุณมีข้อมูลที่สำคัญที่สำคัญ
Ramhound

3

ลองคำสั่งต่อไปนี้:

openssl genrsa -des3 -out user.key -passout pass:foo 1024

ส่วนที่ข้ามคือ: -passout pass:foo.


2

@bahamat มีคำตอบที่ดี น่าเสียดายที่ openssl บางเวอร์ชันมีข้อผิดพลาดเมื่อพยายามสร้างใบรับรอง ECDSA ด้วยคำสั่งเดียว ข้อผิดพลาดเกิดขึ้นเช่น:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404

ฉันถูกใช้ในopenssl 1.0.1e-fipsCentOS 7

การสร้างใบรับรองของคุณด้วย 3 คำสั่งต่อไปนี้ดูเหมือนว่าจะทำงานได้:

openssl ecparam -genkey -name prime256v1 -out key.pem
openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem

บรรทัดสุดท้ายไม่ควรจบด้วยserver.crtหรือ
ᴠɪɴᴄᴇɴᴛ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.