Curl: แก้ไขข้อผิดพลาด CURL (51) SSL: ไม่มีชื่อหัวเรื่องใบรับรองอื่นที่ตรงกัน


88

ฉันเพิ่งเคยใช้ CURL world มาจากโดเมน Windows + .NET

พยายามที่จะเข้าถึงส่วนที่เหลือ API สำหรับการตรวจสอบเบื้องต้นที่http://www.evercam.io/docs/api/v1/authentication

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

ไม่ทราบวิธีใช้คำสั่งนี้บนพรอมต์คำสั่งของ windows หลังจากตั้งค่า 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'

ฉันจะแก้ไขข้อผิดพลาด SSL ปัญหา 51 นี้ได้อย่างไร

คำตอบ:


113

โดยปกติจะเกิดขึ้นเมื่อใบรับรองไม่ตรงกับชื่อโฮสต์

วิธีแก้ปัญหาคือติดต่อโฮสต์และขอให้แก้ไขใบรับรอง
มิฉะนั้นคุณสามารถปิดการตรวจสอบใบรับรองของ 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/...
prayagupd

77

หมายเหตุบรรณาธิการ: นี่เป็นแนวทางที่อันตรายมากหากคุณใช้ PHP เวอร์ชันเก่าพอที่จะใช้งานได้ จะเปิดรหัสของคุณเพื่อโจมตีแบบคนตรงกลางและลบหนึ่งในวัตถุประสงค์หลักของการเชื่อมต่อที่เข้ารหัส ความสามารถในการทำเช่นนี้ได้ถูกลบออกจาก PHP เวอร์ชันใหม่เนื่องจากมันอันตรายมาก เหตุผลเดียวที่ได้รับการโหวต 70 ครั้งเป็นเพราะคนขี้เกียจ อย่าทำอย่างนี้.


ฉันรู้ว่ามันเป็นคำถามเก่า (มาก) และมันเกี่ยวกับบรรทัดคำสั่ง แต่เมื่อฉันค้นหา "SSL: ไม่มีชื่อเรื่องใบรับรองอื่นที่ตรงกับชื่อโฮสต์เป้าหมาย" นี่เป็นคำถามแรก

ฉันใช้เวลาพอสมควรในการหาคำตอบดังนั้นหวังว่านี่จะช่วยให้ใครบางคนประหยัดเวลาได้มาก ใน PHP เพิ่มสิ่งนี้ลงใน setopts cUrl ของคุณ:

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

ps: นี่ควรเป็นวิธีแก้ปัญหาชั่วคราว เนื่องจากนี่เป็นข้อผิดพลาดของใบรับรองสิ่งที่ดีที่สุดคือการแก้ไขใบรับรองแน่นอน!


30
สิ่งนี้เกิดขึ้นในการค้นหา Google ของฉันสำหรับปัญหาที่ฉันพบใน PHP ดังนั้นนี่จึงเป็นประโยชน์สำหรับฉัน
Gujamin

1
ฉันทำการค้นหาแบบเดียวกันและดีใจที่ได้รับคำตอบจากคุณที่นี่ ขอบคุณ!
CptMisery

2
CURLOPT_SSL_VERIFYHOSTก็เพียงพอแล้วในกรณีของฉัน
1234ru

ขอขอบคุณที่เป็นประโยชน์สำหรับวัตถุประสงค์ในการทดสอบหากคุณยังไม่มีใบรับรอง
Andrew

20

ชื่อสามัญใน certicate สำหรับapi.evercam.ioเป็น*.herokuapp.comและไม่มีชื่อเรื่องทางเลือกในใบรับรอง ซึ่งหมายความว่าใบรับรองสำหรับapi.evercam.ioไม่ตรงกับชื่อโฮสต์ดังนั้นการตรวจสอบใบรับรองจึงล้มเหลว เหมือนกับจริงสำหรับwww.evercam.ioเช่นลองhttps://www.evercam.ioด้วยเบราว์เซอร์และคุณได้รับข้อความแสดงข้อผิดพลาดว่าชื่อในใบรับรองไม่ตรงกับชื่อโฮสต์

ดังนั้นจึงเป็นปัญหาที่ต้องได้รับการแก้ไขโดย evercam.io หากคุณไม่สนใจเรื่องความปลอดภัยการโจมตีจากคนตรงกลาง ฯลฯ คุณอาจปิดการตรวจสอบใบรับรอง ( curl --insecure) แต่คุณควรถามตัวเองว่าทำไมคุณถึงใช้ https แทน http


4

อาจช่วยประหยัดเวลาให้กับใครบางคนได้

หากคุณใช้GuzzleHttpและคุณต้องเผชิญกับข้อความแสดงข้อผิดพลาดนี้cURL error 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_VERIFYHOSTเป็น 0 และCURLOPT_SSL_VERIFYPEERเป็นเท็จในCurlFactory::applyHandlerOptions()วิธีการ

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

จากเอกสาร GuzzleHttp

ตรวจสอบ

อธิบายพฤติกรรมการตรวจสอบใบรับรอง SSL ของคำขอ

  • ตั้งค่าเป็น true เพื่อเปิดใช้งานการตรวจสอบใบรับรอง SSL และใช้ชุด CA เริ่มต้น> ที่ระบบปฏิบัติการให้มา
  • ตั้งค่าเป็นเท็จเพื่อปิดใช้งานการตรวจสอบใบรับรอง (ไม่ปลอดภัย!)
  • ตั้งค่าเป็นสตริงเพื่อระบุเส้นทางไปยังชุด CA เพื่อเปิดใช้งานการยืนยันโดยใช้ใบรับรองที่กำหนดเอง

0

ตามที่ระบุรหัสข้อผิดพลาด "ไม่มีชื่อหัวเรื่องใบรับรองอื่นที่ตรงกับชื่อโฮสต์เป้าหมาย" จึงมีปัญหากับใบรับรอง SSL

ใบรับรองควรมี SAN และจะใช้เฉพาะ SAN เบราว์เซอร์บางตัวไม่สนใจ Common Name ที่เลิกใช้งาน

RFC 2818 ระบุอย่างชัดเจนว่า "หากมีส่วนขยาย subjectAltName ของชนิด dNSName ต้องใช้เป็นข้อมูลประจำตัวมิฉะนั้นจะต้องใช้ฟิลด์ Common Name (เฉพาะที่สุด) ในฟิลด์ Subject ของใบรับรองแม้ว่าการใช้ Common ชื่อเป็นแนวทางปฏิบัติที่มีอยู่แล้วเลิกใช้งานแล้วและขอแนะนำให้หน่วยงานรับรองใช้ dNSName แทน "


0

ฉันมีปัญหาเดียวกัน ในกรณีของฉันฉันใช้ digitalocean และ nginx
ฉันได้ตั้งค่าโดเมน example.app และโดเมนย่อย dev.exemple.app ใน digitalocean เป็นครั้งแรก อย่างที่สองฉันซื้อใบรับรอง ssl สองฉบับจาก GoDaddy และสุดท้ายฉันกำหนดค่าโดเมนสองโดเมนใน nginx เพื่อใช้ใบรับรอง ssl สองตัวนี้กับ snipet ต่อไปนี้

การกำหนดค่าโดเมน 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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.