Làm thế nào để tải chứng chỉ ssl từ một trang web?


Câu trả lời:


246

Để tải xuống chứng chỉ, bạn cần sử dụng ứng dụng khách được tích hợp vào openssl như vậy:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Điều đó sẽ lưu chứng chỉ vào /tmp/$SERVERNAME.cert.

Bạn có thể sử dụng -showcertsnếu bạn muốn tải xuống tất cả các chứng chỉ trong chuỗi. Nhưng nếu bạn chỉ muốn tải xuống chứng chỉ máy chủ, không cần chỉ định-showcerts

echo -n đưa ra phản hồi cho máy chủ để kết nối được giải phóng

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'xóa thông tin về chuỗi chứng chỉ và chi tiết kết nối. Đây là định dạng ưa thích để nhập chứng chỉ vào các kho khóa khác.


9
đánh giá cao rằng bạn không chỉ đưa ra một câu trả lời tốt, mà còn là một lời giải thích chính xác.
marco.m

-showcertshiển thị các chứng chỉ máy chủ / lá quá không? Tôi nghĩ rằng nó chỉ hiển thị trung gian khi chuyển đổi được bao gồm.
Mike B

Như câu trả lời đã nói, s_clientluôn hiển thị chứng chỉ máy chủ (nếu có, tức là máy chủ trả lời xin chào và không chọn bộ ẩn danh). -showcertshiển thị tất cả các certs nhận được, chứng chỉ máy chủ đầu tiên sau đó trung gian và / hoặc root.
dave_thndry_085

4
tuy nhiên, điều này không hoạt động trong sự hiện diện của một proxy.
Frederick Nord

2
Điều này cũng không hoạt động với các máy chủ sử dụng SNI (nhiều chứng chỉ / tên miền trên một địa chỉ IP). Để tránh sự cố, chỉ định tham số tên máy chủ của openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN
verhage 9/12/2016

60

Tôi tìm thấy câu trả lời. Openssl cung cấp nó.

openssl s_client -connect $ {REMHOST}: $ {REMANCE}


2
cũng openssl x509 -text <<EOF cert-text EOFđể xem chi tiết của chứng chỉ
mpapis

2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemlịch sự của serverfault.com/questions/139728/ từ
pulkitsinghal

điều này thực hiện tương tự và bỏ qua sedhack.
phs

Điều này chỉ kiểm tra một chứng chỉ, nếu dịch vụ là một phần của nhóm máy chủ cân bằng tải, mỗi máy chủ có một chứng chỉ khác nhau, có thể được ký bởi một CA gốc khác nhau thì sao? Hay nói cách khác, một cuộc tấn công mitm có thể cho phép yêu cầu này đi vào trang web thực, và sau đó chuyển các yêu cầu khác đến máy chủ của anh ta. Có cách nào để kiểm tra điều này? Và để có được một danh sách tất cả các chứng chỉ mà một tên miền thực sự có?
Jens Timmerman

@JensTimmerman "Hay nói cách khác, một cuộc tấn công mitm có thể cho phép yêu cầu này đi vào trang web thực, và sau đó chuyển các yêu cầu khác đến máy chủ của anh ta." Điều đó là không thể trừ khi người trung gian có chứng chỉ hợp lệ cho máy chủ đích (hoặc máy khách ngớ ngẩn không kiểm tra chứng chỉ máy chủ). Rõ ràng, nếu máy chủ đôi khi cung cấp một chứng chỉ khác, bạn chỉ có thể hy vọng cuối cùng có thể nhận được tất cả chúng bằng cách lặp lại các nỗ lực kết nối.
David Tonhofer

22

Công cụ máy khách GNUTLSgnutls-cli , cũng có thể thực hiện điều này dễ dàng:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Chương trình được thiết kế để cung cấp một ứng dụng khách tương tác cho trang web, vì vậy bạn cần cung cấp cho nó đầu vào trống (trong ví dụ này, từ /dev/null) để kết thúc phiên tương tác.


1
Làm thế nào nó có thể làm cho các gnutls kết nối thông qua (proxy được định cấu hình trên toàn hệ thống) và in chứng chỉ mà nó thực hiện?
Frederick Nord

9

dựa trên câu trả lời @bignose, đây là một phiên bản khép kín rất phù hợp với ví dụ như một công thức đầu bếp:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates

6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

chế độ openssl này mong đợi stdin, vì vậy chúng tôi cung cấp thông qua true |, điều này kết nối với máy chủ được chỉ định trong tham số -connect. 2>/dev/nulllỗi im lặng (tùy chọn), chúng ta có thể chuyển toàn bộ đầu ra vào trình phân tích cú pháp x509, chỉ định /dev/stdinsử dụng ống vỏ làm tệp đầu vào. Và đó là ý chí đầu ra chỉ là -----BEGIN CERTIFICATE-----để -----END CERTIFICATE-----phần s_clientđầu ra. Bạn có thể chuyển hướng đó đến một tệp bằng cách thêm > google.com.pemvào cuối lệnh.


Như tôi có thể nói, điều này không xác minh chuỗi chứng chỉ, nó chỉ có thể cho bạn biết danh tính ssl mà máy chủ cuối cung cấp.


2
(1) điều này không thực sự cải thiện các câu trả lời từ 6 năm trước (2) x509mặc định đọc stdin vì vậy -in /dev/stdinlà dư thừa (3) s_clientxác minh chuỗi chứng chỉ máy chủ chính xác đến một neo tin cậy cục bộ (root) và chưa hết hạn, nhưng bạn đã loại bỏ thông tin sẽ hiển thị thông tin này (4) nó KHÔNG kiểm tra thu hồi (5) nó chỉ kiểm tra tên trong chứng chỉ máy chủ trong 1.0.2 và sau đó không theo mặc định (nhưng bạn có thể dễ dàng tự kiểm tra bằng cách xem chứng chỉ sau đó)
dave_thndry_085

@ dave_thndry_085, câu hỏi là làm thế nào để tải xuống chứng chỉ, nhưng không hiển thị thông tin chuỗi. Tôi thích openssl x509 tốt hơn nhiều so với sed trong một câu trả lời khác.
Der_Meister

0

Cú pháp thay thế bằng cách sử dụng Ex và thay thế quá trình:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
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.