Làm cách nào để xác minh dấu vân tay SSL bằng dòng lệnh? (wget, curl, Giáo)


32

Sử dụng trình tải xuống trang web dòng lệnh, chẳng hạn như wget, curlhoặc bất kỳ trang nào khác ... Trong tập lệnh ...

Tôi có SHA-1 và SHA-256 xác nhận dấu vân tay của một trang web. Do những lo ngại về bảo mật ( 1 ) ( 2 ), tôi không muốn sử dụng hệ thống ủy quyền chứng chỉ SSL công cộng. Dấu vân tay phải được mã hóa cứng.

Một ứng dụng như wget có thể kiểm tra dấu vân tay SSL không?

wget không có chức năng như vậy. ( 3 )

Sử dụng wget --ca-certificatehoặc curl --cacerttôi sẽ phải điều hành cơ quan cấp chứng chỉ địa phương của riêng mình, điều mà tôi muốn ngăn chặn, vì điều đó làm tăng thêm sự phức tạp. Điều đó cũng cực kỳ khó khăn và chưa ai làm điều đó trước đây. ( 4 )

Không có công cụ nào, như thế
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.comnào?

Giải pháp tất nhiên phải không dễ bị tổn thương với TOCTOU. ( 5 ) MITM có thể cho phép trả lại dấu vân tay hợp lệ cho yêu cầu máy khách openssl và giả mạo với yêu cầu wget sau.


Có lẽ cần phải thực hiện một số phép thuật OpenSSL như: cyberciti.biz/faq/
mẹo

Khách truy cập: lưu ý rằng điều này đã được đăng chéo lên SE infosec . Một trong những câu trả lời tự được sao chép từ đó. Đây là hành vi nhăn mặt, btw.
Félix Saparelli

Câu trả lời:


31

Nguồn

Cài đặt phần mềm cần thiết:

apt-get install ca-certificates curl

Tải xuống chứng chỉ SSL công cộng:

openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt >./x.cert </dev/null

Hoặc tốt hơn:

echo -n | openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./torproject.pem

Nhận dấu vân tay SHA-1:

openssl x509 -noout -in torproject.pem -fingerprint -sha1

Nhận dấu vân tay SHA-256:

openssl x509 -noout -in torproject.pem -fingerprint -sha256

So sánh thủ công dấu vân tay SHA-1 và SHA-256 với torproject.org Câu hỏi thường gặp: SSL .

.

Tùy chọn kết xuất các chứng chỉ ca vô dụng cho mục đích thử nghiệm. Sử dụng curl ở đây, nhưng wget có lỗi Bug và dù sao cũng sử dụng các tập tin ca.

sudo mv /usr/share/ca-certificates /usr/share/ca-certificates_

Tải xuống với curl và chứng chỉ được ghim:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html

điều này không hoạt động với sự có mặt của một proxy, mặc dù: - /
Frederick Nord

Xin lưu ý rằng tùy chọn -CAfile hoàn toàn bị bỏ qua trong ví dụ của bạn.
Lars

11

Trong tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout

3
hoạt động trong zsh, cũng nên hoạt động cho bash
số5

10

Điều này cũng đủ:

openssl x509 -fingerprint -in server.crt

Thêm -md5tùy chọn để truy xuất Dấu vân tay MD5. -md5không được đặt ở giữa -inserver.crt.
林果

4

Điều này khá dễ thực hiện với openssllệnh và chức năng máy khách của nó.

Tập lệnh nhỏ sau đây sẽ lấy một miền nhất định (không có tiền tố https) và dấu vân tay SHA-1 và thoát không có lỗi (0) nếu lấy dấu vân tay trùng khớp, nhưng với mã thoát 1 nếu không khớp. Sau đó, bạn có thể kết hợp nó vào tập lệnh của mình bằng cách kiểm tra mã thoát cuối cùng $?:

#! / bin / bash
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -không xuất hiện | cắt -f2 -d '=' ` if ["$ 2" = "$ FPRINT"]; sau đó thoát 0 khác thoát 1 fi

Nó dễ bị TOCTOU. [1] MITM có thể cho phép trả lại dấu vân tay hợp lệ cho yêu cầu máy khách openssl và giả mạo với yêu cầu wget sau. [1] vi.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch

Đúng, trong lý thuyết. Sẽ khá dễ dàng để sửa đổi wgetvà biên dịch nó với OpenSSL để nó thực hiện những gì bạn muốn nội tuyến, nhưng điều đó nằm ngoài phạm vi của câu trả lời AU.
ish

Vì vậy, làm thế nào về việc sử dụng s_client để lấy tài liệu? Một cái gì đó như (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443nên làm việc, không? Chà, bạn phải tách thông tin phiên SSL từ trả lời nội dung thực tế.
taneli

3

nguồn

#!/usr/bin/perl
# https://security.stackexchange.com/questions/20399/how-to-verify-the-ssl-fingerprint-by-command-line-wget-curl
# Code snippets taken from Net::SSLeay documentation and mildly modified.
# Requires a newer version of SSLeay (tested with 1.48)
# Needless to say, verify correct $host and $fingerprint before testing!!!

use Net::SSLeay qw(get_https3);

$host = "www.google.com";
$port = 443;
$fingerprint = "C1:95:6D:C8:A7:DF:B2:A5:A5:69:34:DA:09:77:8E:3A:11:02:33:58";

($p, $resp, $hdrs, $server_cert) = get_https3($host, $port, '/');
if (!defined($server_cert) || ($server_cert == 0)) {
    warn "Subject Name: undefined, Issuer  Name: undefined";
} elsif (Net::SSLeay::X509_get_fingerprint($server_cert, "sha1") ne $fingerprint) {
    warn 'Invalid certificate fingerprint '
        .  Net::SSLeay::X509_get_fingerprint($server_cert, "sha1")
        . ' for ' . Net::SSLeay::X509_NAME_oneline(
             Net::SSLeay::X509_get_subject_name($server_cert));
} else {
    print $p;
}

Như được nêu trong tài liệu Net :: SSLeay, phương pháp này có nghĩa là xác minh sau giao dịch HTTP và do đó không nên được sử dụng nếu bạn muốn xác minh bạn đang nói chuyện với đúng máy chủ trước khi gửi dữ liệu cho họ. Nhưng nếu tất cả những gì bạn đang làm là quyết định có tin tưởng những gì bạn vừa tải xuống hay không (có vẻ như bạn đến từ tài liệu tham khảo số 4 của bạn) thì điều này vẫn ổn.


1

Đó là kịch bản hàng ngày của tôi:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Ouput:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
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.