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

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

Wenn ich versuche, mit Curl unter Windows eine URL abzurufen https, erhalte ich den gefürchteten „Verbindungsfehler (60)“.

Bildbeschreibung hier eingeben

Die genaue Fehlermeldung lautet:

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

Wie kann dieses Problem behoben werden?

Antwort1

Ich weiß nicht, warum, aber ich habe diese Informationen nicht alle 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. Aushttp://curl.haxx.se/docs/caextract.html, Laden Sie die Datei cacert.pem herunter.

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

  4. Benennen Sie die cacert.pemDatei um incurl-ca-bundle.crt

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


BEARBEITEN:

Es gibt andere Möglichkeiten, das Problem zu lösen. Diese spezielle Methode basiert auf einem Cacert, das vom Hersteller von Curl erstellt wurde. Das ist möglicherweise nicht das, was Sie wollen, und insbesondere funktioniert es möglicherweise nicht in Fällen, in denen Sie eine weniger bekannte Zertifizierungsstelle (z. B. eine Stelle, die nur Ihrem Unternehmen bekannt ist) für das von der SSL-Site verwendete Zertifikat haben. 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 es dann in das PEM-Format zu konvertieren.

Antwort2

Ich habe ein PowerShell-Skript erstellt, das die Datei basierend auf den CA-Zertifikaten schreiben kann ca-cert.crt, die in Ihrem Windows-Zertifikatspeicher (CurrentUser oder LocalMachine) installiert sind. Führen Sie das Skript wie folgt aus:

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

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

Das "offizielle" Skript finden Sie aufGitHub, aber die ursprüngliche Version ist hier zu Referenzzwecken 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]::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-----"
}

Antwort3

Tatsächlich hatten wir das gleiche Problem mit Typheous/Ruby. Die Lösung war das Herunterladen dercacert.pemund speichern Sie es unter C:\Windows\System32 (oder wo auch immer Ihr Windows ist). Danach setzen wir eine globale Umgebungsvariablewie hier beschriebenwobei der „Variablenname“ CURL_CA_BUNDLEund der „Variablenwert“ der Pfad zur Datei sein muss %SystemRoot%\System32\cacert.pem.

Beim Starten einer neuen CMD-Sitzung können Sie jetzt einfach Typheous/Libcurl verwenden, um SSL-Verbindungen zu authentifizieren. Ich habe dies erfolgreich mit Windows 8.1 ausprobiert.

verwandte Informationen