Làm thế nào để sử dụng curl để xác minh nếu chứng chỉ của một trang web đã bị thu hồi?


25

Để kiểm tra xem chứng chỉ cho google.com đã bị thu hồi chưa, tôi đã thử lệnh sau:

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

, nhưng tôi đã gặp phải lỗi "vấn đề chứng chỉ SSL" đáng sợ:

* 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

Tôi đoán lỗi này là không chính xác, vì Google nên có chứng chỉ hợp lệ.

Bạn có biết làm thế nào tôi có thể ban hành một lệnh curl mà làm điều này một cách chính xác?

Thêm chi tiết

Nếu bạn đang tự hỏi tại sao tôi sử dụng các tệp cụ thể đó (GeoTrust_Global_CA.pem và gtglobal.pem) trong lệnh curl, thì đây là cách tôi tiến hành:

  • Lần đầu tiên tôi nhìn vào những gì CA đã cấp chứng chỉ cho https://www.google.com . Hóa ra đó là GeoTrust Global CA;
  • Tôi đã tải xuống chứng chỉ gốc GeoTrust Global CA từ đây (đây là tệp GeoTrust_Global_CA.pem);
  • Tôi đã tải xuống CRL tương ứng (danh sách thu hồi chứng chỉ) từ đây (đây là tệp gtglobal.pem).

Có vẻ như tôi đã làm việc? Tôi không chắc câu hỏi của bạn là gì.
mtak

1
@mtak - Xem xét việc xác minh thất bại, có vẻ như tác giả đang hỏi lý do tại sao chứng chỉ không thể xác minh, chứng chỉ cần được xác minh, xem xét chứng chỉ Google hiện tại chưa bị thu hồi.
Ramhound

Xin lỗi, tôi nhận ra rằng câu hỏi này là một chút không rõ ràng. Tôi sẽ chỉnh sửa nó. @Ramhound là chính xác :)
Claudiu

Về nguyên tắc, tôi không hiểu tại sao bạn sẽ kết nối với google.com để xác nhận xem chứng chỉ (mà bạn đã nhận được trong khi bắt tay TLS) có hay không trên CRL (mà bạn đã tải xuống). Bạn không nên làm điều đó trên máy tính của riêng bạn? Điều gì xảy ra nếu google.com thực sự là một MITM?
Craig Hicks

Dưới đây là một ví dụ về kiểm tra thủ công nếu một chứng chỉ. là trên CRL một khi cả hai chứng chỉ. và CRL là trong bộ nhớ địa phương --- feistyduck.com/library/openssl%2dcookbook/online/...
Craig Hicks

Câu trả lời:


12

Đó 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

10

Rõ ràng, bạn không thể chỉ xác minh một trang web với một yêu cầu đơn giản. Xem /programming/16244084/how-to-programmatically-check-if-a-certert-has-been-revoking?lq=1 và các câu hỏi liên quan cũ hơn về stackoverflow.

curl không hoạt động với Danh sách thu hồi chứng chỉ cho tôi, cả trên Windows và Linux. Tại sao bạn nên sử dụng curl ? Openssl có vẻ phù hợp hơn:

openssl s_client -connect www.google.com:443

Chúng tôi nhận được

---
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
---

Sau đó chúng ta có thể kiểm tra một số chứng chỉ:

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

grep crltrong đầu ra của lệnh trên. Các phần thú vị là:

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

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

Bây giờ chúng ta có thể tự kiểm tra 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

Bây giờ chúng ta thấy một danh sách các chứng chỉ bị thu hồi. IMHO, sử dụng curl là không đủ, một chương trình khác được yêu cầu để kiểm tra chứng chỉ. Bằng cách làm đơn giản

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

chúng tôi thấy rằng curl không kiểm tra hủy bỏ (thậm chí không kết nối với những nơi có liên quan). Nó chỉ nói

* 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
Tại sao bạn nói curl không thể làm điều này? Trang quản lý curl chỉ định tùy chọn '--crlfile' tồn tại chính xác cho mục đích này. Ngoài ra, curl được biên dịch với openssl và sử dụng nó cho các hoạt động liên quan đến tiền điện tử của nó (bao gồm cả chứng chỉ) - nó chỉ không hoạt động đối với tôi, cố gắng tìm hiểu lý do tại sao :)
Claudiu

3

Rõ ràng đây là một vấn đề khá phổ biến trên Windows, vì câu hỏi này trên stackoverflow cho thấy . Tôi đặc biệt đề cập đến câu trả lời của người dùng рррррррррр

Đây là một vấn đề khá phổ biến trong Windows. Bạn chỉ cần thiết lập cacert.pemđể curl.cainfo.

Vì PHP 5.3.7 bạn có thể làm:

  1. tải về http://curl.haxx.se/ca/cacert.pem và lưu nó ở đâu đó.
  2. cập nhật php.ini- thêm curl.cainfo = "PATH_TO / cacert.pem"

Nếu không, bạn sẽ cần phải làm như sau cho mọi tài nguyên cURL:

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

Ngoài ra, bài viết này cũng có thể hữu ích.


Từ những gì tôi biết, tùy chọn dòng lệnh '--cacert' (mà tôi đã sử dụng) tương đương với việc đặt tùy chọn CURLOPT_CAINFO trong libcurl, vì vậy tôi không nghĩ đây là vấn đề trong trường hợp của tôi (tôi cũng vậy sử dụng Linux)
Claudiu

Không chính xác câu trả lời cho câu hỏi, thông tin vẫn rất hữu ích!
amenthes

1

Một cách tôi thấy làm việc tương tự như những cách khác đã được đưa ra, chỉ có điều nó gửi đầu ra đến dev/nullvà nó tương đối nhanh để sử dụng.

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

Điều này dường như không cho chúng tôi biết bất cứ điều gì về việc liệu chứng chỉ của trang web đã bị thu hồi. Thật vậy, theo tài liệu, curltrên Unix không kiểm tra (trừ khi bạn biên dịch cụ thể nó với thư viện SSL tự động thực hiện việc này cho bạn).
tripleee
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.