bir sitenin sertifikasının iptal edilip edilmediğini doğrulamak için curl nasıl kullanılır?


26

Google.com sertifikasının iptal edilip edilmediğini kontrol etmek için aşağıdaki komutu denedim:

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

, ancak korkunç "SSL sertifika sorunu" hatası aldım:

* 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'ın geçerli bir sertifikası olması gerektiği için bu hatanın doğru olmadığını düşünüyorum.

Bunu doğru yapan bir kıvırma komutunu nasıl verebileceğimi biliyor musunuz?

Daha fazla detay

Neden curl komutunda bu belirli dosyaları (GeoTrust_Global_CA.pem ve gtglobal.pem) kullandığımı merak ediyorsanız, işte böyle devam ettim:

  • İlk olarak CA'nın https://www.google.com için sertifikayı ne verdiğine baktım . GeoTrust Global CA olduğu ortaya çıktı;
  • GeoTrust Global CA kök sertifikasını buradan indirdim (GeoTrust_Global_CA.pem dosyası);
  • İlgili CRL'yi (sertifika iptal listesi) buradan indirdim (bu gtglobal.pem dosyası).

Bana zaten çalışıyormuş gibi geliyor mu? Sorunun ne olduğundan emin değilim.
mtak

1
@mtak - Doğrulamanın başarısız olduğu düşünüldüğünde, yazarın sertifikanın neden doğrulanamasının nedenini sorduğu anlaşılıyor, geçerli Google sertifikasının iptal edilmediği göz önüne alındığında sertifikanın doğrulanmış olması gerekiyor.
Ramhound

Üzgünüm, şimdi sorunun biraz belirsiz olduğunu anlıyorum. Ben düzenleyeceğim. @Ramhound doğru olan :)
Claudiu

Prensip olarak, bir sertifikanın (TLS anlaşması sırasında zaten aldığınız) bir CRL'de (zaten indirmiş olduğunuz) mevcut olup olmadığını doğrulamak için neden google.com'a bağlanacağınızı anlamıyorum . Bunu kendi bilgisayarınızda yapmamalı mısınız? Google.com aslında bir MITM olsaydı ne olurdu ?
Craig Hicks

İşte bir sertifika olup olmadığını elle kontrol etmek için bir örnek. her iki sertifikada da bir CRL üzerindedir. ve CRL yerel bellektedir --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

Yanıtlar:


12

Bu benim günlük senaryom:

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

Çıkışı:

* 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

Görünüşe göre, sadece tek bir basit istekle bir siteyi doğrulayamazsınız. Yığın akışı hakkında /programming/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 ve daha eski ilgili sorulara bakın .

curl , ne Windows'ta ne de Linux'ta benim için Sertifika İptal Listeleri ile çalışmadı . Neden kıvrılmayı kullanmalısınız ? Openssl daha uygun görünüyor:

openssl s_client -connect www.google.com:443

Biz olsun

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

Sonra bazı sertifikaları inceleyebiliriz:

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

grep crlYukarıdaki komutun çıktısında. İlginç kısımlar:

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

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

Şimdi crl'yi manuel olarak inceleyebiliriz:

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

Şimdi iptal edilmiş sertifikaların bir listesini görüyoruz. IMHO, curl kullanmak yeterli değil, sertifikaları kontrol etmek için başka bir program gerekiyor. Basit yaparak

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

kıvrımın iptalleri kontrol etmediğini (ilgili yerlere bile bağlanmadığını) görüyoruz. Sadece diyor

* 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
Neden curl'un bunu yapamayacağını söylüyorsun? Curl manpage, tam olarak bu amaç için var olan '--crlfile' seçeneğini belirtir. Ayrıca, curl openssl ile derlenir ve kriptoyla ilgili işlemleri (sertifikalar dahil) için kullanır - sadece benim için çalışmıyor, nedenini bulmaya çalışıyor :)
Claudiu

3

Görünüşe göre bu, stackoverflow'daki bu sorunun gösterdiği gibi Windows'ta oldukça yaygın bir sorundur . Ben özellikle burada size kolaylık sağlamak için teklif kullanıcı Артур Курицын yanıtı atıfta bulunuyorum:

Windows'da oldukça yaygın bir sorundur. Sadece ayarlamanız cacert.pemgerekir curl.cainfo.

PHP 5.3.7'den beri şunları yapabilirsiniz:

  1. http://curl.haxx.se/ca/cacert.pem dosyasını indirin ve bir yere kaydedin.
  2. güncelleme php.ini- curl.cainfo = "PATH_TO / cacert.pem" ekle

Aksi takdirde, her cURL kaynağı için aşağıdakileri yapmanız gerekir:

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

Ayrıca, bu makale de yararlı olabilir.


Bildiğim kadarıyla, komut satırı seçeneği '--cacert' (kullandığım) libcurl'de CURLOPT_CAINFO seçeneğini ayarlama eşdeğeridir, bu yüzden bu benim durumumda sorun olduğunu düşünmüyorum (ayrıca, ben Linux kullanarak)
Claudiu

Sorunun cevabı tam olarak değil, hala çok yararlı bilgiler!
amenthes

1

Çalıştığını bulduğum bir yol, zaten maruz kalanlara benzer, sadece çıktıyı gönderir ve dev/nullkullanımı nispeten hızlıdır.

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

Bu bize sitenin sertifikasının iptal edilip edilmediğiyle ilgili hiçbir şey söylemiyor gibi görünüyor. Gerçekten de, belgelere göre, curlUnix'te kontrol etmez (bunu sizin için otomatik olarak yapan bir SSL kütüphanesiyle derlemediğiniz sürece).
üçlü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.