วิธีการดาวน์โหลดใบรับรอง SSL จากเว็บไซต์


คำตอบ:


246

ในการดาวน์โหลดใบรับรองคุณต้องใช้ไคลเอ็นต์ที่มีอยู่ใน openssl ดังนี้:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

/tmp/$SERVERNAME.certที่จะช่วยใบรับรองไปยัง

คุณสามารถใช้-showcertsหากคุณต้องการดาวน์โหลดใบรับรองทั้งหมดในเครือ แต่ถ้าคุณต้องการดาวน์โหลดใบรับรองเซิร์ฟเวอร์ไม่จำเป็นต้องระบุ-showcerts

echo -n ให้การตอบสนองไปยังเซิร์ฟเวอร์เพื่อให้การเชื่อมต่อถูกปล่อยออกมา

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'ลบข้อมูลเกี่ยวกับห่วงโซ่ใบรับรองและรายละเอียดการเชื่อมต่อ นี่เป็นรูปแบบที่ต้องการเพื่ออิมพอร์ตใบรับรองไปยังที่เก็บคีย์อื่น


9
ขอบคุณที่คุณไม่เพียง แต่ให้คำตอบที่ดี แต่ยังอธิบายอย่างแม่นยำด้วย
marco.m

ไม่-showcertsแสดงใบรับรองเซิร์ฟเวอร์ / ใบเกินไป? ฉันคิดว่ามันจะแสดงตัวกลางเมื่อมีการรวมสวิตช์
Mike B

ตามคำตอบที่กล่าวไว้s_clientจะแสดงใบรับรองเซิร์ฟเวอร์เสมอ (หากมีอยู่นั่นคือเซิร์ฟเวอร์ตอบสนองต่อสวัสดีและไม่เลือกชุดที่ไม่ระบุชื่อ) -showcertsแสดงใบรับรองทั้งหมดที่ได้รับใบรับรองเซิร์ฟเวอร์ก่อนจากนั้นตัวกลางและ / หรือราก
dave_thompson_085

4
แม้ว่ามันจะไม่ทำงานในการแสดงตนของพร็อกซี
Frederick Nord

2
สิ่งนี้ยังไม่ทำงานกับเซิร์ฟเวอร์ที่ใช้ SNI (หลายใบรับรอง / โดเมนในที่อยู่ IP เดียว) เพื่อหลีกเลี่ยงปัญหาให้ระบุพารามิเตอร์ชื่อเซิร์ฟเวอร์ของ openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN
verhage

60

ฉันพบคำตอบ Openssl ให้มัน

openssl s_client -connect $ {REMHOST}: $ {REMPORT}


2
นอกจากนี้ยังopenssl x509 -text <<EOF cert-text EOFเพื่อดูรายละเอียดของใบรับรอง
mpapis

2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemความอนุเคราะห์จากserverfault.com/questions/139728/…
pulkitsinghal

การทำเช่นนี้จะสำเร็จและข้ามการsedแฮ็ค
phs

สิ่งนี้จะตรวจสอบใบรับรองเพียงใบเดียวจะเกิดอะไรขึ้นถ้าบริการเป็นส่วนหนึ่งของกลุ่มโหลดบาลานซ์ของเซิร์ฟเวอร์ซึ่งแต่ละใบรับรองมีใบรับรองที่แตกต่างกันอาจมีการเซ็นชื่อโดย root CA อื่น หรือกล่าวอีกนัยหนึ่งการโจมตีแบบ mitm อาจทำให้คำขอนี้ผ่านไปยังไซต์จริงแล้วส่งคำขออื่น ๆ ไปยังเซิร์ฟเวอร์ของเขา มีวิธีการตรวจสอบนี้หรือไม่? และเพื่อรับรายการใบรับรองทั้งหมดที่โดเมนมีจริงหรือ
Jens Timmerman

@JensTimmerman "หรือกล่าวอีกนัยหนึ่งการโจมตีแบบ mitm อาจปล่อยให้คำขอนี้ไปยังเว็บไซต์จริงจากนั้นส่งคำขออื่น ๆ ไปยังเซิร์ฟเวอร์ของเขา" ไม่สามารถทำได้เว้นแต่ว่า man-in-the-middle จะมีใบรับรองที่ถูกต้องสำหรับเซิร์ฟเวอร์เป้าหมาย (หรือไคลเอ็นต์นั้นเป็นคนโง่ไม่ได้ตรวจสอบใบรับรองเซิร์ฟเวอร์) เห็นได้ชัดว่าหากบางครั้งเซิร์ฟเวอร์ให้ใบรับรองที่แตกต่างกันคุณก็หวังได้ว่าจะได้รับใบรับรองทั้งหมดในที่สุดโดยการพยายามเชื่อมต่อซ้ำ
David Tonhofer

22

GNUTLSเครื่องมือของลูกค้าgnutls-cliนอกจากนี้ยังสามารถทำให้เรื่องนี้ง่าย:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

โปรแกรมได้รับการออกแบบมาเพื่อมอบไคลเอนต์แบบโต้ตอบให้กับเว็บไซต์ดังนั้นคุณต้องป้อนข้อมูลที่ว่างเปล่า (ในตัวอย่างนี้จาก/dev/null) เพื่อสิ้นสุดเซสชันการโต้ตอบ


1
มันจะทำให้ gnutls เชื่อมต่อผ่าน (ระบบกำหนดค่าแบบกว้าง) https พร็อกซีและพิมพ์ใบรับรองที่แลกเปลี่ยนได้อย่างไร
Frederick Nord

9

ตามคำตอบ @bignose ต่อไปนี้เป็นรุ่นที่มีในตัวที่เหมาะสำหรับสูตรอาหารของเชฟ:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates

6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

โหมดของ openssl นี้คาดว่า stdin ดังนั้นเราจึงจัดให้มันผ่านtrue |การเชื่อมต่อนี้ไปยังเซิร์ฟเวอร์ที่ระบุในพารามิเตอร์ -connect 2>/dev/nullข้อผิดพลาดเงียบ (ไม่บังคับ) เราสามารถส่งผ่านเอาต์พุตทั้งหมดไปยังตัวแยกวิเคราะห์ x509 โดยระบุ/dev/stdinให้ใช้เชลล์ไพพ์เป็นไฟล์อินพุต และที่จะส่งออกเพียง-----BEGIN CERTIFICATE-----เพื่อ-----END CERTIFICATE-----เป็นส่วนหนึ่งของs_clientการส่งออก คุณสามารถเปลี่ยนเส้นทางไปยังไฟล์โดยเพิ่ม> google.com.pemไปยังจุดสิ้นสุดของคำสั่ง


ดีที่สุดที่ฉันสามารถบอกได้นี่ไม่ได้ตรวจสอบห่วงโซ่ใบรับรองมันสามารถบอกคุณได้ว่าข้อมูลประจำตัว ssl ที่เซิร์ฟเวอร์ปลายทางมอบให้


2
(1) สิ่งนี้ไม่ได้ปรับปรุงคำตอบจาก 6 ปีที่ผ่านมา (2) x509อ่าน stdin โดยค่าเริ่มต้นดังนั้น-in /dev/stdinจะซ้ำซ้อน (3) s_clientตรวจสอบใบรับรองเซิร์ฟเวอร์เชื่อมโยงอย่างถูกต้องกับจุดยึดความน่าเชื่อถือในท้องถิ่น (รูท) และยังไม่หมดอายุ ระงับข้อมูลที่จะแสดงนี้ (4) ไม่ตรวจสอบการเพิกถอน (5) ตรวจสอบชื่อในเซิร์ฟเวอร์ใบรับรองเฉพาะใน 1.0.2 แล้วไม่ใช่ตามค่าเริ่มต้น (แต่คุณสามารถตรวจสอบเองได้ง่ายๆโดยดูที่ใบรับรอง หลังจากนั้น)
dave_thompson_085

@ dave_thompson_085 คำถามคือวิธีดาวน์โหลดใบรับรอง แต่ไม่แสดงข้อมูลลูกโซ่ ฉันชอบ openssl x509 ดีกว่า sed ในคำตอบอื่น
Der_Meister

0

ไวยากรณ์ทางเลือกโดยใช้ Ex และการทดแทนกระบวนการ:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.