我是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错误?
答案 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;
验证
描述请求的SSL证书验证行为。
- 设置为true以启用SSL证书验证并使用操作系统提供的默认CA bundle>。
- 设置为false以禁用证书验证(这是不安全的!)。
- 设置为字符串以提供CA捆绑包的路径,以启用使用自定义证书的验证。