Corregir el error CURL (51) SSL: no coincide el nombre del sujeto del certificado alternativo

86

Soy nuevo en el mundo CURL, vengo del dominio Windows + .NET.

Intentando acceder a la API Rest para la autenticación básica en http://www.evercam.io/docs/api/v1/authentication .

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

No sé cómo usar este comando en el símbolo del sistema de Windows después de haber configurado CURL correctamente. Probado CURL de la siguiente manera:

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

Ahora termino con esto

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'

¿Cómo puedo solucionar este error del problema 51 de SSL?

theGeekster
fuente

Respuestas:

112

Suele ocurrir cuando el certificado no coincide con el nombre de host.

La solución sería contactar al anfitrión y pedirle que arregle su certificado.
De lo contrario, puede desactivar la verificación de cURL del certificado, use la opción -k(o --insecure).
Tenga en cuenta que, como dice la opción, es inseguro . No debe usar esta opción porque permite ataques de intermediario y anula el propósito de HTTPS.

Se puede encontrar más aquí: http://curl.haxx.se/docs/sslcerts.html

Sabuj Hassan
fuente
10
Las respuestas que indiquen que desactive la casilla de verificación también deben resaltar cuáles son las consecuencias. ¡Esto es peligroso!
DrP3pp3r
1
Lo que pensé que era el nombre del sujeto en el certificado era a lo *.my-domain.comque no se aplicaba dev.subdomain.my-domain.com. Pero funciona bien para dev-subdomain.my-domain.com. Entonces, para hacer que varios subdominios funcionen, tal vez necesite lo que dice este artículo - sslshopper.com/…
prayagupd
76

Nota del editor: este es un enfoque muy peligroso, si está utilizando una versión de PHP lo suficientemente antigua para usarlo. Abre su código a ataques man-in-the-middle y elimina uno de los propósitos principales de una conexión cifrada. La capacidad de hacer esto se ha eliminado de las versiones modernas de PHP porque es muy peligroso. La única razón por la que se ha votado a favor 70 veces es porque la gente es vaga. NO HAGAS ESTO.


Sé que es una pregunta (muy) antigua y se trata de la línea de comandos, pero cuando busqué en Google "SSL: ningún nombre de sujeto de certificado alternativo coincide con el nombre de host de destino", este fue el primer resultado.

Me tomó un buen tiempo encontrar la respuesta, ¡así que espero que esto le ahorre a alguien mucho tiempo! En PHP agregue esto a sus setopts cUrl:

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

ps: esto debería ser una solución temporal. Dado que se trata de un error de certificado, ¡lo mejor es arreglar el certificado, por supuesto!

JD_N_PHP
fuente
30
Bueno, esto surgió en mi búsqueda de Google para el problema que estaba teniendo en PHP, así que esto fue útil para mí.
Gujamin
1
Hice la misma búsqueda y me alegra tener su respuesta aquí. ¡Gracias!
CptMisery
2
CURLOPT_SSL_VERIFYHOSTfue suficiente en mi caso
1234ru
Gracias, útil para fines de prueba si aún no tiene sus certificados.
Andrew
20

El nombre común en el certificado api.evercam.ioes para *.herokuapp.comy no hay nombres de sujeto alternativos en el certificado. Esto significa que el certificado para api.evercam.iono coincide con el nombre de host y, por lo tanto, la verificación del certificado falla. Igual que cierto para www.evercam.io, por ejemplo, intente https://www.evercam.io con un navegador y obtendrá el mensaje de error, que el nombre en el certificado no coincide con el nombre de host.

Por lo tanto, es un problema que debe solucionarse con evercam.io. Si no le importa la seguridad, los ataques man-in-the-middle, etc., puede desactivar la verificación del certificado ( curl --insecure), pero luego debe preguntarse por qué usa https en lugar de http.

Steffen Ullrich
fuente
3

podría ahorrarle algo de tiempo a alguien.

Si usa GuzzleHttp y se enfrenta a este mensaje de error cURL error 60: SSL: ningún nombre de sujeto de certificado alternativo coincide con el nombre de host de destino y está de acuerdo con la solución 'insegura' (no recomendada en producción), entonces debe agregarla \GuzzleHttp\RequestOptions::VERIFY => falseal cliente configuración:

$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 se establece CURLOPT_SSL_VERIFYHOSTen 0 y CURLOPT_SSL_VERIFYPEERen falso en el CurlFactory::applyHandlerOptions()método

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

De la documentación de GuzzleHttp

verificar

Describe el comportamiento de verificación del certificado SSL de una solicitud.

  • Configúrelo en verdadero para habilitar la verificación del certificado SSL y use el paquete de CA predeterminado> proporcionado por el sistema operativo.
  • Configúrelo en falso para deshabilitar la verificación del certificado (¡esto no es seguro!).
  • Establezca una cadena para proporcionar la ruta a un paquete de CA para permitir la verificación mediante un certificado personalizado.
Zoltán Süle
fuente
0

Como dice el código de error, "ningún nombre de sujeto de certificado alternativo coincide con el nombre de host de destino", por lo que hay un problema con el certificado SSL.

El certificado debe incluir SAN y solo se utilizará SAN. Algunos navegadores ignoran el nombre común obsoleto.

RFC 2818 establece claramente: "Si hay una extensión subjectAltName de tipo dNSName, DEBE utilizarse como identidad. De lo contrario, DEBE utilizarse el campo Common Name (más específico) en el campo Asunto del certificado. Aunque el uso del Common El nombre es una práctica existente, está en desuso y se recomienda a las autoridades de certificación que utilicen dNSName en su lugar ".

povlhp
fuente
0

Tuve el mismo problema. En mi caso, estaba usando digitalocean y nginx.
Primero configuré un dominio example.app y un subdominio dev.exemple.app en digitalocean. En segundo lugar, compré dos certificados SSL de godaddy. Y finalmente, configuré dos dominios en nginx para usar esos dos certificados ssl con el siguiente fragmento

Mi configuración de dominio 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;
    }
 }

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

Cuando estaba lanzando https://dev.echantillonnage.app , estaba obteniendo

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

Mi error fueron las dos líneas de abajo

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

Tuve que cambiar esto a:

     listen 443 ssl;
     listen [::]:443 ssl;
solo yo
fuente