명령 줄에서 CURL을 사용한 https 연결


127

저는 Curl 및 Cacerts 세계를 처음 접했고 서버에 연결하는 동안 문제에 직면했습니다. 기본적으로 한 시스템에서 다른 시스템으로 https를 통한 연결을 테스트해야합니다. 머신 A (리눅스 머신)에서 연결해야하는 URL이 있습니다. 명령 프롬프트에서 시도했습니다.

cmd> curl https://[my domain or IP address]

다음을 얻었습니다.

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

인터넷을 통해 몇 가지 기사를 살펴보면서 이렇게했습니다.

openssl s_client -connect <domain name or Ip address>:443

서버 인증서 (내부 -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----)를 포함하여 일부 응답을 받았습니다 .

여기에서 다음에 무엇을해야합니까. 텍스트를 복사하여 붙여넣고 BEGIN CERTIFICATE & END CERTIFICATE파일에 저장해야 한다고 생각 합니다. 그러나 어떤 유형의 파일이어야합니까? .pem, .crt? .. 그 후에는 어떻게해야합니까?

나는 이것을 시도했다-내부에 텍스트를 복사하고 파일에 BEGIN CERTIFICATE & END CERTIFICATE저장했다 .crt-이름을 my-ca.crt( my-ca.pem파일 로 이름을 지정하여 동일한 것을 시도 함 ) 그런 다음 다음을 수행했습니다.

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

그러나 같은 오류가 발생했습니다.


당신이 제안하는 솔루션에 대해 잘 모르겠지만 비슷한 정보를 찾고 있었는데
MauroPerez

1
--insecureSSL 오류를 무시하도록 추가 할 수도 있습니다 .
Alexej Magura

(7.46) 컬의 이전 버전을 사용 내게 도움이 - 컬의 최신 버전 (예 : 7.64)는 RC4-SHA 같은 오래된 암호를 인식하지 것이다 serverfault.com/questions/889631/...
hello_earth

답변:


142

같은 문제가있었습니다. HTTPS를 통해 제공되는 내 사이트에서 페이지를 가져 왔지만 curl은 동일한 "SSL 인증서 문제"메시지를 표시했습니다. -k안전하지 않은 연결을 허용하기 위해 호출에 플래그를 추가하여 문제를 해결했습니다 .

curl -k https://whatever.com/script.php

편집 : 문제의 근원을 발견했습니다. 저는 SSL 인증서 (StartSSL의 인증서를 사용했지만 그다지 중요하지 않다고 생각합니다)를 사용하고 있었고 중간 인증서를 제대로 설정하지 않았습니다. 위의 user1270392와 동일한 문제가있는 경우 SSL 인증서테스트 하고 문제를 해결하기 전에 문제를 해결 하는 것이 좋습니다 curl -k.


5
-k 플래그는 좋은 지름길입니다. 나를 위해 일했습니다!
tidydee

45

간단한 솔루션

그것이 내 일상 스크립트입니다.

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

11
따라서, 당신은 허용하고 --insecure... TSL, 일상을 통해 연결
Brethlosze

2
@Brethlosze 귀하의 의견에 감사드립니다. 그러나 그것은 사실이 아닙니다. 요점은 모든 종류의 인증서에서 SSL 정보를 얻는 것입니다.
Antonio Feitosa

30

curl은 더 이상 CA 인증서와 함께 제공되지 않으므로 curl에 전체 인증서 체인을 제공해야합니다. cacert 옵션은 하나의 파일 만 사용할 수 있으므로 전체 체인 정보를 하나의 파일로 연결해야합니다.

인증서 체인 (예 : 브라우저에서)을 DER로 인코딩 된 바이너리 x.509 (.cer)로 복사합니다. 각 인증서에 대해이 작업을 수행하십시오.

인증서를 PEM으로 변환하고 하나의 파일로 연결합니다.

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

이 작업을 수행하는 방법에 대한 블로그를 여기에 썼습니다 : http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html


1
userName과 Password를 전달하는 목적을 설명해 주시겠습니까? Java 클라이언트를 작성하는 경우 GET 요청 헤더에 userName 및 비밀번호를 전달해야합니까?
Shubhi224

https 서버에 GET 요청에 대한 간단한 인증이 필요하지 않은 경우 @ Shubhi224가 아닙니다. 인증이 필요한 REST 호출이기 때문에 인증을 사용해야했습니다.
Somaiah Kumbera

이 답변에서 언급했듯이 "컬은 더 이상 CA 인증서와 함께 제공되지 않으므로 전체 인증서 체인을 curl에 제공해야합니다."
Mohamed Bana

16

사용 --cacert지정 .crt파일을. ca-root-nss.crt예를 들면.


6

나는 실제로 이런 종류의 문제가 있었고 다음 단계로 해결했습니다.

  1. https://curl.haxx.se/ca/cacert.pem 에서 루트 CA 인증서 번들을 가져 와서 로컬에 저장합니다.

  2. php.ini파일 찾기

  3. curl.cainfo인증서의 경로로 설정하십시오 . 따라서 다음과 같습니다.

curl.cainfo = /path/of/the/keys/cacert.pem



1

debian6에서 기존 시스템 기본 CA 파일을 사용할 수 있었던 문제를 진단 한 후 이것은 다음과 같습니다.

/etc/ssl/certs/ca-certificates.crt

루트로서 다음과 같이 할 수 있습니다.

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

그런 다음 웹 서버를 다시 시작하십시오.


1

당신은 이것을 사용할 수 있습니다

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);


0

저에게는 자동 http-> https 리디렉션이있는 웹 사이트를 테스트하고 싶었습니다. 이미 일부 인증서가 설치되어 있다고 생각하므로 Ubuntu 16.04 실행에서 나에게만 작동합니다.curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>


-3

최신 버전의 curl에서는 --resolve 또는 --connect-to (버전 7.49보다 최신 버전의 curl)를 사용하여 연결할 IP 주소를 간단히 재정의 할 수 있습니다. 이것은 SSL / SNI에서도 작동합니다. 모든 세부 사항은 man 페이지에 있습니다.

예를 들어 DNS를 재정의하고 특정 IP 주소를 사용하여 SSL을 사용하여 www.example.com에 연결하려면 : (IPv6도 재정의 함)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

또 다른 예는 포트 8080에서 backend1이라는 특정 백엔드 서버에 연결하는 것입니다.

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

서버가 올바르게 응답해야하는 경우 호스트 헤더를 추가해야합니다.

-H 'Host:www.example.com' 

이것이 질문에 어떻게 대답하는지 잘 모르겠습니다.
Brethlosze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.