Corrigir erro CURL (51) SSL: nenhum nome de assunto de certificado alternativo corresponde

86

Eu sou novo no mundo CURL, vindo do domínio Windows + .NET.

Tentando acessar a API Rest para autenticação básica em http://www.evercam.io/docs/api/v1/authentication .

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

Não sei como usar este comando no prompt de comando do Windows depois de configurar o CURL com êxito. CURL testado da seguinte forma:

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

Agora estou terminando com isso

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'

Como posso corrigir esse erro de problema de SSL 51?

theGeekster
fonte

Respostas:

112

Geralmente acontece quando o certificado não corresponde ao nome do host.

A solução seria entrar em contato com o host e solicitar que corrija seu certificado.
Caso contrário, você pode desativar a verificação do certificado por cURL, use a opção -k(ou --insecure).
Observe que, como disse a opção, é inseguro . Você não deve usar esta opção porque permite ataques man-in-the-middle e anula o propósito do HTTPS.

Mais pode ser encontrado aqui: http://curl.haxx.se/docs/sslcerts.html

Sabuj Hassan
fonte
10
As respostas que dizem para desligar a seleção também devem destacar quais são as consequências. Isso é perigoso!
DrP3pp3r
1
Achei que era o nome do assunto no cert *.my-domain.comque não se aplicava dev.subdomain.my-domain.com. Mas funciona bem para dev-subdomain.my-domain.com. Então, para fazer com que vários subdomínios funcionem, talvez você precise do que este artigo diz - sslshopper.com/…
prayagupd
76

Nota do editor: esta é uma abordagem muito perigosa, se você estiver usando uma versão do PHP antiga o suficiente para usá-la. Ele abre seu código para ataques man-in-the-middle e remove uma das finalidades principais de uma conexão criptografada. A capacidade de fazer isso foi removida das versões modernas do PHP porque é muito perigoso. A única razão pela qual isso foi votado 70 vezes é porque as pessoas são preguiçosas. NÃO FAÇA ISSO.


Eu sei que é uma pergunta (muito) antiga e é sobre linha de comando, mas quando eu pesquisei no Google por "SSL: nenhum nome de assunto de certificado alternativo corresponde ao nome do host de destino", esta foi a primeira resposta.

Levei um bom tempo para descobrir a resposta, então espero que isso economize muito tempo para alguém! Em PHP, adicione aos seus setopts cUrl:

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

ps: esta deve ser uma solução temporária. Como se trata de um erro de certificado, o melhor é que o certificado seja corrigido, é claro!

JD_N_PHP
fonte
30
Bem, isso apareceu na minha pesquisa no Google para o problema que eu estava tendo no PHP, então isso foi útil para mim.
Gujamin
1
Fiz a mesma pesquisa e fico feliz em ter sua resposta aqui. Obrigado!
CptMisery
2
CURLOPT_SSL_VERIFYHOSTfoi o suficiente no meu caso
1234ru
Obrigado útil para fins de teste se você não tiver seus certificados ainda.
Andrew,
20

O nome comum no certificado para api.evercam.ioé para *.herokuapp.come não há nomes de assunto alternativos no certificado. Isso significa que o certificado para api.evercam.ionão corresponde ao nome do host e, portanto, a verificação do certificado falha. O mesmo vale para www.evercam.io, por exemplo, tente https://www.evercam.io com um navegador e você obterá a mensagem de erro, de que o nome no certificado não corresponde ao nome do host.

Portanto, é um problema que precisa ser corrigido pelo evercam.io. Se você não se preocupa com segurança, ataques man-in-the-middle etc, você pode desabilitar a verificação do certificado ( curl --insecure), mas então você deve se perguntar por que usa https em vez de http.

Steffen Ullrich
fonte
3

isso pode economizar algum tempo para alguém.

Se você usa GuzzleHttp e se depara com esta mensagem de erro cURL error 60: SSL: nenhum nome de assunto do certificado alternativo corresponde ao nome do host de destino e você está satisfeito com a solução 'insegura' (não recomendada na produção), então você deve adicionar \GuzzleHttp\RequestOptions::VERIFY => falseao cliente configuração:

$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,
]);

que define CURLOPT_SSL_VERIFYHOSTcomo 0 e CURLOPT_SSL_VERIFYPEERfalso no CurlFactory::applyHandlerOptions()método

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

Da documentação GuzzleHttp

verificar

Descreve o comportamento de verificação do certificado SSL de uma solicitação.

  • Defina como verdadeiro para ativar a verificação do certificado SSL e usar o pacote CA padrão> fornecido pelo sistema operacional.
  • Defina como falso para desativar a verificação de certificado (isso não é seguro!).
  • Defina como uma string para fornecer o caminho para um pacote CA para permitir a verificação usando um certificado personalizado.
Zoltán Süle
fonte
0

Como diz o código de erro, "nenhum nome de assunto de certificado alternativo corresponde ao nome de host de destino" - portanto, há um problema com o certificado SSL.

O certificado deve incluir SAN e apenas SAN será usado. Alguns navegadores ignoram o nome comum obsoleto.

O RFC 2818 afirma claramente "Se uma extensão subjectAltName do tipo dNSName estiver presente, ela DEVE ser usada como a identidade. Caso contrário, o campo Nome Comum (mais específico) no campo Assunto do certificado DEVE ser usado. Embora o uso do Common O nome é uma prática existente, está obsoleto e as autoridades de certificação são incentivadas a usar o dNSName em seu lugar. "

povlhp
fonte
0

Eu tive o mesmo problema. No meu caso, eu estava usando digitalocean e nginx.
Primeiro configurei um domínio example.app e um subdomínio dev.exemple.app em digitalocean. Em segundo lugar, comprei dois certificados SSL do godaddy. E, por fim, configurei dois domínios no nginx para usar esses dois certificados SSL com o seguinte snipet

Minha configuração de domínio 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;
    }
 }

Meu 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;
    }
 }

Quando estava lançando https://dev.echantillonnage.app , estava recebendo

    Fix CURL (51) SSL error: no alternative certificate subject name matches

Meu erro foram as duas linhas abaixo

    listen 444 ssl default_server;
     listen [::]:444 ssl default_server;

Tive que mudar isso para:

     listen 443 ssl;
     listen [::]:443 ssl;
só eu
fonte