Perché cURL non può verificare correttamente un certificato su Windows?


30

Quando provo ad usare Curl su Windows, per recuperare un httpsurl, ottengo il temuto "errore di connessione (60)".

inserisci qui la descrizione dell'immagine

Il messaggio di errore esatto è:

curl: (60) Problema al certificato SSL, verificare che il certificato CA sia OK. Dettagli:
errore: 14090086: routine SSL: SSL3_GET_SERVER_CERTIFICATE: verifica certificato non riuscita
Maggiori dettagli qui: http://curl.haxx.se/docs/sslcerts.html

Come risolvere questo?


SU non ama la parola "problema" nel titolo perché non è descrittivo. Se non riesci a trovare un modo per riformulare il tuo titolo senza la parola "problema", non stai provando abbastanza. :)
Garrett,

1
è una citazione esatta del messaggio di cui sto chiedendo. Non voglio provare a rimuovere quella parola, è importante per l'indicizzazione della ricerca.
Cheeso,

@Cheeso: anche i contenuti dei post vengono indicizzati, qualcuno che cerca la tua domanda lo vedrebbe nella descrizione sotto il titolo.
Tamara Wijsman,

Risposte:


36

Non so perché, ma non ho trovato tutte queste informazioni in un unico posto.

  1. Scarica la versione compatibile con SSL di Curl o crea tu stesso la versione compatibile con SSL.

  2. Da http://curl.haxx.se/docs/caextract.html , scarica il file cacert.pem.

  3. Posiziona curl.exe e il file .pem nella stessa directory.

  4. Rinomina il cacert.pemfile incurl-ca-bundle.crt

  5. Riesegui curl.exe!


MODIFICARE:

Esistono altri modi per risolvere il problema. in questo modo particolare si basa su un cacert prodotto dal produttore di Curl. Potrebbe non essere quello che desideri e, in particolare, potrebbe non funzionare nei casi in cui hai un'autorità di certificazione poco nota (come un'autorità nota solo alla tua società) per il certificato utilizzato dal sito SSL . In tal caso, vorrai generare il tuo curl-ca-bundle.crtfile. È possibile utilizzare certreq.exe e openssl.exe per esportare tale certificato dall'archivio IE / Windows e quindi rispettivamente convertire in formato pem.


1
Grazie!!! Ho provato a curiosare un HTTPS di recente e ho avuto un sacco di tempo cercando di capire come farlo funzionare. Come te, anche io ho dovuto controllare una varietà di fonti per informazioni, ma sfortunatamente non ho trovato la parte sul dover scaricare il file cert dal sito cURL (ho visto molte cose sul download del cert dal sito di destinazione, ma non questo).
Synetech,

Sono contento che abbia aiutato.
Cheeso,

Qual è lo scopo di rinominarlo in curl-ca-bundle.crt? È specifico di Windows?
nawfal,

Grazie! Stavo usando curlcontrassegnato WinSSLsu Windows 7. Secondo il collegamento della documentazione, le versioni così contrassegnate dovrebbero funzionare solo usando i certificati del sistema. Tuttavia, ho riscontrato l'errore fino a quando non ho seguito la tua soluzione.
George,

Tuttavia, se l'utente finale non dispone dei diritti di amministratore, non sarà in grado di inserire il nuovo certificato nelle cartelle che appartengono al sistema. In alternativa, l'utente può utilizzare la variabile di ambiente set CURL_CA_BUNDLE=<path to crt>. Assicurati che il formato del file sia corretto. Questo metodo funzionerà anche se hai più curlinstallazioni, ad esempio git, vagrant ...
Aaron C

6

Ho creato uno script PowerShell in grado di scrivere il ca-cert.crtfile in base ai certificati CA installati nel tuo archivio certificazioni di Windows (CurrentUser o LocalMachine). Esegui lo script in questo modo:

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

Ciò creerà il curl-ca-cert.crtfile che dovrebbe essere archiviato nella stessa directory di curl.exee dovresti essere in grado di convalidare gli stessi siti che puoi nelle tue applicazioni Windows (tieni presente che questo file può essere utilizzato anche da git).

Lo script "ufficiale" è disponibile su GitHub , ma la versione iniziale è elencata qui come riferimento:

[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-----"
}

2

In realtà abbiamo avuto lo stesso problema con Typheous / Ruby. La soluzione stava scaricando cacert.pem e salvandolo in C: \ Windows \ System32 (o dovunque sia Windows). Dopodiché impostiamo una variabile d'ambiente globale come qui descritta dove deve essere "Nome variabile" CURL_CA_BUNDLEe "Valore variabile" il percorso del file %SystemRoot%\System32\cacert.pem.

Quando si avvia una nuova sessione CMD, ora è possibile utilizzare solo cose Typheous / Libcurl per autenticare le connessioni SSL. Ho provato con successo con Windows 8.1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.