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)を使用した理由を知りたくない場合は、次のように進めました。
それが私の毎日のスクリプトです。
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
どうやら、単一の単純なリクエストだけでサイトを検証することはできません。 https://stackoverflow.com/questions/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 と、stackoverflowの古い関連質問を参照してください。
windowsでもLinuxでも、curlはCertificate Revocation Listsでは機能しませんでした。 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
失効した証明書のリストが表示されます。私見、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.
どうやらこれは stackoverflowに関するこの質問が示す のように、Windowsではかなり一般的な問題です。私はユーザーАртурКурицынによる回答を具体的に参照しています。
これはWindowsでかなり一般的な問題です。
cacert.pem
をcurl.cainfo
に設定するだけです。PHP 5.3.7なので、次のことができます:
- ダウンロード http://curl.haxx.se/ca/cacert.pem をダウンロードして、どこかに保存します。
- update
php.ini
-curl.cainfo = "PATH_TO/cacert.pem"を追加しますそれ以外の場合は、cURLリソースごとに以下を実行する必要があります。
curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
また、 この記事 も役立つかもしれません。
私が機能していることを発見した方法の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
7.41.0以降のカールには--cert-status
オプションですが、私には機能しません。
$ curl --cert-status https://www.google.com
curl: (91) No OCSP response received
サーバーがOCSPステープルで構成されている場合にのみ機能し、curlが独自のOCSPリクエストを作成しないようです。
私は https://raymii.org/s/articles/OpenSSL_Manually_Verify_a_certificate_against_an_OCSP.html の手順でopensslを使用してより成功しました
証明書を取得します。
$ openssl s_client -connect www.google.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > /tmp/google.pem
証明書のOCSP URIを出力します。
$ openssl x509 -noout -ocsp_uri -in /tmp/google.pem
http://ocsp.pki.goog/gts1o1
次のようにして、certs 1-n出力から/tmp/chain.pemを構築します。
openssl s_client -connect www.google.com:443 -showcerts 2>&1 < /dev/null
各証明書を、----- BEGIN CERTIFICATE -----および----- END CERTIFICATE -----とその間のすべてを含むchain.pemファイルにコピーします。 0番目の証明書はgoogle.pemファイルにあるため、含めないでください。
OCSPリクエストを作成します。
openssl ocsp -issuer /tmp/chain.pem -cert /tmp/google.pem -text -url http://ocsp.pki.goog/gts1o1
...
Response verify OK
/tmp/google.pem: good
This Update: Mar 24 12:40:59 2020 GMT
Next Update: Mar 31 12:40:59 2020 GMT