Warum kann cURL ein Zertifikat unter Windows nicht ordnungsgemäß überprüfen?

30

Wenn ich versuche, unter Windows Curl zu verwenden, um eine httpsURL abzurufen , wird der gefürchtete "Verbindungsfehler (60)" angezeigt.

Bildbeschreibung hier eingeben

Die genaue Fehlermeldung lautet:

curl: (60) Problem mit dem SSL-Zertifikat. Überprüfen Sie, ob das CA-Zertifikat in Ordnung ist. Details:
Fehler: 14090086: SSL-Routinen: SSL3_GET_SERVER_CERTIFICATE: Zertifikatprüfung fehlgeschlagen
Weitere Details finden Sie hier: http://curl.haxx.se/docs/sslcerts.html

Wie kann das behoben werden?

Cheeso
quelle
SU mag das Wort "Problem" im Titel nicht, weil es nicht beschreibend ist. Wenn Sie keine Möglichkeit finden, Ihren Titel ohne das Wort "Problem" neu zu formulieren, sind Sie nicht stark genug. :)
Garrett
1
Es ist ein genaues Zitat der Nachricht, nach der ich frage. Ich möchte nicht versuchen, dieses Wort zu entfernen, es ist wichtig für die Indizierung der Suche.
Cheeso
@Cheeso: Der Inhalt der Posts wird ebenfalls indexiert. Wenn jemand nach Ihrer Frage sucht, wird dies in der Beschreibung unter dem Titel angezeigt.
Tamara Wijsman

Antworten:

36

Ich weiß nicht warum, aber ich habe diese Informationen nicht an einem Ort gefunden.

  1. Laden Sie die SSL-fähige Version von Curl herunter oder erstellen Sie die SSL-fähige Version selbst.

  2. Laden Sie unter http://curl.haxx.se/docs/caextract.html die Datei cacert.pem herunter.

  3. Platzieren Sie die Datei curl.exe und die PEM-Datei im selben Verzeichnis.

  4. Benennen Sie die cacert.pemDatei in umcurl-ca-bundle.crt

  5. Führen Sie curl.exe erneut aus!


BEARBEITEN:

Es gibt andere Möglichkeiten, das Problem zu lösen. Diese besondere Art und Weise beruht auf einem Cacert, der vom Hersteller von Curl hergestellt wird. Dies ist möglicherweise nicht das, was Sie möchten, und insbesondere funktioniert dies möglicherweise nicht in Fällen, in denen Sie über eine weniger als bekannte Zertifizierungsstelle (z. B. eine nur Ihrem Unternehmen bekannte Stelle) für das von der SSL-Site verwendete Zertifikat verfügen . In diesem Fall möchten Sie Ihre eigene curl-ca-bundle.crtDatei generieren . Sie können certreq.exe und openssl.exe verwenden, um ein solches Zertifikat aus dem IE / Windows-Speicher zu exportieren und anschließend in das PEM-Format zu konvertieren.

Cheeso
quelle
1
Vielen Dank!!! Ich habe kürzlich versucht, ein HTTPS zu cURLen, und hatte eine Menge Zeit, um herauszufinden, wie ich es zum Laufen bringen kann. Wie Sie musste auch ich eine Vielzahl von Quellen nach Informationen durchsuchen, aber leider fand ich nicht den Teil, der das Herunterladen der Zertifikatsdatei von der cURL-Site betraf (ich sah viele Dinge über das Herunterladen des Zertifikats von der Ziel-Site, aber nicht das).
Synetech
Ich bin froh, dass es geholfen hat.
Cheeso
Wozu wird es in curl-ca-bundle.crt umbenannt? Ist es Windows-spezifisch?
Nawfal
Vielen Dank! Ich habe curlmarkiert WinSSLunter Windows 7 verwendet. Gemäß dem Dokumentationslink sollten so gekennzeichnete Versionen nur mit den Zertifikaten des Systems funktionieren. Ich habe jedoch den Fehler erhalten, bis ich Ihrer Lösung gefolgt bin.
George
Wenn der Endbenutzer jedoch keine Administratorrechte hat, kann er das neue Zertifikat nicht in Ordnern ablegen, die zum System gehören. Alternativ kann der Benutzer die Umgebungsvariable verwenden set CURL_CA_BUNDLE=<path to crt>. Stellen Sie sicher, dass das Format der Datei korrekt ist. Diese Methode funktioniert auch, wenn Sie mehrere curlInstallationen haben, z. B. Git, Vagrant ...
Aaron C
6

Ich habe ein PowerShell-Skript erstellt, mit dem die ca-cert.crtDatei basierend auf den CA-Zertifikaten geschrieben werden kann, die in Ihrem Windows-Zertifizierungsspeicher (CurrentUser oder LocalMachine) installiert sind. Führen Sie das Skript folgendermaßen aus:

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

Dadurch wird die curl-ca-cert.crtDatei erstellt, die im selben Verzeichnis wie gespeichert werden soll, curl.exeund Sie sollten in der Lage sein, dieselben Sites wie in Ihren Windows-Anwendungen zu validieren (beachten Sie, dass diese Datei auch von verwendet werden kann git).

Das "offizielle" Skript ist auf GitHub zu finden , aber die ursprüngliche Version ist hier als Referenz aufgeführt:

[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
quelle
2

Eigentlich hatten wir das gleiche Problem mit Typheous / Ruby. Die Lösung bestand darin, die Datei cacert.pem herunterzuladen und unter C: \ Windows \ System32 (oder wo immer sich Windows befindet) zu speichern. Danach setzen wir eine globale Umgebungsvariable wie hier beschrieben, wobei der "Variablenname" CURL_CA_BUNDLEund der "Variablenwert" der Pfad zur Datei sein müssen %SystemRoot%\System32\cacert.pem.

Wenn Sie eine neue CMD-Sitzung starten, können Sie jetzt Typheous / Libcurl verwenden, um SSL-Verbindungen zu authentifizieren. Ich habe dies erfolgreich mit Windows 8.1 versucht.

Martin
quelle