修复CURL(51)SSL错误:没有替代证书主题名称匹配

时间:2013-12-30 15:59:18

标签: ssl curl https

我是CURL世界的新手,来自Windows + .NET域。

尝试在http://www.evercam.io/docs/api/v1/authentication访问Rest API进行基本身份验证。

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

成功完成CURL设置后,不知道如何在Windows命令提示符下使用此命令。经过测试的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错误?

6 个答案:

答案 0 :(得分:71)

通常在证书与主机名不匹配时发生。

解决方案是联系主持人并要求其修改其证书 否则,您可以关闭cURL对证书的验证,使用-k(或--insecure)选项。
请注意,正如选项所说,它是不安全。您不应在生产中使用此选项,因为它允许自签名证书。

更多信息可以在这里找到:http://curl.haxx.se/docs/sslcerts.html

答案 1 :(得分:55)

我知道这是一个(非常)陈旧的问题而且它是关于命令行的,但是当我在Google上搜索" SSL时:没有替代证书主题名称与目标主机名匹配",这是第一次打击。

我花了很长时间才弄清楚答案,所以希望这能节省很多时间! 在PHP中将此添加到您的cUrl setopts:

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

p.s:这应该是一个临时解决方案。由于这是证书错误,最好的办法是将证书固定在当前!

答案 2 :(得分:20)

api.evercam.io的证书中的通用名称是*.herokuapp.com,证书中没有替代主题名称。这意味着api.evercam.io的证书与主机名不匹配,因此证书验证失败。 与www.evercam.io的相同,例如使用浏览器尝试https://www.evercam.io并收到错误消息,证书中的名称与主机名不匹配。

所以这是一个需要由evercam.io修复的问题。如果您不关心安全性,中间人攻击等,您可能会禁用证书验证(curl --insecure),但是您应该问自己为什么要使用https而不是http。< / p>

答案 3 :(得分:0)

如错误代码所示,“没有其他证书使用者名称与目标主机名称匹配”-SSL证书存在问题。

该证书应包括SAN,并且将仅使用SAN。一些浏览器会忽略不赞成使用的通用名称。

RFC 2818明确规定   “如果存在类型为dNSName的subjectAltName扩展名,则必须    用作身份。否则,(最具体的)通用名称    必须使用证书的“主题”字段中的“字段”。虽然    通用名称的使用是现有做法,不建议使用,    鼓励证书颁发机构改为使用dNSName。“

答案 4 :(得分:0)

我有同样的问题。就我而言,我使用的是digitalocean和nginx。
我首先在digitalocean中设置了一个域example.app和一个子域dev.exemple.app。 其次,我从Godaddy购买了两个SSL证书。 最后,我在nginx中配置了两个域,以将这两个ssl证书与以下代码段一起使用

我的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;

答案 5 :(得分:0)

这可能会节省一些时间。

如果您使用 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_VERIFYHOST方法中将CURLOPT_SSL_VERIFYPEER设置为0,将CurlFactory::applyHandlerOptions()设置为false

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

GuzzleHttp documentation

  

验证

     

描述请求的SSL证书验证行为。

     
      
  • 设置为true以启用SSL证书验证并使用操作系统提供的默认CA bundle>。
  •   
  • 设置为false以禁用证书验证(这是不安全的!)。
  •   
  • 设置为字符串以提供CA捆绑包的路径,以启用使用自定义证书的验证。
  •