Programming

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

procodes 2020. 8. 9. 10:29
반응형

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


저는 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]

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


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

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

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


간단한 솔루션

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

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

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


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


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

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

  2. php.ini파일 찾기

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

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


여기에서 Mozilla CA 인증서를 다운로드하고 변환하는 지침이있는 CA 인증서를 찾을 수 있습니다. 일단 얻 ca-bundle.crt거나 cacert.pem사용하면 :

curl.exe --cacert cacert.pem https://www.google.com

또는

curl.exe --cacert ca-bundle.crt https://www.google.com

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

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

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

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

then re-start the web-server.


you could use this

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


For me, I just wanted to test a website that had an automatic http->https redirect. I think I had some certs installed already, so this alone works for me on Ubuntu 16.04 running 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>


With modern versions of curl, you can simply override which ip-address to connect to, using --resolve or --connect-to (curl newer than version 7.49). This works even with SSL/SNI. All details are in the man page.

For example, to override DNS and connect to www.example.com with ssl using a particular ip address: (This will also override ipv6)

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

Another example, to connect to a particular backend server named backend1 on port 8080

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

Remember to add the host header if the server needs that to answer correctly:

-H 'Host:www.example.com' 

참고URL : https://stackoverflow.com/questions/10079707/https-connection-using-curl-from-command-line

반응형