サイトの証明書が取り消されているかどうかを確認するためにcurlを使用する方法は?


25

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コマンドを発行する方法を知っていますか?

詳細

curlコマンドでこれらの特定のファイル(GeoTrust_Global_CA.pemおよびgtglobal.pem)を使用した理由がわからない場合は、次の手順を実行します。

  • 最初に、CAがhttps://www.google.comの証明書を発行したものを見ました。GeoTrust Global CAであることがわかりました。
  • ここからGeoTrust Global CAルート証明書をダウンロードしました(これはGeoTrust_Global_CA.pemファイルです)。
  • ここから対応するCRL(証明書失効リスト)をダウンロードしました(これはgtglobal.pemファイルです)。

すでに機能しているように思えますか?あなたの質問が何なのか分かりません。
mtak 14

1
@mtak-検証が失敗したことを考えると、作成者が証明書の検証に失敗した理由を尋ねているようです。現在のGoogle証明書が取り消されていないことを考慮して、証明書を検証する必要があります。
ラムハウンド14

申し訳ありませんが、私は今、質問が少し不明瞭であることを理解しています。編集します。@Ramhoundは正しいです:)
Claudiu 14

証明書(TLSハンドシェイク中に既に受け取ったもの)がCRL(ダウンロード済みのもの)に存在するかどうかを確認するためにgoogle.comに接続する理由を原則として理解していません。自分のコンピューターでそれをしてはいけませんか?google.comが実際にMITMだった場合はどうなりますか?
クレイグヒックス

以下は、証明書が手動であるかどうかを手動で確認する例です。両方の証明書がCRL上にある。そして、CRLは---ローカルメモリ内にあるfeistyduck.com/library/openssl%2dcookbook/online/...
クレイグ・ヒックス

回答:


12

それが私の日常のスクリプトです:

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

出力:

* 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でも、証明書失効リストでは機能しませんでした。なぜcurlを使用する必要があるのですか?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

これで、失効した証明書のリストが表示されます。私見、カールを使用して十分ではありません、証明書を確認するために別のプログラムが必要です。簡単に

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でこれができないと言うのはなぜですか?curlのマンページでは、この目的のために正確に存在する「--crlfile」オプションを指定しています。また、curlはopensslでコンパイルされ、暗号関連の操作(証明書を含む)に使用されます
Claudiu 14

3

どうやらこれはstackoverflowに関するこの質問が示すように、Windowsではかなり一般的な問題です。具体的には、ユーザーАртурКурицынによる回答を参照しています。

これは、Windowsでよくある問題です。あなたは必要なだけのセットに cacert.pemしますcurl.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」(私が使用した)はlibcurlのCURLOPT_CAINFOオプションを設定するのと同等ですので、これは私の場合の問題ではないと思います(また、私はLinuxを使用)
Claudiu 14

質問に対する正確な答えではありませんが、依然として非常に有用な情報です!
amenthes

1

私が見つけた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ライブラリで具体的にコンパイルしない限り)。
トリプリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.