Làm cách nào để trích xuất Root CA và CA cấp dưới từ chuỗi chứng chỉ trong Linux?


25

Tôi có chứng chỉ end-entity / server có chứng chỉ trung gian và root. Khi tôi cattrên chứng chỉ thực thể cuối, tôi chỉ thấy một BEGINEND thẻ thẻ. Nó là chứng chỉ thực thể cuối cùng.

Có cách nào tôi có thể xem nội dung chứng chỉ trung gian và gốc. Tôi chỉ cần nội dung BEGINENDthẻ.

Trong Windows, tôi có thể thấy chuỗi chứng chỉ đầy đủ từ "Đường dẫn chứng nhận". Dưới đây là ví dụ cho chứng chỉ của Stack Exchange.

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

Từ đó tôi có thể thực hiện Chứng chỉ Xem và xuất chúng. Tôi có thể làm điều đó cho cả root và trung gian trong Windows. Tôi đang tìm kiếm phương pháp tương tự trong Linux.

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


Xin vui lòng cho chúng tôi biết ai đã cấp cho bạn chứng chỉ đó.
Rui F Ribeiro

@RuiFRibeiro Hãy nói bất cứ ai ... Tôi muốn xem chuỗi chứng nhận cho stackexchange chỉ với chứng chỉ chính trong tay.
Anirban Nag 'tintinmj'

Câu trả lời:


25

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 -untrustedtùy chọn được sử dụng để cung cấp cho các chứng chỉ trung gian (s); se.crtlà 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 -textchứ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_hashbạ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 .0và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.


Đó là vấn đề chính. Tôi không có URL với tôi. Tôi chỉ có tập tin chứng chỉ. Và tôi cần nội dung được mã hóa giữa BEGINENDthẻ (mà bạn sẽ nhận được sau khi chỉ cần catnhập tệp .crt.
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'Nếu bạn chỉ muốn giải mã chứng chỉ, hãy thửopenssl x509 -in file.crt -noout -text
derobert

Tôi muốn nội dung của trung gian tại chứng chỉ gốc nằm giữa thẻ BEGINENDthẻ.
Anirban Nag 'tintinmj'

Hoặc nếu bạn có thể đưa ra một lệnh sẽ trích xuất chứng chỉ trung gian và gốc từ chứng chỉ chính và lưu nó vào một tệp ... Tôi cũng có thể sống với điều đó.
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'Nếu nó không hiển thị với openssl x509lệnh, tôi không nghĩ chứng chỉ trung gian ở đó. (Trừ khi bạn có một số lỗi từ openssl x509).
derobert

12

tl; dr - một phép thuật bash lót để đổ tất cả các certs trong chuỗi

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Giải thích trong 2 bước

Để đổ tất cả các certs trong chuỗi vào thư mục hiện tại như cert${chain_number}.pem:

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

phần thưởng theo dõi để đổi tên chúng thành tên chung của chúng:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Có bất kỳ lý do nào để chọn ".pem" so với ".crt" làm tiện ích mở rộng vì bạn chỉ đổi tên chúng, không thay đổi định dạng không?
Thuyền trưởng Man

Không thật sự lắm. ".Pem" là định dạng (cơ sở64 của DER) ".crt" có nghĩa là chứng chỉ nhưng không cho biết bất cứ điều gì về mã hóa. Tôi chuẩn bị làm cho nó phù hợp hơn và đặt tên cho tất cả pem ... Nhưng tôi nghĩ đơn giản hơn là đọc trong một lớp để hiểu nơi chứng chỉ được tải xuống (crt) và hoàn thành những gì tôi thường sử dụng trong thế giới Linux (pem) . Hy vọng điều này làm rõ mọi thứ một chút ...
estani

1
Đúng vậy, tôi nhận ra PEM là một định dạng nhưng tôi thường thấy crt và không chắc nó có phải là định dạng không. Điều này thực sự giúp giải thích lý do tại sao tôi thấy "crt" được sử dụng thường xuyên như vậy. Cảm ơn :)
Thuyền trưởng Man

Điều này dường như chỉ hoạt động nếu bạn đã tin tưởng nguồn. Tôi đang cố tải xuống một CA tùy chỉnh nhưng nó chỉ tải xuống chứng chỉ đầu tiên, không phải chuỗi.
mjaggard

@mjaggard lạ vì tôi đã sử dụng nó chính xác cho trường hợp đó. Điều đó đang được nói, máy chủ có thể hoàn toàn không gửi CA gốc, nếu bạn xem ví dụ của tôi, nó đã sử dụng để tải xuống 3 certs bây giờ nó chỉ tải xuống 2. Tôi cho rằng máy chủ wikipedia không gửi root (thực sự không có điểm, nếu bạn không có nó, bạn sẽ không tin tưởng dù sao đi nữa ...). Tôi khá chắc chắn rằng đó không phải là trường hợp trước đây.
estani
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.