CURL neden Windows'ta bir sertifikayı doğru şekilde doğrulayamıyor?


30

Windows'ta Curl kullanmaya çalıştığımda, bir httpsURL almak için, "bağlantı hatası (60)" mesajını alıyorum.

görüntü tanımını buraya girin

Kesin hata mesajı:

curl: (60) SSL sertifikası sorunu, CA sertifikasının TAMAM olduğunu doğrulayın. Ayrıntılar:
hata: 14090086: SSL yordamları: SSL3_GET_SERVER_CERTIFICATE: sertifika doğrulama başarısız oldu
Daha fazla ayrıntı burada: http://curl.haxx.se/docs/sslcerts.html

Bu nasıl çözülür?


SU, başlığında "problem" kelimesini beğenmez, çünkü açıklayıcı değildir. Başlığınızı "sorun" kelimesi olmadan tekrar ifade etmenin bir yolunu bulamıyorsanız, yeterince çaba harcamazsınız. :)
Garrett

1
Ben soruyorum mesajın tam bir alıntı. Bu kelimeyi kaldırmayı denemek istemiyorum, bu arama indekslemesi için önemli bir kelime.
Cheeso

@Cheeso: Gönderi içerikleri de dizine eklenir, sorunuzu arayan birileri başlığı altındaki açıklamada görür.
Tamara Wijsman

Yanıtlar:


36

Nedenini bilmiyorum ama bu bilgiyi bir yerde bulamadım.

  1. SSL uyumlu sürümü Curl'u indirin veya SSL uyumlu sürümü kendiniz oluşturun.

  2. Gönderen http://curl.haxx.se/docs/caextract.html , cacert.pem dosyasını indirin.

  3. Curl.exe ve .pem dosyasını aynı dizine yerleştirin.

  4. cacert.pemDosyayı yeniden adlandırcurl-ca-bundle.crt

  5. Curl.exe dosyasını yeniden çalıştırın!


DÜZENLE:

Sorunu çözmenin başka yolları da var. Bu özel yol Curl yapımcısı tarafından üretilen bir cacert dayanmaktadır. İstediğiniz şey olmayabilir ve özellikle, SSL sitesi tarafından kullanılan sertifika için az bilinen bir sertifikalandırma otoritesine (yalnızca kurumunuz tarafından bilinen bir otorite gibi) sahip olduğunuz durumlarda işe yaramayabilir . Bu durumda kendi curl-ca-bundle.crtdosyanızı oluşturmak isteyeceksiniz . Bu tür bir sertifikayı IE / Windows deposundan dışa aktarmak için certreq.exe ve openssl.exe dosyasını ve ardından sırasıyla pem formatına dönüştürmeyi kullanabilirsiniz.


1
Teşekkür ederim!!! Geçenlerde bir HTTPS'i cURL etmeye çalıştım ve nasıl çalışacağını anlamaya çalışırken çok fazla zaman geçirdim. Senin gibi, ben de bilgi için çeşitli kaynakları kontrol etmek zorunda kaldım, ama ne yazık ki, cert dosyasını cURL sitesinden indirmenin bir kısmını bulamadım (cert hedef siteden indirme hakkında pek çok şey gördüm, ama bu değil).
Synetech

Yardım etmesine sevindim.
Cheeso

Curl-ca-bundle.crt olarak yeniden adlandırmanın amacı nedir? Pencereler belirli mi?
nawfal

Teşekkürler! Windows 7'de curlişaretli kullanıyordum WinSSL. Dokümantasyon bağlantısına göre, işaretli sürümler sadece sistemin sertifikalarını kullanarak çalışmalıydı. Ancak, çözümünüzü izleyene kadar hatayı alıyordum.
George,

Ancak, son kullanıcının yönetici hakkı yoksa, yeni sertifikayı sisteme ait klasörlere koyamazlar. Alternatif olarak, kullanıcı ortam değişkenini kullanabilir set CURL_CA_BUNDLE=<path to crt>. Dosyanın formatının uygun olduğundan emin olun. Bu yöntem birden fazla curlkurulumunuz olsa bile işe yarayacaktır , örneğin git, serseri ...
Aaron C

6

ca-cert.crtWindows sertifika deposuna (CurrentUser veya LocalMachine) yüklenen CA sertifikalarını temel alarak dosyayı yazabilen bir PowerShell betiği oluşturdum . Komut dosyasını şu şekilde çalıştırın:

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

Bu curl-ca-cert.crt, aynı dizinde depolanması gereken dosyayı oluşturur ve curl.exeWindows uygulamalarınızdakilerle aynı siteleri doğrulayabilmeniz gerekir (bu dosyanın da tüketilebileceğini unutmayın git).

"Resmi" betiği GitHub'da bulunabilir , ancak ilk sürüm referans olarak burada listelenmiştir:

[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

Aslında Typheous / Ruby ile aynı problemi yaşadık. Çözüm cacert.pem dosyasını indirip C: \ Windows \ System32 dizinine (ya da nerede olursanız olun) kaydedin. Ondan sonra burada tanımlandığı gibi "Değişken İsmi" CURL_CA_BUNDLEve "Değişken Değer" olması gereken dosya yolunu belirttiğimiz gibi global bir ortam değişkeni ayarladık %SystemRoot%\System32\cacert.pem.

Yeni bir CMD Oturumu başlatırken, artık SSL Bağlantılarını doğrulamak için Typheous / Libcurl özelliğini kullanabilirsiniz. Bunu Windows 8.1 ile başarıyla denedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.