วิธีการตรวจสอบลายนิ้วมือ SSL ด้วยบรรทัดคำสั่ง? (wget, curl, …)


32

ใช้บรรทัดคำสั่งเว็บไซต์ดาวน์โหลดเช่นwget, curlหรืออื่น ๆ ... ในสคริปต์ ...

ฉันมีลายนิ้วมือรับรอง SHA-1 และ SHA-256 ของเว็บไซต์ เนื่องจากข้อกังวลด้านความปลอดภัย ( 1 ) ( 2 ) ฉันไม่ต้องการใช้ระบบการออกใบรับรอง SSL สาธารณะ ลายนิ้วมือจะต้องมีการเข้ารหัสอย่างหนัก

แอพพลิเคชั่นอย่าง wget สามารถตรวจสอบลายนิ้วมือ SSL ได้หรือไม่?

wget ไม่มีฟังก์ชั่นดังกล่าว ( 3 )

การใช้wget --ca-certificateหรือcurl --cacertฉันจะต้องเรียกใช้ผู้ออกใบรับรองท้องถิ่นของฉันซึ่งฉันต้องการป้องกันเพราะนั่นเพิ่มความซับซ้อนมาก นอกจากนี้ยังยากเป็นพิเศษและไม่มีใครทำแบบนั้นมาก่อน ( 4 )

ไม่มีเครื่องมืออะไรเลย
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.comใช่ไหม

แน่นอนว่าการแก้ปัญหาต้องไม่เสี่ยงต่อ TOCTOU ( 5 ) MITM สามารถปล่อยลายนิ้วมือที่ถูกต้องสำหรับการร้องขอของไคลเอ็นต์ openssl และแก้ไขด้วยการร้องขอ wget ต่อไปนี้


อาจจะต้องทำมายากล OpenSSL บางอย่างเช่น: cyberciti.biz/faq/...
จัสติน Andrusk

ผู้เยี่ยมชม: ทำบันทึกว่านี่คือการข้ามไปยังโพสต์ความมั่นคงสารสนเทศ SE หนึ่งในคำตอบด้วยตนเองถูกคัดลอกมาจากที่นั่น นี่เป็นพฤติกรรมขมวดคิ้ว btw
Félix Saparelli

คำตอบ:


31

แหล่ง

ติดตั้งซอฟต์แวร์ที่ต้องการ:

apt-get install ca-certificates curl

ดาวน์โหลดใบรับรอง SSL สาธารณะ:

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

หรือดีกว่า:

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

รับลายนิ้วมือ SHA-1:

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

รับลายนิ้วมือ SHA-256:

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

ด้วยตนเองเปรียบเทียบ SHA-1 และ SHA-256 ลายนิ้วมือกับtorproject.org คำถามที่พบบ่อย: SSL

.

เลือกแสดงผลใบรับรอง ca- ไร้ประโยชน์สำหรับวัตถุประสงค์ในการทดสอบ ใช้curlที่นี่ แต่wgetมีบั๊กBugและใช้ไฟล์ ca-อย่างไรก็ตาม

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

ดาวน์โหลดด้วย curl และใบรับรองที่ปักหมุด:

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

สิ่งนี้ไม่สามารถใช้งานต่อหน้าพร็อกซีได้แม้ว่า: / /
Frederick Nord

โปรดทราบว่าตัวเลือก -CAfile จะถูกละเว้นในตัวอย่างของคุณ
ลาร์ส


10

นี่ก็เพียงพอแล้ว:

openssl x509 -fingerprint -in server.crt

เพิ่ม-md5ตัวเลือกเพื่อเรียกค้นลายนิ้วมือ MD5 -md5ไม่ต้องใส่ในระหว่างและ-in server.crt
林果皞

4

นี่ค่อนข้างง่ายที่จะทำกับopensslคำสั่งและฟังก์ชันการทำงานของไคลเอ็นต์

สคริปต์เล็กน้อยต่อไปนี้จะใช้โดเมนที่กำหนด (ไม่มีคำนำหน้า https) และลายนิ้วมือ SHA-1 และออกโดยไม่มีข้อผิดพลาด (0) หากลายนิ้วมือที่ดึงมาจับคู่ แต่มีรหัสทางออก 1 หากไม่มีการจับคู่ จากนั้นคุณสามารถรวมไว้ในสคริปต์ของคุณโดยเพียงทดสอบรหัสออกสุดท้าย$?:

#! / bin / ทุบตี
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -noout -fingerprint | cut -f2 -d '=' ' if ["$ 2" = "$ FPRINT"]; แล้วก็ ออก 0 อื่น ทางออก 1 Fi

มันเปราะบางต่อ TOCTOU [1] MITM สามารถปล่อยลายนิ้วมือที่ถูกต้องสำหรับการร้องขอของไคลเอ็นต์ openssl และแก้ไขด้วยการร้องขอ wget ต่อไปนี้ [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch

จริงในทางทฤษฎี มันจะค่อนข้างง่ายในการแก้ไขwgetและคอมไพล์ด้วย OpenSSL เพื่อให้มันทำงานในสิ่งที่คุณต้องการแบบอินไลน์ แต่มันอยู่นอกเหนือขอบเขตของคำตอบ AU
ish

ดังนั้นวิธีการใช้ s_client เพื่อดึงเอกสารหรือไม่ สิ่งที่ชอบ(echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443ควรทำงานใช่ไหม คุณต้องแบ่งข้อมูลเซสชัน SSL ออกจากการตอบกลับเนื้อหาจริง
taneli

3

แหล่ง

#!/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;
}

ตามที่อธิบายไว้ในเอกสาร Net :: SSLeay วิธีนี้หมายถึงการตรวจสอบหลังจากธุรกรรม HTTP และไม่ควรใช้หากคุณต้องการตรวจสอบว่าคุณกำลังพูดคุยกับเซิร์ฟเวอร์ที่ถูกต้องก่อนที่จะส่งข้อมูล แต่ถ้าสิ่งที่คุณทำคือการตัดสินใจว่าจะเชื่อใจในสิ่งที่คุณเพิ่งดาวน์โหลดหรือไม่ (ซึ่งฟังดูเหมือนคุณมาจากการอ้างอิงที่ 4) สิ่งนี้ก็ใช้ได้


1

นั่นคือสคริปต์ประจำวันของฉัน:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.