วิธีใช้ curl เพื่อตรวจสอบว่าใบรับรองของไซต์ถูกเพิกถอนแล้วหรือไม่


26

หากต้องการตรวจสอบว่าใบรับรองสำหรับ google.com ถูกเพิกถอนไปแล้วฉันลองใช้คำสั่งต่อไปนี้:

curl https://www.google.com --cacert GeoTrust_Global_CA.pem --crlfile gtglobal.pem -v

แต่ฉันพบข้อผิดพลาด "ปัญหาใบรับรอง SSL" ที่น่ากลัว:

* About to connect() to www.google.com port 443 (#0)
*   Trying 81.24.29.91... connected
* successfully set certificate verify locations:
*   CAfile: GeoTrust_Global_CA.pem
  CApath: /etc/ssl/certs
* successfully load CRL file:
*   CRLfile: gtglobal.pem
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

ฉันเดาว่าข้อผิดพลาดนี้ไม่ถูกต้องเนื่องจาก Google ควรมีใบรับรองที่ถูกต้อง

คุณรู้หรือไม่ว่าฉันจะออกคำสั่ง curl ซึ่งทำได้อย่างถูกต้องได้อย่างไร

รายละเอียดเพิ่มเติม

หากคุณสงสัยว่าทำไมฉันถึงใช้ไฟล์เฉพาะเหล่านั้น (GeoTrust_Global_CA.pem และ gtglobal.pem) ในคำสั่ง curl นี่คือวิธีที่ฉันดำเนินการ:

  • ครั้งแรกที่ผมมองไปที่สิ่งที่ CA ออกใบรับรองสำหรับhttps://www.google.com ปรากฎว่าเป็น GeoTrust Global CA
  • ฉันดาวน์โหลดใบรับรองราก GeoTrust Global CA จากที่นี่ (นี่คือไฟล์ GeoTrust_Global_CA.pem);
  • ฉันดาวน์โหลด CRL ที่เกี่ยวข้อง (รายการเพิกถอนใบรับรอง) จากที่นี่ (นี่คือไฟล์ gtglobal.pem)

ดูเหมือนว่าฉันจะใช้งานได้หรือไม่ ฉันไม่แน่ใจว่าคำถามของคุณคืออะไร
mtak

1
@mtak - เนื่องจากการตรวจสอบล้มเหลวดูเหมือนว่าผู้เขียนขอให้เหตุผลว่าทำไมใบรับรองไม่สามารถตรวจสอบได้ใบรับรองควรได้รับการตรวจสอบแล้วเนื่องจากใบรับรอง Google ปัจจุบันยังไม่ถูกเพิกถอน
Ramhound

ขออภัยฉันรู้ว่าตอนนี้คำถามยังไม่ชัดเจน ฉันจะแก้ไขมัน @Ramhound ที่อยู่ที่ถูกต้อง :)
Claudiu

ฉันไม่เข้าใจในหลักการว่าทำไมคุณถึงต้องเชื่อมต่อกับgoogle.comเพื่อยืนยันว่าใบรับรอง (ซึ่งคุณได้รับระหว่างการจับมือ TLS) มีอยู่หรือไม่ใน CRL (ซึ่งคุณดาวน์โหลดไปแล้ว) คุณไม่ควรทำอย่างนั้นในคอมพิวเตอร์ของคุณเอง? จะเป็นอย่างไรถ้าgoogle.comเป็น MITM จริง ๆ
Craig Hicks

นี่คือตัวอย่างของการตรวจสอบด้วยตนเองถ้าใบรับรอง อยู่ใน CRL เมื่อใบรับรองทั้งคู่ และ CRL อยู่ในหน่วยความจำในเครื่อง --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

คำตอบ:


12

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

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

10

เห็นได้ชัดว่าคุณไม่สามารถยืนยันไซต์ด้วยคำของ่ายๆเพียงครั้งเดียว ดู/programming/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1และคำถามที่เกี่ยวข้องที่เก่ากว่าใน stackoverflow

curl ไม่ทำงานกับรายการเพิกถอนใบรับรองสำหรับฉันทั้งบน Windows หรือบน Linux ทำไมคุณควรใช้ขด ? Opensslดูเหมือนจะเหมาะสมกว่า:

openssl s_client -connect www.google.com:443

เราได้รับ

---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---

จากนั้นเราสามารถตรวจสอบใบรับรอง:

curl http://pki.google.com/GIAG2.crt | openssl x509 -inform der -text

grep crlในเอาต์พุตของคำสั่งด้านบน ส่วนที่น่าสนใจคือ:

        X509v3 CRL Distribution Points:
            URI:http://crl.geotrust.com/crls/gtglobal.crl

        Authority Information Access:
            OCSP - URI:http://gtglobal-ocsp.geotrust.com

ตอนนี้เราสามารถตรวจสอบ crl ด้วยตนเอง:

curl http://crl.geotrust.com/crls/gtglobal.crl | openssl crl -inform der -text
curl http://pki.google.com/GIAG2.crl | openssl crl -inform der -text

ตอนนี้เราเห็นรายการใบรับรองที่ถูกเพิกถอน IMHO การใช้ curl ไม่เพียงพอต้องใช้โปรแกรมอื่นเพื่อตรวจสอบใบรับรอง โดยทำแบบง่าย ๆ

strace curl https://www.google.com   -v

เราเห็นว่า curl ไม่ได้ตรวจสอบการเพิกถอน (ไม่ได้เชื่อมต่อกับสถานที่ที่เกี่ยวข้อง) มันแค่พูดว่า

* Server certificate:
*        subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*        start date: 2014-04-09 11:40:11 GMT
*        expire date: 2014-07-08 00:00:00 GMT
*        subjectAltName: www.google.com matched
*        issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*        SSL certificate verify ok.

2
ทำไมคุณบอกว่าขดไม่สามารถทำเช่นนี้? curl manpage ระบุตัวเลือก '--crlfile' ซึ่งมีอยู่เพื่อจุดประสงค์นี้ นอกจากนี้ curl ยังถูกคอมไพล์ด้วย openssl และใช้สำหรับการดำเนินการที่เกี่ยวข้องกับ crypto (รวมถึงใบรับรอง) - มันใช้งานไม่ได้สำหรับฉันพยายามค้นหาว่าทำไม :)
Claudiu

3

เห็นได้ชัดว่านี่เป็นปัญหาที่พบได้บ่อยใน Windows เนื่องจากคำถามนี้ใน stackoverflow แสดงขึ้นมา ฉันหมายถึงเฉพาะคำตอบของผู้ใช้АртурКурицынซึ่งฉันพูดที่นี่เพื่อความสะดวกของคุณ:

มันเป็นปัญหาที่พบได้บ่อยใน Windows คุณจำเป็นเพียงเพื่อให้ชุด ที่จะcacert.pemcurl.cainfo

ตั้งแต่ PHP 5.3.7 คุณสามารถทำได้:

  1. ดาวน์โหลดhttp://curl.haxx.se/ca/cacert.pemและบันทึกไว้ที่ใดที่หนึ่ง
  2. อัปเดตphp.ini- เพิ่ม curl.cainfo = "PATH_TO / cacert.pem"

มิฉะนั้นคุณจะต้องทำสิ่งต่อไปนี้สำหรับทุก ๆ cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

นอกจากนี้บทความนี้อาจมีประโยชน์


จากสิ่งที่ฉันรู้ตัวเลือกบรรทัดคำสั่ง '--cacert' (ซึ่งฉันใช้) เท่ากับการตั้งค่าตัวเลือก CURLOPT_CAINFO ใน libcurl ดังนั้นฉันจึงไม่คิดว่านี่เป็นปัญหาในกรณีของฉัน (เช่นฉัน ใช้ Linux)
Claudiu

ไม่ตรงกับคำตอบของคำถาม แต่ยังเป็นข้อมูลที่มีประโยชน์
amenthes

1

วิธีหนึ่งที่ฉันพบว่าการทำงานคล้ายกับที่คนอื่นได้เปิดเผยแล้วเท่านั้นที่จะส่งงานออกไปdev/nullและมันค่อนข้างใช้งานง่าย

curl -L -v -s https://www.google.de 1>/dev/null

# curl -L -v -s https://www.google.de 1>/dev/null
* About to connect() to www.google.de port 443 (#0)
*   Trying 216.58.208.35...
* Connected to www.google.de (216.58.208.35) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=www.google.de,O=Google LLC,L=Mountain View,ST=California,C=US
*   start date: Okt 23 16:53:00 2018 GMT
*   expire date: Jan 15 16:53:00 2019 GMT
*   common name: www.google.de
*   issuer: CN=Google Internet Authority G3,O=Google Trust Services,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.de
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 12 Nov 2018 15:36:17 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: 1P_JAR=2018-11-12-15; expires=Wed, 12-Dec-2018 15:36:17 GMT; path=/; domain=.google.de
< Set-Cookie: NID=146=4SDchvTa39-4IskdXfZpgjtm2ym5zzvHVx8g0v39Q1fiOzk26NQl1TGkFMllh_pg8bFWr6x4jG3ODYDWrkn6TXmd0Ewp4DC_N3p1NPlWqdBUfwFR_PTHIXRi8RuTxdA54w9Zr0uNyhN__5xjUdrCLZTLujNEQ2MV9EVwnmxux6o; expires=Tue, 14-May-2019 15:36:17 GMT; path=/; domain=.google.de; HttpOnly
< Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [data not shown]
* Connection #0 to host www.google.de left intact

ดูเหมือนจะไม่บอกอะไรเราเกี่ยวกับว่าใบรับรองของไซต์ถูกเพิกถอนหรือไม่ แน่นอนตามเอกสารcurlใน Unix ไม่ได้ตรวจสอบ (เว้นแต่คุณจะรวบรวมเฉพาะกับห้องสมุด SSL ซึ่งจะทำสิ่งนี้ให้คุณโดยอัตโนมัติ)
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.