ฉันต้องการดาวน์โหลดใบรับรอง SSL จากนั้นพูดhttps://www.google.comโดยใช้ wget หรือคำสั่งอื่น ๆ บรรทัดคำสั่ง unix ใด ๆ wget หรือ openssl?
ฉันต้องการดาวน์โหลดใบรับรอง SSL จากนั้นพูดhttps://www.google.comโดยใช้ wget หรือคำสั่งอื่น ๆ บรรทัดคำสั่ง unix ใด ๆ wget หรือ openssl?
คำตอบ:
ในการดาวน์โหลดใบรับรองคุณต้องใช้ไคลเอ็นต์ที่มีอยู่ใน 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'
ลบข้อมูลเกี่ยวกับห่วงโซ่ใบรับรองและรายละเอียดการเชื่อมต่อ นี่เป็นรูปแบบที่ต้องการเพื่ออิมพอร์ตใบรับรองไปยังที่เก็บคีย์อื่น
-showcerts
แสดงใบรับรองเซิร์ฟเวอร์ / ใบเกินไป? ฉันคิดว่ามันจะแสดงตัวกลางเมื่อมีการรวมสวิตช์
s_client
จะแสดงใบรับรองเซิร์ฟเวอร์เสมอ (หากมีอยู่นั่นคือเซิร์ฟเวอร์ตอบสนองต่อสวัสดีและไม่เลือกชุดที่ไม่ระบุชื่อ) -showcerts
แสดงใบรับรองทั้งหมดที่ได้รับใบรับรองเซิร์ฟเวอร์ก่อนจากนั้นตัวกลางและ / หรือราก
ฉันพบคำตอบ Openssl ให้มัน
openssl s_client -connect $ {REMHOST}: $ {REMPORT}
openssl x509 -text <<EOF cert-text EOF
เพื่อดูรายละเอียดของใบรับรอง
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/…
GNUTLSเครื่องมือของลูกค้าgnutls-cli
นอกจากนี้ยังสามารถทำให้เรื่องนี้ง่าย:
gnutls-cli --print-cert www.example.com \
< /dev/null \
> www.example.com.certs
โปรแกรมได้รับการออกแบบมาเพื่อมอบไคลเอนต์แบบโต้ตอบให้กับเว็บไซต์ดังนั้นคุณต้องป้อนข้อมูลที่ว่างเปล่า (ในตัวอย่างนี้จาก/dev/null
) เพื่อสิ้นสุดเซสชันการโต้ตอบ
ตามคำตอบ @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
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 ที่เซิร์ฟเวอร์ปลายทางมอบให้
x509
อ่าน stdin โดยค่าเริ่มต้นดังนั้น-in /dev/stdin
จะซ้ำซ้อน (3) s_client
ตรวจสอบใบรับรองเซิร์ฟเวอร์เชื่อมโยงอย่างถูกต้องกับจุดยึดความน่าเชื่อถือในท้องถิ่น (รูท) และยังไม่หมดอายุ ระงับข้อมูลที่จะแสดงนี้ (4) ไม่ตรวจสอบการเพิกถอน (5) ตรวจสอบชื่อในเซิร์ฟเวอร์ใบรับรองเฉพาะใน 1.0.2 แล้วไม่ใช่ตามค่าเริ่มต้น (แต่คุณสามารถตรวจสอบเองได้ง่ายๆโดยดูที่ใบรับรอง หลังจากนั้น)
ไวยากรณ์ทางเลือกโดยใช้ Ex และการทดแทนกระบวนการ:
ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt