¿Por qué cURL no puede verificar correctamente un certificado en Windows?

30

Cuando intento usar Curl en Windows, para recuperar una httpsurl, aparece el temido "error de conexión (60)".

ingrese la descripción de la imagen aquí

El mensaje de error exacto es:

curl: (60) Problema con el certificado SSL, verifique que el certificado de CA esté bien. Detalles:
error: 14090086: rutinas SSL: SSL3_GET_SERVER_CERTIFICATE: verificación del certificado falló
Más detalles aquí: http://curl.haxx.se/docs/sslcerts.html

¿Cómo resolver esto?

Cheeso
fuente
A SU no le gusta la palabra "problema" en el título porque no es descriptiva. Si no puede encontrar una manera de reformular su título sin la palabra "problema", no está tratando lo suficiente. :)
Garrett
1
Es una cita exacta del mensaje que estoy preguntando. No quiero tratar de eliminar esa palabra, es importante, para la indexación de búsqueda.
Cheeso
@Cheeso: los contenidos de las publicaciones también se indexan, alguien que busque su pregunta lo verá en la descripción debajo del título.
Tamara Wijsman

Respuestas:

36

No sé por qué, pero no encontré toda esta información en un solo lugar.

  1. Descargue la versión compatible con SSL de Curl o cree la versión compatible con SSL usted mismo.

  2. Desde http://curl.haxx.se/docs/caextract.html , descargue el archivo cacert.pem.

  3. Coloque el archivo curl.exe y .pem en el mismo directorio.

  4. Cambie el nombre del cacert.pemarchivo acurl-ca-bundle.crt

  5. Vuelva a ejecutar curl.exe!


EDITAR:

Hay otras formas de resolver el problema. Esta forma particular se basa en un concierto producido por el creador de Curl. Es posible que eso no sea lo que desea, y en particular, puede que no funcione para los casos en que tenga una autoridad de certificación poco conocida (como una autoridad conocida solo por su empresa) para el certificado utilizado por el sitio SSL . En ese caso, querrás generar tu propio curl-ca-bundle.crtarchivo. Puede usar certreq.exe y openssl.exe para exportar dicho certificado de la tienda IE / Windows y luego convertirlo a formato pem, respectivamente.

Cheeso
fuente
1
¡¡¡Gracias!!! Traté de CURLAR un HTTPS recientemente y tuve un montón de tiempo tratando de descubrir cómo hacerlo funcionar. Al igual que usted, también tuve que verificar una variedad de fuentes para obtener información, pero desafortunadamente, no encontré la parte sobre tener que descargar el archivo cert del sitio cURL (vi muchas cosas sobre la descarga del certificado desde el sitio objetivo, pero no esto)
Synetech
Me alegra que haya ayudado.
Cheeso
¿Cuál es el punto de renombrarlo a curl-ca-bundle.crt? ¿Es específico de Windows?
nawfal
¡Gracias! Estaba usando curlmarcado WinSSLen Windows 7. De acuerdo con el enlace de documentación, las versiones así marcadas deberían funcionar usando los certificados del sistema. Sin embargo, recibí el error hasta que seguí su solución.
George
Sin embargo, si el usuario final no tiene derechos de administrador, no podrá colocar el nuevo certificado en las carpetas que pertenecen al sistema. Alternativamente, el usuario puede usar la variable de entorno set CURL_CA_BUNDLE=<path to crt>. Asegúrese de que el formato del archivo sea el adecuado. Este método funcionará incluso si tiene varias curlinstalaciones, por ejemplo, git, vagabundo ...
Aaron C
6

He creado un script de PowerShell que es capaz de escribir el ca-cert.crtarchivo en función de los certificados de CA que están instalados en su tienda de certificación de Windows (CurrentUser o LocalMachine). Ejecute el script así:

CreateCaCert.ps1 -StoreLocation CurrentUser | Out-File -Encoding utf8 curl-ca-cert.crt

Esto creará el curl-ca-cert.crtarchivo que debería almacenarse en el mismo directorio curl.exey debería poder validar los mismos sitios que pueda en sus aplicaciones de Windows (tenga en cuenta que este archivo también puede ser consumido por git).

El script "oficial" se puede encontrar en GitHub , pero la versión inicial se enumera aquí como referencia:

[CmdletBinding()]
Param(
    [ValidateSet(
        [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser,
        [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine)]
    [string]
    $StoreLocation = [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser
)

$maxLineLength = 77

# Open the store
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store ([System.Security.Cryptography.X509Certificates.StoreName]::AuthRoot, $StoreLocation)
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly);

# Write header
Write-Output "# Root certificates ($StoreLocation) generated at $(Get-Date)"

# Write all certificates
Foreach ($certificate in $store.Certificates)
{
    # Start with an empty line
    Write-Output ""

    # Convert the certificate to a BASE64 encoded string
    $certString = [Convert]::ToBase64String($certificate.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert));

    # Write the actual certificate
    Write-Output "# Friendly name: $($certificate.FriendlyName)"
    Write-Output "# Issuer:        $($certificate.Issuer)"
    Write-Output "# Expiration:    $($certificate.GetExpirationDateString())"
    Write-Output "# Serial:        $($certificate.SerialNumber)"
    Write-Output "# Thumbprint:    $($certificate.Thumbprint)"
    Write-Output "-----BEGIN CERTIFICATE-----"
    For ($i = 0; $i -lt $certString.Length; $i += $maxLineLength)
    {
        Write-Output $certString.Substring($i, [Math]::Min($maxLineLength, $certString.Length - $i))
    }
    Write-Output "-----END CERTIFICATE-----"
}
Ramon de Klein
fuente
2

En realidad tuvimos el mismo problema con Typheous / Ruby. La solución fue descargar el cacert.pem y guardarlo en C: \ Windows \ System32 (o donde sea que esté su Windows). Después de eso, establecemos una variable de entorno global como la descrita aquí, donde debe estar CURL_CA_BUNDLEel " Nombre de la variable" y el "Valor de la variable" la ruta al archivo %SystemRoot%\System32\cacert.pem.

Al comenzar una nueva sesión de CMD, ahora puede usar Typheous / Libcurl para autenticar las conexiones SSL. He intentado esto con éxito con Windows 8.1.

Martín
fuente