Mengapa cURL tidak dapat memverifikasi sertifikat di Windows dengan benar?

30

Ketika saya mencoba menggunakan Curl di windows, untuk mengambil httpsurl, saya mendapatkan "koneksi error (60) yang ditakuti".

masukkan deskripsi gambar di sini

Pesan kesalahan sebenarnya adalah:

ikal: (60) Masalah sertifikat SSL, verifikasi bahwa sertifikat CA adalah OK. Detail:
kesalahan: 14090086: Rutinitas SSL: SSL3_GET_SERVER_CERTIFICATE: gagal verifikasi sertifikat.
Lebih detail di sini: http://curl.haxx.se/docs/sslcerts.html

Bagaimana cara mengatasinya?

Cheeso
sumber
SU tidak suka kata "masalah" dalam judul karena tidak deskriptif. Jika Anda tidak dapat menemukan cara untuk mengubah frase judul Anda tanpa kata "masalah," Anda tidak berusaha cukup keras. :)
Garrett
1
ini adalah kutipan tepat dari pesan yang saya tanyakan. Saya tidak ingin mencoba menghapus kata itu, ini yang penting, untuk pengindeksan pencarian.
Cheeso
@Cheeso: Isi posting juga diindeks, seseorang yang mencari pertanyaan Anda akan melihatnya dalam deskripsi di bawah judul.
Tamara Wijsman

Jawaban:

36

Saya tidak tahu mengapa, tetapi saya tidak menemukan informasi ini di satu tempat.

  1. Unduh Curl versi sadar SSL, atau buat sendiri versi sadar SSL.

  2. Dari http://curl.haxx.se/docs/caextract.html , Unduh file cacert.pem.

  3. Tempatkan curl.exe dan file .pem di direktori yang sama.

  4. Ubah nama cacert.pemfile menjadicurl-ca-bundle.crt

  5. Jalankan kembali curl.exe!


EDIT:

Ada cara lain untuk menyelesaikan masalah. cara khusus ini bergantung pada cacert yang diproduksi oleh pembuat Curl. Itu mungkin bukan yang Anda inginkan, dan khususnya, itu mungkin tidak berfungsi untuk kasus-kasus di mana Anda memiliki otoritas sertifikasi yang kurang terkenal (seperti otoritas yang hanya diketahui oleh perusahaan Anda) untuk sertifikat yang digunakan oleh situs SSL . Dalam hal ini, Anda ingin membuat curl-ca-bundle.crtfile Anda sendiri . Anda dapat menggunakan certreq.exe dan openssl.exe untuk masing-masing mengekspor sertifikat dari toko IE / Windows, dan kemudian mengonversi-ke-pem-format.

Cheeso
sumber
1
Terima kasih!!! Saya mencoba untuk meretas HTTPS baru-baru ini dan bersenang-senang mencoba mencari cara untuk membuatnya bekerja. Seperti Anda, saya juga harus memeriksa berbagai sumber untuk mendapatkan informasi, tetapi sayangnya, saya tidak menemukan bagian tentang keharusan mengunduh file cert dari situs CURL (saya melihat banyak hal tentang mengunduh sertifikat dari situs target, tapi bukan ini).
Synetech
Senang itu membantu.
Cheeso
Apa gunanya mengubah nama itu menjadi curl-ca-bundle.crt? Apakah ini spesifik untuk windows?
nawfal
Terima kasih! Saya menggunakan curlditandai WinSSLpada Windows 7. Menurut tautan dokumentasi, versi yang ditandai hanya dapat bekerja menggunakan sertifikat sistem. Namun, saya mendapatkan kesalahan sampai saya mengikuti solusi Anda.
George
Namun, jika pengguna akhir tidak memiliki hak admin, mereka tidak akan dapat menempatkan sertifikat baru pada folder milik sistem. Atau, pengguna dapat menggunakan variabel lingkungan set CURL_CA_BUNDLE=<path to crt>. Pastikan format file sudah benar. Metode ini akan bekerja bahkan jika Anda memiliki banyak curlinstalasi, misalnya git, gelandangan ...
Aaron C
6

Saya telah membuat skrip PowerShell yang mampu menulis ca-cert.crtfile berdasarkan sertifikat CA yang diinstal di toko sertifikasi Windows Anda (CurrentUser atau LocalMachine). Jalankan skrip seperti ini:

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

Ini akan membuat curl-ca-cert.crtfile yang harus disimpan dalam direktori yang sama curl.exedan Anda harus dapat memvalidasi situs yang sama seperti yang Anda bisa di aplikasi Windows Anda (perhatikan bahwa file ini juga dapat dikonsumsi oleh git).

Skrip "resmi" dapat ditemukan di GitHub , tetapi versi awalnya tercantum di sini untuk referensi:

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

Sebenarnya kami memiliki masalah yang sama dengan Typheous / Ruby. Solusinya sedang mengunduh cacert.pem dan menyimpannya ke C: \ Windows \ System32 (atau di mana pun Windows Anda berada). Setelah itu kita menetapkan variabel lingkungan global seperti dijelaskan di sini di mana "Nama Variabel" harus CURL_CA_BUNDLEdan "Nilai Variabel" path ke file %SystemRoot%\System32\cacert.pem.

Ketika memulai Sesi CMD baru Anda sekarang dapat menggunakan Typheous / Libcurl untuk mengotentikasi Koneksi SSL. Saya sudah berhasil mencoba ini dengan Windows 8.1.

Martin
sumber