ฉันมีไฟล์. crt มัดใบรับรอง
การทำopenssl x509 -in bundle.crt -text -noout
เพียงแสดงใบรับรองรูท
ฉันจะดูใบรับรองอื่น ๆ ทั้งหมดได้อย่างไร
ฉันมีไฟล์. crt มัดใบรับรอง
การทำopenssl x509 -in bundle.crt -text -noout
เพียงแสดงใบรับรองรูท
ฉันจะดูใบรับรองอื่น ๆ ทั้งหมดได้อย่างไร
คำตอบ:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587แนะนำหนึ่งซับนี้:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
มันใช้งานได้จริงสำหรับฉัน แต่ฉันไม่เข้าใจรายละเอียดดังนั้นจึงไม่สามารถพูดได้ว่ามีคำเตือนใด ๆ
/etc/ssl/certs/ca-certificates.crt
และได้รับunable to load PKCS7 object
Java's keytool
ทำเคล็ดลับ:
keytool -printcert -v -file <certs.crt>
หมายเหตุ: Windows doubleclick ไม่ทำงาน Windows อ่านเฉพาะใบรับรองแรกในที่เก็บคีย์และขยาย trustchain โดยอัตโนมัติจากที่เก็บใบรับรองในตัว
ผล:
.crt
ไฟล์จะไม่แสดง.crt
ไฟล์ สิ่งนี้อาจนำไปสู่ข้อสรุปที่ผิดต่อไปคำถามที่พบบ่อยนี้ทำให้ฉัน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;
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
นี่อาจจะไม่สวยหรือสง่างาม แต่มันก็รวดเร็วและใช้งานได้ดีสำหรับฉันโดยใช้ 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 ให้เหมาะสม ฉันหวังว่าจะมีทางออกที่ดีกว่าสำหรับเรื่องนี้ แต่ในกรณีนี้ฉันคิดว่าการหาวิธีแก้ปัญหาที่หรูหรากว่านี้น่าจะใช้เวลามากกว่าการแฮ็กสิ่งที่ไม่เหมาะสมออกไป
เนื่องจากไม่มีโซลูชันที่ใช้ 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 ที่แยกออกมาและแสดงให้เห็น
ในทุบตีมักจะต้องการรหัสบรรทัดเดียว (ยาว) :-)
tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete
การเปลี่ยนแปลงเล็กน้อยในโพสต์ของ 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 - ตัวจับคู่คีย์ใบรับรอง
นี่คือโซลูชันพื้นฐานของ 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
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 }'
.
ฉันต้องการที่จะโยนใน 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
วิธีหนึ่งที่คุณสามารถเห็นโซ่ทั้งหมดคือ (ใน Windows แน่นอน) เพื่อดับเบิลคลิกที่ crt จากนั้นดูที่แท็บเส้นทางการรับรอง มันจะแสดงห่วงโซ่ทั้งหมดแม้ว่าจะมีเพียงตัวกลางหรือรูต Cert ดูภาพหน้าจอด้านล่างสำหรับรายละเอียด หากคุณไม่ได้ใช้ Windows ฉันต้องขออภัยที่ไม่มีความรู้เกี่ยวกับชุดรูปแบบ Unix / Linux
หมายเหตุ: สิ่งนี้อาจทำให้เกิดผลลัพธ์ที่ผิดพลาดหากใบรับรองระดับกลางอยู่ในที่เก็บคีย์โลคัล Windows ของคุณจะเพิ่มโดยอัตโนมัติและไม่แสดงเฉพาะสิ่งที่อยู่ในชุดรวม
ฉันมองข้ามคำสั่งเริ่มต้นของคุณและคุณมีสิ่งหนึ่งที่ออกไป คำสั่งของคุณควรมีลักษณะเช่นนี้:
openssl x509 -in bundle.crt -noout -text
แหล่งที่มา: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
ร้องขอของเขาให้ข้อผิดพลาดทางไวยากรณ์ แต่มันแสดงเฉพาะใบรับรองแรกในชุดข้อมูล ประการที่สองการเรียกใช้ทั้งสองเหมือนกันตามหน้าที่ ประการที่สามและที่สำคัญที่สุดคือคุณไม่ได้ทำงานอย่างน้อยก็สำหรับฉัน เช่นกันแสดงเพียงใบรับรองแรกในชุดรวม