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