วิธีการแตก Root CA และ CA ย่อยจากห่วงโซ่ใบรับรองใน Linux?


25

ฉันมีใบรับรองเอนทิตี / เซิร์ฟเวอร์ที่มีใบรับรองระดับกลางและระดับรูท เมื่อฉันcatใช้ใบรับรองเอนทิตีฉันเห็นเพียงแท็กเดียวBEGINและENDแท็ก เป็นเพียงใบรับรองเอนทิตีปลายทาง

มีวิธีใดบ้างที่ฉันสามารถดูเนื้อหาใบรับรองระดับกลางและรูท ฉันต้องการเฉพาะเนื้อหาBEGINและENDแท็ก

ใน Windows ฉันสามารถดูเชนใบรับรองเต็มได้จาก "เส้นทางการรับรอง" ด้านล่างนี้เป็นตัวอย่างสำหรับใบรับรองของ Exchange Exchange

ป้อนคำอธิบายรูปภาพที่นี่

จากตรงนั้นฉันสามารถดูใบรับรองและส่งออกได้ ฉันสามารถทำได้ทั้งในระดับรากและระดับกลางใน Windows ฉันกำลังมองหาวิธีเดียวกันนี้ใน Linux

ป้อนคำอธิบายรูปภาพที่นี่


โปรดบอกเราว่าใครเป็นคนออกใบรับรองให้คุณ
Rui F Ribeiro

@RuiFRibeiro สมมติว่าทุกคน ... ฉันต้องการดูเชนใบรับรองสำหรับ stackexchange ที่มีเฉพาะใบรับรองหลักในมือ
Anirban Nag 'tintinmj'

คำตอบ:


25

จากเว็บไซต์คุณสามารถทำได้:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

ที่จะแสดงห่วงโซ่ใบรับรองและใบรับรองทั้งหมดที่เซิร์ฟเวอร์นำเสนอ

ตอนนี้ถ้าฉันบันทึกใบรับรองทั้งสองไปยังไฟล์ฉันสามารถใช้openssl verify:

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

-untrustedตัวเลือกที่จะใช้ในการให้ใบรับรองระดับกลาง (s); se.crtเป็นใบรับรองในการตรวจสอบ ผลลัพธ์ depth = 2 มาจากที่เก็บ CA ที่เชื่อถือได้ของระบบ

หากคุณไม่มีใบรับรองระดับกลางคุณจะไม่สามารถทำการตรวจสอบได้ นั่นเป็นเพียงวิธีการทำงานของ X.509

มันอาจมี URI เพื่อรับสื่อกลางทั้งนี้ขึ้นอยู่กับใบรับรอง ตัวอย่างopenssl x509 -in se.crt -noout -textประกอบด้วย:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

URI "CA Issuers" นั้นชี้ไปที่ใบรับรองระดับกลาง (ในรูปแบบ DER ดังนั้นคุณต้องใช้openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pemเพื่อแปลงเพื่อใช้งานต่อไปโดย OpenSSL)

หากคุณเรียกใช้openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hashคุณจะได้รับ244b5494ซึ่งคุณสามารถค้นหาได้ในที่เก็บ root ของระบบ CA ที่/etc/ssl/certs/244b5494.0(เพียงต่อท้าย.0ชื่อ)

ฉันไม่คิดว่าจะมีคำสั่ง OpenSSL ที่ดีและง่ายต่อการทำสิ่งนั้นเพื่อคุณ


นั่นคือปัญหาหลัก ฉันไม่มี URL ด้วย ฉันมีไฟล์ใบรับรองเท่านั้น และฉันต้องการเนื้อหาที่เข้ารหัสระหว่างBEGINและENDแท็ก (ซึ่งคุณจะได้รับหลังจากเพียงแค่catเปิดไฟล์. crt
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'หากคุณกำลังมองหาที่จะถอดรหัสใบรับรองลองopenssl x509 -in file.crt -noout -text
derobert

ฉันต้องการเนื้อหาของสื่อกลางที่รูทใบรับรองซึ่งอยู่ระหว่างBEGINและENDแท็ก
Anirban Nag 'tintinmj'

หรือถ้าคุณสามารถให้คำสั่งซึ่งจะดึงใบรับรองกลางและใบรับรองหลักจากใบรับรองหลักและบันทึกลงในไฟล์ ... ฉันสามารถอยู่กับที่
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'หากมันไม่ปรากฏขึ้นพร้อมกับopenssl x509คำสั่งฉันไม่คิดว่ามีใบรับรองระดับกลางอยู่ที่นั่น (เว้นแต่คุณจะได้รับข้อผิดพลาดจากopenssl x509)
derobert

12

tl; dr - เวทย์ทุบตีสายการบินหนึ่งเพื่อทิ้ง certs ทั้งหมดในโซ่

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

คำอธิบายใน 2 ขั้นตอน

หากต้องการดัมพ์ certs ทั้งหมดในเชนไปยัง dir ปัจจุบันcert${chain_number}.pemดังนี้:

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

โบนัสแทร็กเพื่อเปลี่ยนชื่อเป็นชื่อสามัญ:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

มีเหตุผลใดบ้างที่จะเลือก ".pem" กับ ".crt" เป็นส่วนขยายเนื่องจากคุณเปลี่ยนชื่อเพียงอย่างเดียวไม่ใช่เปลี่ยนรูปแบบหรือไม่
Captain Man

ไม่ไม่ได้จริงๆ ".pem" เป็นรูปแบบ (base64 ของ DER) ".crt" หมายความว่าเป็นใบรับรอง แต่ไม่ได้บอกอะไรเกี่ยวกับการเข้ารหัส ฉันกำลังจะทำให้มันสอดคล้องกันมากขึ้นและตั้งชื่อ pem ทั้งหมด ... แต่ฉันคิดว่ามันง่ายกว่าที่จะอ่านในหนึ่งซับเพื่อทำความเข้าใจว่าใบรับรองกำลังดาวน์โหลด (crt) และจบสิ่งที่ฉันมักจะใช้ในโลก Linux (pem) . หวังชี้แจงนี้สิ่งเล็กน้อย ...
estani

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

ดูเหมือนว่าจะใช้งานได้ก็ต่อเมื่อคุณเชื่อถือแหล่งที่มาแล้ว ฉันกำลังพยายามดาวน์โหลด CA ที่กำหนดเอง แต่เพียงดาวน์โหลดใบรับรองแรกไม่ใช่เชน
mjaggard

@ mjaggard แปลกเพราะฉันใช้มันไปกับกรณีนั้น อย่างที่บอกไปแล้วว่าเซิร์ฟเวอร์ไม่สามารถส่งรูท CA ได้เลยถ้าคุณลองดูตัวอย่างของฉันมันเคยดาวน์โหลด 3 certs ตอนนี้กำลังดาวน์โหลดเพียง 2 ฉันคิดว่าเซิร์ฟเวอร์ wikipedia ไม่ได้ส่งรูท (ไม่มีเลยจริงๆ จุดถ้าคุณไม่ได้คุณจะไม่ไว้ใจมันเลย ... ) ฉันค่อนข้างแน่ใจว่ามันไม่ใช่กรณีก่อน
estani
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.