Curl:Fix Curl(51)SSL错误:没有其他证书使用者名称匹配

Curl:Fix Curl(51)SSL错误:没有其他证书使用者名称匹配,ssl,curl,https,Ssl,Curl,Https,我是个新手,来自Windows+.NET域 正在尝试在访问Rest API以进行基本身份验证 成功安装CURL后,不知道如何在windows命令提示符下使用此命令。测试旋度如下: 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

我是个新手,来自Windows+.NET域

正在尝试在访问Rest API以进行基本身份验证

成功安装CURL后,不知道如何在windows命令提示符下使用此命令。测试旋度如下:

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 issue 51错误?

api.evercam.io证书中的通用名称用于
*.herokuapp.com
,并且证书中没有其他主题名称。这意味着,
api.evercam.io
的证书与主机名不匹配,因此证书验证失败。 与
www.evercam.io
的情况相同,例如,尝试使用浏览器时,您会收到错误消息,即证书中的名称与主机名不匹配


因此,这是一个需要evercam.io解决的问题。如果您不关心安全性、中间人攻击等,您可能会禁用证书验证(
curl--unsecure
),但您应该问问自己,为什么要使用https而不是http。

当证书与主机名不匹配时,通常会发生这种情况

解决方案是联系主机并要求其修复其证书。
否则,您可以使用
-k
(或
-unsecure
)选项关闭cURL对证书的验证。
请注意,正如选项所说,它是不安全的。您不应该使用此选项,因为它允许中间人攻击并破坏HTTPS的用途


更多信息可以在这里找到:

编者注:如果您使用的是足够旧的PHP版本,那么这是一种非常危险的方法。它会向中间人攻击打开代码,并删除加密连接的主要目的之一。这种能力已经从现代版本的PHP中删除,因为它非常危险。唯一的原因是因为人们懒惰。不要这样做


我知道这是一个(非常)古老的问题,是关于命令行的,但当我在谷歌搜索“SSL:没有其他证书使用者名称与目标主机名匹配”时,这是第一个成功的答案

我花了很长时间才找到答案,希望这能为别人节省很多时间! 在PHP中,将此添加到cUrl setopts:

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
p、 s:这应该是一个临时解决办法。由于这是一个证书错误,最好的办法当然是修复证书

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

证书应包括SAN,并且仅使用SAN。有些浏览器会忽略不推荐使用的公用名称

RFC2818明确指出 如果存在dNSName类型的subjectAltName扩展名,则必须 将用作标识。否则,将使用(最具体的)通用名称 必须使用证书主题字段中的字段。尽管 通用名称的使用是现有的做法,不推荐使用,并且
我们鼓励认证机构改用dNSName。”

我也有同样的问题。就我而言,我使用的是digitalocean和nginx
我首先在digitalocean中设置了一个域example.app和一个子域dev.example.app。 其次,我从godaddy购买了两个ssl证书。 最后,我在nginx中配置了两个域,以使用这两个ssl证书

My 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;
    }
 }
My 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;
    }
 }
当我发射时,我得到了

    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;

这可能会为某人节省一些时间

如果您使用httpGuzzleHttp并遇到此错误消息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,
]);

CurlFactory::applyHandlerOptions()
方法中将
CURLOPT\u SSL\u VERIFYHOST
设置为0,将
CURLOPT\u SSL\u VERIFYPEER
设置为false

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

验证

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

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

这是我在谷歌搜索PHP时遇到的问题,所以这对我很有帮助。我也做了同样的搜索,我很高兴这里有你的答案。谢谢<代码>CURLOPT_SSL_VERIFYHOST在我的情况下就足够了。如果您还没有证书,感谢对测试非常有用。告诉您关闭检查的答案也应该强调其后果。这很危险!我认为证书上的主题名是
*。my domain.com
,它不适用于
dev.subdomain.my domain.com
。但是在
dev subdomain.my domain.com
上运行良好。因此,要使多个子域工作,您可能需要本文所述的内容-您能解释一下为什么
default\u server
语句在这里是一个问题吗?是否将其他配置标记为默认服务器?我在同一台主机上有这个卷曲问题,而不是外部连接。
$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = false;