bagaimana cara menggunakan curl untuk memverifikasi jika sertifikat situs telah dicabut?

26

Untuk memeriksa apakah sertifikat untuk google.com telah dicabut, saya mencoba perintah berikut:

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

, tapi saya mendapat kesalahan "masalah sertifikat SSL" yang ditakuti:

* 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

Saya kira kesalahan ini tidak benar, karena Google harus memiliki sertifikat yang valid.

Apakah Anda tahu bagaimana saya bisa mengeluarkan perintah ikal yang melakukan ini dengan benar?

Keterangan lebih lanjut

Jika Anda bertanya-tanya mengapa saya menggunakan file-file spesifik (GeoTrust_Global_CA.pem dan gtglobal.pem) dalam perintah curl, ini adalah bagaimana saya melanjutkan:

  • Saya pertama kali melihat pada apa CA mengeluarkan sertifikat untuk https://www.google.com . Ternyata itu adalah GeoTrust Global CA;
  • Saya mengunduh sertifikat root GeoTrust Global CA dari sini (ini adalah file GeoTrust_Global_CA.pem);
  • Saya mengunduh CRL (daftar pencabutan sertifikat) yang sesuai dari sini (ini adalah file gtglobal.pem).
Claudiu
sumber
Sepertinya saya sudah bekerja? Saya tidak yakin apa pertanyaan Anda.
mtak
1
@mtak - Menimbang verifikasi gagal, sepertinya penulis menanyakan alasan mengapa sertifikat gagal memverifikasi, sertifikat harus diverifikasi, mengingat sertifikat Google saat ini belum dicabut.
Ramhound
Maaf, saya menyadari sekarang bahwa pertanyaannya agak tidak jelas. Saya akan mengeditnya. @Ramhound itu benar :)
Claudiu
Saya pada prinsipnya tidak mengerti mengapa Anda akan terhubung ke google.com untuk mengkonfirmasi apakah sertifikat (yang sudah Anda terima selama jabat tangan TLS) ada atau tidak pada CRL (yang sudah Anda unduh). Bukankah seharusnya Anda melakukannya di komputer Anda sendiri? Bagaimana jika google.com sebenarnya adalah MITM?
Craig Hicks
Berikut adalah contoh memeriksa secara manual apakah sertifikat. ada di CRL setelah kedua sertifikat. dan CRL ada di memori lokal --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

Jawaban:

12

Itu naskah saya sehari-hari:

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
Antonio Feitosa
sumber
10

Rupanya, Anda tidak bisa hanya memverifikasi situs dengan satu permintaan sederhana. Lihat /programming/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 dan pertanyaan terkait sebelumnya tentang stackoverflow.

curl tidak bekerja dengan Daftar Pencabutan Sertifikat untuk saya, baik di Windows, maupun di Linux. Kenapa kamu harus menggunakan curl ? Tampaknya Opensl lebih tepat:

openssl s_client -connect www.google.com:443

Kita mendapatkan

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

Kemudian kita dapat memeriksa beberapa sertifikat:

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

grep crldalam output dari perintah di atas. Bagian yang menarik adalah:

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

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

Sekarang kita dapat memeriksa crl secara manual:

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

Sekarang kita melihat daftar sertifikat yang dicabut. IMHO, menggunakan curl tidak cukup, program lain diperlukan untuk memeriksa sertifikat. Dengan melakukan yang sederhana

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

kita melihat bahwa curl tidak memeriksa pencabutan (bahkan tidak terhubung ke tempat-tempat yang relevan). Itu hanya mengatakan

* 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.
MKaama
sumber
2
Kenapa kamu bilang curl tidak bisa melakukan ini? Manual curl menentukan opsi '--crlfile' yang ada persis untuk tujuan ini. Juga, curl dikompilasi dengan openssl dan menggunakannya untuk operasi terkait crypto-nya (termasuk sertifikat) - itu hanya tidak berfungsi untuk saya, mencoba mencari tahu mengapa :)
Claudiu
3

Tampaknya ini adalah masalah yang cukup umum pada Windows, seperti yang ditunjukkan oleh pertanyaan tentang stackoverflow ini . Saya secara khusus merujuk pada jawaban oleh pengguna Артур Курицын, yang saya kutip di sini untuk kenyamanan Anda:

Ini masalah yang cukup umum di Windows. Anda perlu hanya untuk set cacert.pemke curl.cainfo.

Karena PHP 5.3.7 dapat Anda lakukan:

  1. unduh http://curl.haxx.se/ca/cacert.pem dan simpan di suatu tempat.
  2. perbarui php.ini- tambahkan curl.cainfo = "PATH_TO / cacert.pem"

Jika tidak, Anda harus melakukan yang berikut untuk setiap sumber daya CURL:

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

Juga, artikel ini mungkin juga bermanfaat.

pengguna1301428
sumber
Dari yang saya tahu, opsi baris perintah '--cacert' (yang saya gunakan) adalah setara dengan pengaturan opsi CURLOPT_CAINFO di libcurl, jadi saya tidak berpikir ini adalah masalah dalam kasus saya (juga, saya menggunakan Linux)
Claudiu
Bukan jawaban untuk pertanyaan itu, masih informasi yang sangat berguna!
amenthes
1

Salah satu cara yang saya temukan bekerja mirip dengan yang lain yang sudah terpapar, hanya mengirimkan hasilnya dev/nulldan relatif cepat digunakan.

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
Pierfrancesco PierQR Aiello
sumber
Tampaknya ini tidak memberi tahu kami apa-apa tentang apakah sertifikat situs telah dicabut. Memang, sesuai dokumentasi, curlpada Unix tidak memeriksa (kecuali jika Anda secara khusus mengompilasinya dengan perpustakaan SSL yang secara otomatis melakukan ini untuk Anda).
tripleee