कमांड लाइन से CURL का उपयोग करके https कनेक्शन


127

मैं कर्ल और कैसर्ट की दुनिया में नया हूं और सर्वर से कनेक्ट होने के दौरान समस्या का सामना कर रहा हूं। असल में, मुझे एक मशीन से दूसरी मशीन पर https पर कनेक्टिविटी का परीक्षण करने की आवश्यकता है। मेरे पास एक 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]

लेकिन वही त्रुटि मिली।


आपके द्वारा सुझाए जा रहे समाधान के बारे में निश्चित नहीं है, लेकिन मैं बस इसी तरह की जानकारी की तलाश में था और मुझे PHP यूनिटस्टेप.net
blog/

1
आप --insecureएसएसएल त्रुटि की अवहेलना भी कर सकते हैं ।
अलेक्सेज मगुरा

कर्ल के नए संस्करण (उदाहरण के लिए 7.64) RC4-SHA जैसे पुराने सिफर पहचान नहीं सकेंगे - कर्ल (7.46) के पुराने संस्करण का उपयोग में मदद मिली मुझे serverfault.com/questions/889631/...
hello_earth

जवाबों:


142

मुझे भी यही समस्या थी - मैं अपनी साइट से एक पृष्ठ ला रहा था, जिसे HTTPS पर परोसा गया था, लेकिन कर्ल वही "SSL प्रमाणपत्र समस्या" संदेश दे रहा था। मैंने -kअसुरक्षित कनेक्शन की अनुमति के लिए कॉल में एक झंडा जोड़कर इसके चारों ओर काम किया ।

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

संपादित करें: मैंने समस्या की जड़ की खोज की। मैं एक एसएसएल प्रमाणपत्र का उपयोग कर रहा था (स्टार्टएसएसएल से, लेकिन मुझे नहीं लगता कि यह ज्यादा मायने रखता है) और इंटरमीडिएट प्रमाणपत्र को ठीक से सेट नहीं किया था। यदि आपको उपर्युक्त उपयोगकर्ता 1270392 जैसी ही समस्या हो रही है, तो संभवतः अपने एसएसएल प्रमाणपत्र का परीक्षण करना और फिक्स का सहारा लेने से पहले इसके साथ किसी भी मुद्दे को ठीक करना एक अच्छा विचार है 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टीएसएल के माध्यम से एक कनेक्शन की अनुमति दे रहे हैं , हर रोज ...
ब्रेथोसल्ज

2
@Brethlosze आपकी टिप्पणी के लिए धन्यवाद। लेकिन, ऐसी बात नहीं है। सभी प्रकार के प्रमाणपत्रों से एसएसएल जानकारी प्राप्त करने के लिए बिंदु है।
एंटोनियो फेइटोसा

30

आपको कर्ल को पूरे प्रमाणपत्र श्रृंखला प्रदान करने की आवश्यकता है, क्योंकि कर्ल अब किसी भी सीए सेर्ट के साथ जहाज नहीं करता है। चूंकि cacert विकल्प केवल एक फ़ाइल का उपयोग कर सकता है, इसलिए आपको पूर्ण श्रृंखला जानकारी को 1 फ़ाइल में सम्मिलित करने की आवश्यकता है

प्रमाण पत्र श्रृंखला (अपने ब्राउज़र से, उदाहरण के लिए) को डीईआर एन्कोडेड बाइनरी x.509 (.cer) में कॉपी करें। प्रत्येक प्रमाण के लिए ऐसा करें।

CEM को PEM में कनवर्ट करें, और उन्हें 1 फ़ाइल में सम्मिलित करें।

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/use-curl-with-ssl-cert-chain.html


1
क्या आप कृपया उपयोगकर्ता नाम और पासवर्ड पारित करने के उद्देश्य की व्याख्या कर सकते हैं? क्या होगा यदि मैं एक जावा क्लाइंट लिख रहा हूं, क्या मुझे उस मामले में, GET अनुरोध के हेडर में उपयोगकर्ता नाम और पासवर्ड को पारित करने की आवश्यकता है?
शुभी २४

@ Shubhi224 नहीं अगर आपके https सर्वर को GET अनुरोधों के लिए एक साधारण प्रमाणीकरण की आवश्यकता नहीं है। मुझे प्रमाणीकरण का उपयोग करना पड़ा क्योंकि यह एक REST कॉल था जिसे इसकी आवश्यकता थी।
सोमैया कुम्बर

जैसा कि इस उत्तर में उल्लेख किया गया है "आपको कर्ल को पूरी प्रमाणपत्र श्रृंखला प्रदान करने की आवश्यकता है, क्योंकि कर्ल अब किसी भी सीए सेर्ट के साथ जहाज नहीं करता है।"
मोहम्मद बन

16

फ़ाइल --cacertनिर्दिष्ट करने के लिए उपयोग करें .crtca-root-nss.crtउदाहरण के लिए।


6

मुझे वास्तव में इस तरह की समस्या थी और मैं इसे इन चरणों द्वारा हल करता हूं:

  1. रूट CA प्रमाणपत्रों का बंडल यहां से प्राप्त करें: https://curl.haxx.se/ca/cacert.pem और स्थानीय पर सहेजें

  2. php.iniफ़ाइल ढूँढें

  3. curl.cainfoप्रमाणपत्रों का मार्ग निर्धारित करें । तो यह कुछ इस तरह होगा:

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


4

यहां आप मोज़िला सीए सेर्ट्स को डाउनलोड करने और परिवर्तित करने के निर्देशों के साथ सीए सीट्स पा सकते हैं । एक बार जब आप प्राप्त करते हैं ca-bundle.crtया cacert.pemआप उपयोग करते हैं:

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

या

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

1

इस समस्या को सम्‍मिलित करते हुए, मैं मौजूदा सिस्टम डिफॉल्ट CA फ़ाइल का उपयोग करने में सक्षम था, debian6 पर यह है:

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

जड़ के रूप में यह किया जा सकता है:

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

फिर वेब सर्वर को फिर से शुरू करें।



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

कर्ल के आधुनिक संस्करणों के साथ, आप बस उस आईपी पते को ओवरराइड कर सकते हैं जिससे कनेक्ट करने के लिए --resolve या --connect-to (कर्ल संस्करण 7.49 की तुलना में नया कर्ल) का उपयोग करें। यह एसएसएल / एसएनआई के साथ भी काम करता है। सभी विवरण मैन पेज में हैं।

उदाहरण के लिए, DNS को ओवरराइड करने के लिए और www.example.com से कनेक्ट करने के लिए ssl के साथ एक विशेष आईपी पते का उपयोग करें: (यह भी IP6 को ओवरराइड करेगा)

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

एक अन्य उदाहरण, पोर्ट 8080 पर बैकएंड 1 नामक एक विशेष बैकेंड सर्वर से कनेक्ट करने के लिए

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

होस्ट हेडर जोड़ने के लिए याद रखें यदि सर्वर को सही ढंग से जवाब देने की आवश्यकता है:

-H 'Host:www.example.com' 

मुझे यकीन नहीं है कि यह सवाल का जवाब कैसे देता है।
ब्रेथोसल्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.