วิธีดูใบรับรอง SSL ทั้งหมดในชุดข้อมูล?


101

ฉันมีไฟล์. crt มัดใบรับรอง

การทำopenssl x509 -in bundle.crt -text -nooutเพียงแสดงใบรับรองรูท

ฉันจะดูใบรับรองอื่น ๆ ทั้งหมดได้อย่างไร

คำตอบ:


120

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587แนะนำหนึ่งซับนี้:

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

มันใช้งานได้จริงสำหรับฉัน แต่ฉันไม่เข้าใจรายละเอียดดังนั้นจึงไม่สามารถพูดได้ว่ามีคำเตือนใด ๆ


9
นี่คือคำตอบที่ดีที่สุด - ฉันจะไม่โพสต์โซลูชัน Python ที่มีประสิทธิภาพสูงกว่า! ออกจาก "-text" เพื่อรับข้อมูลหัวเรื่อง / ผู้ออกใบรับรองแต่ละใบ
Chris Wolf

พยายาม/etc/ssl/certs/ca-certificates.crtและได้รับunable to load PKCS7 object
OrangeDog

1
นี่ไม่ใช่รูปแบบ pkcs7 ในขณะที่คำถามเกี่ยวกับชุดรูปแบบ x509?
Yetanotherjosh

3
ใช้เฉพาะ pkcs7 เป็นสื่อกลาง อินพุตถูกแบ่งส่วน PEM
Beni Cherniavsky-Paskin

คุณเป็นซุปเปอร์!!!
Jingguo Yao

21

Java's keytoolทำเคล็ดลับ:

keytool -printcert -v -file <certs.crt>

หมายเหตุ: Windows doubleclick ไม่ทำงาน Windows อ่านเฉพาะใบรับรองแรกในที่เก็บคีย์และขยาย trustchain โดยอัตโนมัติจากที่เก็บใบรับรองในตัว

ผล:

  1. เกินกว่าใบรับรองแรกใน.crtไฟล์จะไม่แสดง
  2. คุณอาจได้รับ trustchain ที่แตกต่างจากที่แสดงใน.crtไฟล์ สิ่งนี้อาจนำไปสู่ข้อสรุปที่ผิด

ขอบคุณสำหรับการชี้แจงสิ่ง windows นี่มันทำให้ฉันสับสนอย่างมาก
Nick.McDermaid

21

ต่อไปคำถามที่พบบ่อยนี้ทำให้ฉันPerl สคริปต์นี้ซึ่งรุนแรงมากแสดงให้เห็นว่าผมว่าopensslไม่เคยมีใครสนับสนุนพื้นเมืองสำหรับการจัดการn THใบรับรองในมัดและที่แทนเราจะต้องใช้เครื่องมือบางอย่างที่จะฝานและลูกเต๋าป้อนข้อมูลก่อนการให้อาหารในแต่ละ opensslใบรับรอง สคริปต์ Perl นี้ดัดแปลงมาอย่างอิสระจากสคริปต์ของ Nick Burch ที่ลิงก์ด้านบนดูเหมือนว่าจะทำงาน:

#!/usr/bin/perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <nick@tirian.magd.ox.ac.uk>
# v0.0.2         Tom Yates <tyates@gatekeeper.ltd.uk>
#

$filename = shift;
unless($filename) {
  die("You must specify a cert file.\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");

$thisfile = "";

while(<INP>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo \'$thisfile\' | openssl x509 -noout -text`;
      $thisfile = "";
   }
}
close INP;

10

Oneliner ที่แสดงสรุปของใบรับรองทั้งหมดในไฟล์

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(คอมมานโดที่คล้ายกันที่กล่าวถึงในคำตอบอื่น ๆ แต่สิ่งนี้จะให้ผลลัพธ์ที่สั้นกว่าโดยไม่มีตัวเลือก - ข้อความ)

ตัวอย่าง:

$ openssl crl2pkcs7 -nocrl -certfile bundled.crt | openssl pkcs7 -print_certs -noout

subject=/C=NL/postalCode=5705 CN/L=City/street=Example 20/O=Foobar B.V./OU=ICT/OU=Wildcard SSL/CN=*.example.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Roo

สิ่งนี้ต้องการคำอธิบายที่ดีกว่า
สเวน

3

นี่อาจจะไม่สวยหรือสง่างาม แต่มันก็รวดเร็วและใช้งานได้ดีสำหรับฉันโดยใช้ bash บน linux และ PEM จัดรูปแบบบล็อกในไฟล์ชุดมัด ca-cert

while read line
do
    if [ "${line//END}" != "$line" ]; then
        txt="$txt$line\n"
        printf -- "$txt" | openssl x509 -subject -issuer -noout
        txt=""
    else
        txt="$txt$line\n"
    fi
done < /path/to/bundle/file

คุณสามารถใส่มันทั้งหมดหนึ่งบรรทัดและปรับตัวเลือก openssl ให้เหมาะสม ฉันหวังว่าจะมีทางออกที่ดีกว่าสำหรับเรื่องนี้ แต่ในกรณีนี้ฉันคิดว่าการหาวิธีแก้ปัญหาที่หรูหรากว่านี้น่าจะใช้เวลามากกว่าการแฮ็กสิ่งที่ไม่เหมาะสมออกไป


3

เนื่องจากไม่มีโซลูชันที่ใช้ awk:

$ cat ca-bundle | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'
$ ls *.extracted.crt | while read cert; do openssl x509 -in $cert -text -noout; done

คำสั่งแรกแบ่งบันเดิลเป็น certs โดยค้นหาบรรทัด BEGIN และ END คำสั่งที่สองวนซ้ำผ่าน certs ที่แยกออกมาและแสดงให้เห็น


1
คุณลักษณะการเปลี่ยนเส้นทางการพิมพ์ใน awk มีให้ใน gawk และ nawk แต่ไม่มีใน awk พื้นฐาน ดังนั้นสิ่งนี้จะทำงานบน Linux (gawk เชื่อมโยงเป็น awk) แต่อาจไม่ได้อยู่ใน OS X ซึ่งมีพื้นฐาน awk
Raghu Dodda

1

ในทุบตีมักจะต้องการรหัสบรรทัดเดียว (ยาว) :-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete

0

การเปลี่ยนแปลงเล็กน้อยในโพสต์ของ MadHatter เพื่อให้คุณสามารถคัดลอก / วางตรงไปยัง CLI ฉันรวมแฮช MD5 ไว้ด้วยซึ่งจะมีประโยชน์เมื่อตรวจสอบว่า certs นั้นถูกต้อง บรรทัด stdin ที่ส่งคืนคือแฮช md5 ของใบรับรอง

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -text`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5`;
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

หากคุณต้องการที่จะเห็นผลสรุปสั้น ๆ ที่ดีคุณใช้รุ่นนี้ มีประโยชน์หากคุณเพียงตรวจสอบว่าคุณได้รวมใบรับรองทั้งหมดของคุณแล้ว แต่ไม่ได้ตรวจสอบการใช้งาน / etc ของใบรับรองอย่างแท้จริง

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -serial -subject -dates -alias -issuer`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5` . "\n";
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

ในกรณีที่รุ่น openssl ของคุณไม่รองรับการตั้งค่าสถานะทั้งหมดที่นี่มีบางส่วนเช่นที่คุณสามารถใช้ได้ เหมือนกับสิ่งแรก แต่เพียงไปที่ egrep

perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

ในการตรวจสอบแฮช MD5 ของคีย์ส่วนตัวคุณสามารถทำสิ่งต่อไปนี้

openssl rsa -noout -modulus -in privateKey.key | openssl md5

การอ้างอิง: SSL Shopper - ตัวจับคู่คีย์ใบรับรอง


0

นี่คือโซลูชันพื้นฐานของ awk ที่ไม่ต้องพึ่งพาไฟล์ระดับกลาง

cat bundle.crt | awk '{
  if ($0 == "-----BEGIN CERTIFICATE-----") cert=""
  else if ($0 == "-----END CERTIFICATE-----") print cert
  else cert=cert$0
}' | while read CERT; do
  echo "$CERT" | base64 -d | openssl x509 -inform DER -text -noout
done

มันทำงานได้โดยการอ่านบล็อก PEM จาก stdin และเชื่อมต่อแต่ละบล็อกเข้ากับเส้นฐานที่เข้ารหัส 64 บรรทัดเดียว บรรทัดจะถูกอ่านถอดรหัสและส่งผ่านไปยัง openssl เป็นใบรับรองที่เข้ารหัส DER


2
เพื่อความสนุก: cat bundle.crt | awk -v cmd="openssl x509 -subject -noout" '/-----BEGIN/ { c = $0; next } c { c = c "\n" $0 } /-----END/ { print c|cmd; close(cmd); c = 0 }'.
Manav

0

ฉันต้องการที่จะโยนใน commandline perl สำนวนที่นี่:

  perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

หากมีข้อความให้ปรับแต่งที่แข็งแกร่งขึ้นเล็กน้อย:

 perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

เพียงแค่เปลี่ยนค่าของสิ่งที่ n ควรอยู่ในคำสั่งที่สองเพื่อรับใบรับรองที่ n


-2

วิธีการของ Windows

วิธีหนึ่งที่คุณสามารถเห็นโซ่ทั้งหมดคือ (ใน Windows แน่นอน) เพื่อดับเบิลคลิกที่ crt จากนั้นดูที่แท็บเส้นทางการรับรอง มันจะแสดงห่วงโซ่ทั้งหมดแม้ว่าจะมีเพียงตัวกลางหรือรูต Cert ดูภาพหน้าจอด้านล่างสำหรับรายละเอียด หากคุณไม่ได้ใช้ Windows ฉันต้องขออภัยที่ไม่มีความรู้เกี่ยวกับชุดรูปแบบ Unix / Linux

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

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

Linux (วิธี Ubuntu)

ฉันมองข้ามคำสั่งเริ่มต้นของคุณและคุณมีสิ่งหนึ่งที่ออกไป คำสั่งของคุณควรมีลักษณะเช่นนี้:

openssl x509 -in bundle.crt -noout -text

แหล่งที่มา: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


จริงๆ? ฉันรู้ว่ามันเป็น sublte แต่คุณไม่สามารถบอกได้จริงหรือ openssl x509 ของฉันคือใน bundle.crt ไม่มีข้อความ - ในขณะที่คุณมี - ข้อความ - ไม่ทั้งหมด ... ด้วยเหตุนี้คุณอาจได้รับข้อผิดพลาดทางไวยากรณ์
Brad Bouchard

20
แบรดม้าของคุณ ประการแรก OP ไม่ได้บ่นว่าการopensslร้องขอของเขาให้ข้อผิดพลาดทางไวยากรณ์ แต่มันแสดงเฉพาะใบรับรองแรกในชุดข้อมูล ประการที่สองการเรียกใช้ทั้งสองเหมือนกันตามหน้าที่ ประการที่สามและที่สำคัญที่สุดคือคุณไม่ได้ทำงานอย่างน้อยก็สำหรับฉัน เช่นกันแสดงเพียงใบรับรองแรกในชุดรวม
MadHatter

ใช่ฉันไม่ได้อยู่ที่ด้าน Ubuntu ของสิ่งต่าง ๆ สำหรับปัญหาเช่นนี้และคิดว่าเขาอยู่บน Windows จนกว่าเขาจะบอกฉันเป็นอย่างอื่น ดังนั้นฉันไม่ต้องการออกจากการแขวน OP และหลังจากที่ฉันค้นหาเล็กน้อยพบว่าเว็บไซต์อ้างอิงสำหรับคำสั่งประเภทนี้แสดงรายการคำสั่งที่ฉันให้เขา (อันที่มีไวยากรณ์แตกต่างกันเล็กน้อย) และต้องการดูว่ามันสามารถ ช่วยด้วย. คะแนนของคุณถูกยึด แต่โปรดทำด้วยความกรุณาในครั้งต่อไป
Brad Bouchard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.