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

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

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 CA esté bien. Detalles:
error: 14090086: rutinas SSL: SSL3_GET_SERVER_CERTIFICATE: verificación de certificado fallida
Más detalles aquí:http://curl.haxx.se/docs/sslcerts.html

¿Cómo resolver esto?

Respuesta1

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. Dehttp://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 cacert producido por el fabricante de Curl. Puede que eso no sea lo que desea y, en particular, puede que no funcione en los casos en los que tenga una autoridad de certificación poco conocida (como una autoridad conocida sólo por su empresa) para el certificado utilizado por el sitio SSL. . En ese caso, querrás generar tu propio curl-ca-bundle.crtarchivo. Puede utilizar certreq.exe y openssl.exe para exportar dicho certificado desde la tienda IE/Windows y luego convertirlo al formato pem, respectivamente.

Respuesta2

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 almacén de certificaciones de Windows (CurrentUser o LocalMachine). Ejecute el script de esta manera:

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 puede en sus aplicaciones de Windows (tenga en cuenta que este archivo también puede ser consumido por git).

El script "oficial" se puede encontrar enGitHub, pero la versión inicial se incluye 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]::Root, $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-----"
}

Respuesta3

En realidad tuvimos el mismo problema con Typheous/Ruby. La solución fue descargar elcacert.pemy guárdelo en C:\Windows\System32 (o donde esté su Windows). Después de eso configuramos una variable de entorno global.como se describe aquídonde debe estar el "Nombre de la variable" CURL_CA_BUNDLEy el "Valor de la variable" la ruta al archivo %SystemRoot%\System32\cacert.pem.

Al iniciar una nueva sesión CMD, ahora puede usar Typheous/Libcurl para autenticar conexiones SSL. Probé esto con éxito con Windows 8.1.

información relacionada