
Wenn ich versuche, mit Curl unter Windows eine URL abzurufen https
, erhalte ich den gefürchteten „Verbindungsfehler (60)“.
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.
Laden Sie die SSL-fähige Version von Curl herunter oder erstellen Sie die SSL-fähige Version selbst.
Aushttp://curl.haxx.se/docs/caextract.html, Laden Sie die Datei cacert.pem herunter.
Platzieren Sie die curl.exe- und die .pem-Datei im selben Verzeichnis.
Benennen Sie die
cacert.pem
Datei um incurl-ca-bundle.crt
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.crt
Datei 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.exe
und 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_BUNDLE
und 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.