如何使用curl来验证站点的证书是否已被吊销?


26

要检查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 GlobalCA。
  • 我从这里下载了GeoTrust Global CA根证书(这是GeoTrust_Global_CA.pem文件)。
  • 我从此处(这是gtglobal.pem文件)下载了相应的CRL(证书吊销列表)。

在我看来已经可行了?我不确定您的问题是什么。
mtak 2014年

1
@mtak-考虑到验证失败,看来作者正在询问证书未能验证的原因,考虑到当前的Google证书尚未撤消,因此应该已经验证了证书。
Ramhound

抱歉,我现在知道问题还不清楚。我将对其进行编辑。@Ramhound是正确的:)
Claudiu

我原则上不理解为什么您要连接到google.com来确认CRL(您已经下载了)上是否存在证书(在TLS握手过程中已经收到了)。您不应该在自己的计算机上这样做吗?如果google.com实际上是MITM怎么办?
Craig Hicks

这是手动检查证书的示例。既是证书又是CRL。和CRL是在本地内存--- feistyduck.com/library/openssl%2dcookbook/online/...
克雷格·希克斯

Answers:


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的较早的相关问题。

在Windows或Linux上,curl都不适用于证书吊销列表。为什么要使用curlOpenSSL似乎更合适:

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.

2
为什么说curl无法做到这一点?curl联机帮助页指定了专门用于此目的的'--crlfile'选项。另外,curl是使用openssl编译的,并将其用于与密码有关的操作(包括证书)-它对我不起作用,试图找出原因:)
Claudiu 2014年

3

显然,这是Windows上的一个非常普遍的问题,如stackoverflow上的问题所示。我专门指的是АртурКурицын用户的答案,为方便起见,在此引用:

在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 2014年

不完全是问题的答案,还是非常有用的信息!
amenthes

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库专门对其进行编译,该库会自动为您执行此操作)。
tripleee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.