Câu trả lời:
http://comments.gmane.org/gmane.comp.encoding.openssl.user/43587 gợi ý điều này:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
Nó thực sự hiệu quả với tôi, nhưng tôi không hiểu chi tiết nên không thể nói nếu có bất kỳ cảnh báo nào.
/etc/ssl/certs/ca-certificates.crt
và nhậnunable to load PKCS7 object
Java keytool
thực hiện thủ thuật:
keytool -printcert -v -file <certs.crt>
Chú thích: Windows doubleclick không hoạt động. Windows chỉ đọc chứng chỉ đầu tiên trong kho khóa và tự động mở rộng Trustchain từ kho lưu trữ chứng chỉ tích hợp.
Các kết quả:
.crt
tệp không được hiển thị.crt
tệp. Điều này có thể dẫn đến kết luận sai.Theo Câu hỏi thường gặp này đã đưa tôi đến tập lệnh perl này , điều này rất gợi ý cho tôi rằng openssl
không có hỗ trợ riêng nào để xử lý chứng chỉ thứ n trong một gói và thay vào đó chúng ta phải sử dụng một số công cụ để cắt và nhập dữ liệu đầu vào trước khi cho mỗi Giấy chứng nhận cho . Kịch bản perl này, được điều chỉnh tự do từ kịch bản của Nick Burch được liên kết ở trên, dường như thực hiện công việc:openssl
#!/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 hiển thị một bản tóm tắt của mọi chứng chỉ trong tệp.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout
(Commando tương tự được đề cập trong câu trả lời khác, nhưng điều này cho đầu ra ngắn hơn, không có tùy chọn --text).
thí dụ:
$ 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
Điều này có thể không đẹp, hoặc thanh lịch, nhưng nó đã nhanh chóng và hiệu quả đối với tôi khi sử dụng bash trên linux và các khối được định dạng PEM trong tệp bó 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
Bạn có thể đặt tất cả một dòng và điều chỉnh các tùy chọn openssl cho phù hợp. Tôi thực sự mong muốn có một giải pháp thanh lịch hơn cho việc này, nhưng trong trường hợp này tôi nghĩ rằng việc tìm kiếm giải pháp thanh lịch hơn sẽ mất nhiều thời gian hơn là hack ra một giải pháp không phù hợp.
Vì không có giải pháp dựa trên 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
Lệnh đầu tiên phân chia bó thành các certs bằng cách tìm kiếm các dòng BEGIN và END. Lệnh thứ hai lặp qua các certs trích xuất và hiển thị chúng.
Thay đổi nhỏ cho bài đăng của MadHatter để cho phép bạn sao chép / dán thẳng vào CLI. Tôi cũng bao gồm hàm băm MD5, rất hữu ích khi đảm bảo các certs là chính xác. Dòng stdin được trả về là hàm băm md5 của cert (s).
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
Nếu bạn muốn xem một đầu ra ngắn gọn đẹp, bạn sử dụng phiên bản này. Hữu ích nếu bạn chỉ kiểm tra xem bạn đã bao gồm tất cả chứng chỉ của mình chưa, nhưng không thực sự kiểm tra việc sử dụng / vv của chứng chỉ.
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
Chỉ trong trường hợp phiên bản openssl của bạn không hỗ trợ tất cả các cờ ở đây là một số ví dụ bạn có thể sử dụng. Điều tương tự như cái đầu tiên nhưng chỉ là đường ống đến egrep.
perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"
Để kiểm tra hàm băm MD5 của khóa riêng, bạn có thể làm như sau.
openssl rsa -noout -modulus -in privateKey.key | openssl md5
Tham khảo: SSL Shopper - Trình so khớp khóa chứng chỉ
Đây là một giải pháp dựa trên awk không dựa vào các tệp trung gian.
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
Nó hoạt động bằng cách đọc các khối PEM từ stdin và nối từng khối thành một dòng được mã hóa base64. Các dòng sau đó được đọc, giải mã và chuyển sang openssl dưới dạng chứng chỉ được mã hóa 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 }'
.
Tôi muốn ném vào dòng lệnh perl thành ngữ ở đây:
perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem
Nếu có văn bản thì một tinh chỉnh mạnh mẽ hơn một chút:
perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem
Chỉ cần thay đổi giá trị của những gì n nên có trong câu lệnh thứ hai để có được chứng chỉ thứ n.
Một cách bạn có thể thấy toàn bộ chuỗi là (tất nhiên trong Windows) để nhấp đúp vào crt và sau đó nhìn vào tab Chứng chỉ đường dẫn. Nó sẽ hiển thị toàn bộ chuỗi ngay cả khi chỉ có một Chứng chỉ trung gian hoặc Root. Xem ảnh chụp màn hình bên dưới để biết chi tiết. Nếu bạn không ở trên Windows, tôi xin lỗi vì sự thiếu hiểu biết của tôi với các biến thể Unix / Linux.
Lưu ý: điều này có thể gây ra kết quả sai nếu chứng chỉ trung gian nằm trong kho khóa cục bộ của bạn Windows sẽ tự động thêm nó và không chỉ hiển thị những gì có trong gói.
Tôi bỏ qua lệnh ban đầu của bạn và bạn có một điều không đúng chỗ. Lệnh của bạn sẽ trông như thế này:
openssl x509 -in bundle.crt -noout -text
Nguồn: http://manpages.ubfox.com/manpages/hardy/man1/x509.1ssl.html
openssl
lời mời của anh ta đã mắc lỗi cú pháp, nhưng nó chỉ liệt kê chứng chỉ đầu tiên trong gói. Thứ hai, hai lời mời giống nhau về chức năng. Thứ ba, và có lẽ là quan trọng nhất, bạn cũng không làm việc, ít nhất là đối với tôi; nó cũng chỉ liệt kê chứng chỉ đầu tiên trong gói.