Làm thế nào để xem tất cả các chứng chỉ ssl trong một gói?


101

Tôi có một tập tin .crt gói chứng chỉ.

làm openssl x509 -in bundle.crt -text -nooutchỉ hiển thị chứng chỉ gốc.

Làm thế nào để tôi thấy tất cả các chứng chỉ khác?

Câu trả lời:


120

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.


9
Đây là câu trả lời tốt nhất - tôi thậm chí sẽ không đăng giải pháp Python quá mức của mình! Để lại "-text" để chỉ lấy thông tin chủ đề / nhà phát hành cho mỗi chứng chỉ.
Chris Wolf

Đã thử /etc/ssl/certs/ca-certificates.crtvà nhậnunable to load PKCS7 object
OrangeDog

1
Đây không phải là định dạng pkcs7, trong khi câu hỏi là về các gói định dạng x509?
Yetanotherjosh

3
Nó chỉ sử dụng pkcs7 làm trung gian. Đầu vào là PEM nối.
Beni Cherniavsky-Paskin

Bạn là siêu nhân !!!
Jingguo Yao

21

Java keytoolthự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ả:

  1. Tất cả ngoài chứng chỉ đầu tiên trong .crttệp không được hiển thị
  2. Bạn có thể nhận được một Trustchain khác được hiển thị so với bạn có trong .crttệp. Điều này có thể dẫn đến kết luận sai.

Cảm ơn đã làm rõ các điều cửa sổ. Điều này thực sự làm tôi bối rối
Nick.McDilyn

21

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 opensslkhô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;

10

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ần giải thích tốt hơn
Sven

3

Đ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.


3

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.


1
Tính năng chuyển hướng in trong awk có sẵn trong gawk và nawk nhưng không có trong awk cơ bản. Và vì vậy, điều này sẽ hoạt động trên Linux (gawk được liên kết dưới dạng awk), nhưng có thể không có trên OS X có awk cơ bản.
Raghu Dodda

1

Trong bash thường chỉ cần một dòng mã (dài) :-)

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

0

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ỉ


0

Đâ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.


2
Chỉ để cho vui : 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

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.


-2

Phương pháp Windows

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.

                                      nhập mô tả hình ảnh ở đây

Linux (Phương pháp Ubuntu)

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


Có thật không? Tôi biết đó là sublte nhưng bạn thực sự không thể nói? Của tôi là openssl x509 -in bundle.crt -noout -text, trong khi của bạn có -text -noout ... do đó tại sao bạn có thể gặp lỗi cú pháp.
Brad Bouchard

20
Giữ ngựa của bạn, Brad. Đầu tiên, OP không phàn nàn rằng openssllờ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.
MadHatter

Vâng, tôi không ủng hộ Ubuntu về những vấn đề như thế này và nghĩ rằng anh ấy đã ở trên Windows cho đến khi anh ấy nói với tôi khác. Vì vậy, tôi đã không muốn để OP treo và sau khi tôi tìm kiếm một chút, thấy rằng một trang web tham chiếu cho các loại lệnh này liệt kê lệnh tôi đã đưa cho anh ta (một lệnh có cú pháp hơi khác nhau) và muốn xem liệu nó có thể Cứu giúp. Điểm của bạn đã được thực hiện, nhưng xin vui lòng làm điều đó với ân sủng hơn vào lần tới.
Brad Bouchard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.