Từ một trang web, bạn có thể làm:
openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null
Điều đó sẽ hiển thị chuỗi chứng chỉ và tất cả các chứng chỉ mà máy chủ đã trình bày.
Bây giờ, nếu tôi lưu hai chứng chỉ đó vào tệp, tôi có thể sử dụng openssl verify
:
$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
Các -untrusted
tùy chọn được sử dụng để cung cấp cho các chứng chỉ trung gian (s); se.crt
là giấy chứng nhận để xác minh. Độ sâu = 2 kết quả đến từ cửa hàng CA đáng tin cậy của hệ thống.
Nếu bạn không có (các) chứng chỉ trung gian, bạn không thể thực hiện xác minh. Đó chỉ là cách X.509 hoạt động.
Tùy thuộc vào chứng chỉ, nó có thể chứa URI để lấy trung gian. Ví dụ, openssl x509 -in se.crt -noout -text
chứa:
Authority Information Access:
OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt
URI "Nhà phát hành CA" đó trỏ đến chứng chỉ trung gian (ở định dạng DER, vì vậy bạn cần sử dụng openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pem
để chuyển đổi nó để sử dụng thêm bởi OpenSSL).
Nếu bạn chạy openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hash
bạn nhận được 244b5494
, cái mà bạn có thể tìm kiếm trong cửa hàng CA gốc của hệ thống tại /etc/ssl/certs/244b5494.0
(chỉ cần thêm .0
vào tên).
Tôi không nghĩ rằng có một lệnh OpenSSL dễ dàng, tốt đẹp để làm tất cả điều đó cho bạn.