CURL (51) SSL त्रुटि को ठीक करें: कोई वैकल्पिक प्रमाणपत्र विषय नाम से मेल नहीं खाता


86

मैं CURL दुनिया में नया हूं, विंडोज + .NET डोमेन से आ रहा हूं।

मूल प्रमाणीकरण के लिए रेस्ट एपीआई को http://www.evercam.io/docs/api/v1/authentication पर एक्सेस करने की कोशिश कर रहा है ।

curl -X GET https://api.evercam.io/v1/... \
-u {username}

सफलतापूर्वक CURL सेटअप होने के बाद विंडोज़ कमांड प्रॉम्प्ट पर इस कमांड का उपयोग करने का तरीका न जानें। CURL का परीक्षण निम्नानुसार है:

C:\>curl --version
curl 7.33.0 (x86_64-pc-win32) libcurl/7.33.0 OpenSSL/0.9.8y zlib/1.2.8 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp s
ftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate Largefile NTLM SSL SSPI libz

अब मैं इसके साथ समाप्त कर रहा हूं

C:\>curl -u myuser:mypassword -X GET https://api.evercam.io/v1/
curl: (51) SSL: no alternative certificate subject name matches target host name 'api.evercam.io'

मैं इस एसएसएल 51 त्रुटि को कैसे ठीक कर सकता हूं?

जवाबों:


112

यह आमतौर पर तब होता है जब प्रमाणपत्र होस्ट नाम के साथ मेल नहीं खाता है।

इसका समाधान मेजबान से संपर्क करना होगा और इसे अपने प्रमाण पत्र को ठीक करने के लिए कहना होगा।
अन्यथा आप प्रमाणपत्र के cURL सत्यापन को बंद कर सकते हैं, -k(या --insecure) विकल्प का उपयोग कर सकते हैं ।
कृपया ध्यान दें कि जैसा कि विकल्प ने कहा, यह असुरक्षित है । आपको इस विकल्प का उपयोग नहीं करना चाहिए क्योंकि यह मानव-में-मध्य हमलों की अनुमति देता है और HTTPS के उद्देश्य को पराजित करता है।

यहाँ और अधिक जानकारी प्राप्त की जा सकती है: http://curl.haxx.se/docs/sslcerts.html


10
चेक बंद करने के लिए कहने वाले उत्तर, यह भी उजागर करना चाहिए कि परिणाम क्या हैं। यह खतरनाक है!
DrP3pp3r

1
मुझे लगा कि प्रमाणपत्र पर विषय का नाम था *.my-domain.comजो लागू नहीं हुआ था dev.subdomain.my-domain.com। लेकिन के लिए ठीक काम करता है dev-subdomain.my-domain.com। तो कई उप-डोमेन काम करने के लिए शायद आपको इस लेख की आवश्यकता है - sslshopper.com/…
प्रयागपाद

76

संपादक का ध्यान दें: यह एक बहुत ही खतरनाक दृष्टिकोण है, यदि आप इसे उपयोग करने के लिए PHP के पुराने संस्करण का उपयोग कर रहे हैं। यह आपके कोड को मैन-इन-द-बीच हमलों को खोलता है और एक एन्क्रिप्टेड कनेक्शन के प्राथमिक उद्देश्यों में से एक को हटा देता है। ऐसा करने की क्षमता को PHP के आधुनिक संस्करणों से हटा दिया गया है क्योंकि यह इतना खतरनाक है। इसका एकमात्र कारण 70 बार अपवित्र किया गया है क्योंकि लोग आलसी हैं। यह मत करो।


मुझे पता है कि यह एक (बहुत) पुराना सवाल है और यह कमांड लाइन के बारे में है, लेकिन जब मैंने Google को "SSL: कोई वैकल्पिक प्रमाणपत्र विषय नाम लक्ष्य होस्ट नाम से मेल खाता है" के लिए खोज की, तो यह पहली हिट थी।

मुझे उत्तर का पता लगाने में अच्छा समय लगा, इसलिए आशा है कि यह किसी को बहुत समय बचाता है! PHP में इसे अपने cUrl सेटटॉप्स में जोड़ें:

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

पीएस: यह एक अस्थायी समाधान होना चाहिए। चूँकि यह एक प्रमाणपत्र त्रुटि है, इसलिए सबसे अच्छी बात यह है कि प्रमाण पत्र निश्चित होना चाहिए!


30
खैर, यह मेरी Google खोज में समस्या के लिए आया था जो मुझे PHP में हो रही थी, इसलिए यह मेरे लिए मददगार थी।
गुजराती

1
मैंने वही खोज की और मुझे खुशी है कि आपका जवाब यहाँ है। धन्यवाद!
CptMisery

2
CURLOPT_SSL_VERIFYHOSTमेरे मामले में पर्याप्त था
1234

यदि आपके प्रमाणपत्र अभी तक प्रमाणित नहीं हुए हैं, तो परीक्षण के प्रयोजनों के लिए धन्यवाद।
एंड्रयू

20

के लिए प्रमाणपत्र में सामान्य नाम api.evercam.ioहै *.herokuapp.comऔर प्रमाणपत्र में कोई वैकल्पिक विषय नाम नहीं हैं। इसका मतलब है, कि प्रमाणपत्र api.evercam.ioहोस्टनाम से मेल नहीं खाता है और इसलिए प्रमाणपत्र सत्यापन विफल हो जाता है। के लिए सच के रूप में ही www.evercam.io, उदाहरण के लिए एक ब्राउज़र के साथ https://www.evercam.io का प्रयास करें और आपको त्रुटि संदेश मिलता है, कि प्रमाणपत्र में नाम होस्टनाम से मेल नहीं खाता है।

तो यह एक समस्या है, जिसे evercam.io द्वारा तय किया जाना चाहिए। यदि आप सुरक्षा, मानव-मध्य हमलों आदि के बारे में परवाह नहीं करते हैं curl --insecure, तो आप प्रमाणपत्र के सत्यापन को अक्षम कर सकते हैं ( ), लेकिन तब आपको खुद से पूछना चाहिए कि आप http के बजाय https का उपयोग क्यों करते हैं।


3

यह किसी को कुछ समय बचा सकता है।

यदि आप GuzzleHttp का उपयोग करते हैं और आप इस त्रुटि संदेश cURL त्रुटि 60 का सामना करते हैं : SSL: कोई वैकल्पिक प्रमाणपत्र विषय नाम लक्ष्य होस्ट नाम से मेल नहीं खाता है और आप 'असुरक्षित' समाधान (उत्पादन पर अनुशंसित नहीं) के साथ ठीक हैं तो आपको \GuzzleHttp\RequestOptions::VERIFY => falseग्राहक को जोड़ना होगा विन्यास:

$this->client = new \GuzzleHttp\Client([
    'base_uri'                          => 'someAccessPoint',
    \GuzzleHttp\RequestOptions::HEADERS => [
        'User-Agent' => 'some-special-agent',
    ],
    'defaults'                          => [
        \GuzzleHttp\RequestOptions::CONNECT_TIMEOUT => 5,
        \GuzzleHttp\RequestOptions::ALLOW_REDIRECTS => true,
    ],
    \GuzzleHttp\RequestOptions::VERIFY  => false,
]);

जो कि विधि में CURLOPT_SSL_VERIFYHOST0 और CURLOPT_SSL_VERIFYPEERअसत्य पर सेट हैCurlFactory::applyHandlerOptions()

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = false;

से GuzzleHttp प्रलेखन

सत्यापित करें

अनुरोध के SSL प्रमाणपत्र सत्यापन व्यवहार का वर्णन करता है।

  • SSL प्रमाणपत्र सत्यापन को सक्षम करने के लिए सही पर सेट करें और ऑपरेटिंग सिस्टम द्वारा प्रदान की गई डिफ़ॉल्ट CA बंडल> का उपयोग करें।
  • प्रमाणपत्र सत्यापन को अक्षम करने के लिए गलत पर सेट करें (यह असुरक्षित है!)।
  • कस्टम प्रमाणपत्र का उपयोग करके सत्यापन को सक्षम करने के लिए CA बंडल को पथ प्रदान करने के लिए एक स्ट्रिंग पर सेट करें।

0

जैसा कि त्रुटि कोड कहता है, "कोई वैकल्पिक प्रमाणपत्र विषय नाम लक्ष्य होस्ट नाम से मेल नहीं खाता" - इसलिए SSL प्रमाणपत्र के साथ एक समस्या है।

प्रमाणपत्र में SAN शामिल होना चाहिए, और केवल SAN का उपयोग किया जाएगा। कुछ ब्राउज़रों को हटाए गए सामान्य नाम की उपेक्षा करते हैं।

RFC 2818 में स्पष्ट रूप से कहा गया है, "यदि कोई dAnName प्रकार का कोई विषयविस्तार मौजूद है, तो वह पहचान के रूप में होना चाहिए। अन्यथा, प्रमाण पत्र के विषय क्षेत्र में (सबसे विशिष्ट) सामान्य नाम फ़ील्ड का उपयोग किया जाना चाहिए। हालांकि आम का उपयोग। नाम मौजूदा अभ्यास है, यह पदावनत है और प्रमाणीकरण प्राधिकारी को इसके बजाय dNSName का उपयोग करने के लिए प्रोत्साहित किया जाता है। "


0

मेरी भी यही समस्या थी। मेरे मामले में मैं digitalocean और nginx का उपयोग कर रहा था।
मैंने पहली बार एक domain example.app और एक subdomain dev.exemple.app को digitalocean में सेटअप किया है। दूसरा, मैंने गोडैडी से दो एसएसएल सर्टिफिकेट खरीदा। और अंतिम रूप से, मैंने निम्नलिखित स्निपेट के साथ उन दो एसएसएल सर्टिफिकेट का उपयोग करने के लिए नगीनेक्स में दो डोमेन को कॉन्फ़िगर किया

मेरा example.app डोमेन कॉन्फिग

    server {
    listen 7000 default_server;
    listen [::]:7000 default_server;

     listen 443 ssl default_server;
     listen [::]:443 ssl default_server;

    root /srv/nodejs/echantillonnage1;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name echantillonnage.app;
    ssl_certificate /srv/nodejs/certificatSsl/widcardcertificate/echantillonnage.app.chained.crt;
    ssl_certificate_key /srv/nodejs/certificatSsl/widcardcertificate/echantillonnage.app.key;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            proxy_pass http://127.0.0.1:8090;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
    #try_files $uri $uri/ =404;
    }
 }

मेरा dev.example.app

   server {
    listen 7000 default_server;
    listen [::]:7000 default_server;

     listen 444 ssl default_server;
     listen [::]:444 ssl default_server;

    root /srv/nodejs/echantillonnage1;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name dev.echantillonnage.app;
    ssl_certificate /srv/nodejs/certificatSsl/dev/dev.echantillonnage.app.chained.crt;
    ssl_certificate_key /srv/nodejs/certificatSsl/dev/dev.echantillonnage.app.key;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            proxy_pass http://127.0.0.1:8091;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
    #try_files $uri $uri/ =404;
    }
 }

जब मैं https://dev.echantillonnage.app लॉन्च कर रहा था, तब मैं मिल रहा था

    Fix CURL (51) SSL error: no alternative certificate subject name matches

मेरी गलती थी दो लाइन का बोल्ड

    listen 444 ssl default_server;
     listen [::]:444 ssl default_server;

मुझे इसे बदलना पड़ा:

     listen 443 ssl;
     listen [::]:443 ssl;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.