명령 줄에서 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
예를 들면.
나는 실제로 이런 종류의 문제가 있었고 다음 단계로 해결했습니다.
https://curl.haxx.se/ca/cacert.pem 에서 루트 CA 인증서 번들을 가져 와서 로컬에 저장합니다.
php.ini
파일 찾기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
'Programming' 카테고리의 다른 글
Execute Shell은 Jenkins에서 빌드를 실패로 표시하는 방법 /시기는 무엇입니까? (0) | 2020.08.09 |
---|---|
JAR 파일 내의 파일을 나열하는 방법은 무엇입니까? (0) | 2020.08.09 |
값이 JavaScript 또는 jQuery의 숫자인지 확인 (0) | 2020.08.09 |
제목 표시 줄에 전체 디렉토리 경로를 표시하도록 OS X에서 Sublime Text 구성 (0) | 2020.08.09 |
이러한 JavaScript 코드 조각이 둘 다 오류가 발생하더라도 다르게 작동하는 이유는 무엇입니까? (0) | 2020.08.09 |