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 Global CA로 밝혀졌습니다.
  • 여기 에서 GeoTrust Global CA 루트 인증서를 다운로드했습니다 (GeoTrust_Global_CA.pem 파일).
  • 여기 에서 해당 CRL (인증서 해지 목록)을 다운로드했습니다 ( gtglobal.pem 파일).

이미 작동하는 것 같습니다. 귀하의 질문이 무엇인지 잘 모르겠습니다.
mtak

1
@mtak-확인 실패를 고려하면 작성자가 인증서 확인에 실패한 이유를 묻는 것 같습니다. 현재 Google 인증서가 해지되지 않은 것을 고려하여 인증서를 확인해야합니다.
Ramhound

죄송합니다. 이제 질문이 다소 불분명하다는 것을 알고 있습니다. 편집하겠습니다. @Ramhound 맞습니다 :)
Claudiu

원칙적으로 TLS 핸드 셰이크 중에받은 인증서가 CRL (이미 다운로드 한)에 있는지 확인 하기 위해 google.com 에 연결하는 이유를 이해하지 못합니다 . 자신의 컴퓨터에서 그렇게하지 않아야합니까? 어떤 경우 google.com이 실제로 MITM했다?
크레이그

다음은 인증서가 있는지 수동으로 확인하는 예입니다. 두 인증서 모두 CRL에 있습니다. CRL은 로컬 메모리에 있습니다 --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

답변:


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 모두에서 Certificate Revocation Lists 와 함께 작동하지 않았습니다 . 왜 을 사용해야 합니까? 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

이제 해지 된 인증서 목록이 나타납니다. IMHO, 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

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

질문에 대한 답은 아니지만 여전히 유용한 정보입니다!
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 라이브러리로 특별히 컴파일하지 않는 한).
트리플 리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.