Почему cURL не может правильно проверить сертификат в Windows?

Почему cURL не может правильно проверить сертификат в Windows?

Когда я пытаюсь использовать Curl в Windows для получения httpsURL-адреса, я получаю ужасную «ошибку подключения (60)».

введите описание изображения здесь

Точное сообщение об ошибке:

curl: (60) Проблема с сертификатом SSL, проверьте, что сертификат CA в порядке. Подробности:
ошибка:14090086:Процедуры SSL:SSL3_GET_SERVER_CERTIFICATE:сбой проверки сертификата
Подробнее здесь:http://curl.haxx.se/docs/sslcerts.html

Как решить эту проблему?

решение1

Не знаю почему, но я не нашел всю эту информацию в одном месте.

  1. Загрузите версию Curl с поддержкой SSL или создайте ее самостоятельно.

  2. Отhttp://curl.haxx.se/docs/caextract.html, Загрузите файл cacert.pem.

  3. Поместите файлы curl.exe и .pem в один каталог.

  4. Переименуйте cacert.pemфайл вcurl-ca-bundle.crt

  5. Перезапустите curl.exe!


РЕДАКТИРОВАТЬ:

Есть и другие способы решения проблемы. Этот конкретный способ основан на cacert, созданном создателем Curl. Это может быть не то, что вам нужно, и, в частности, это может не работать в случаях, когда у вас есть менее известный центр сертификации (например, центр, известный только вашей корпорации) для сертификата, используемого сайтом SSL. В этом случае вам нужно будет создать свой собственный curl-ca-bundle.crtфайл. Вы можете использовать certreq.exe и openssl.exe для экспорта такого сертификата из хранилища IE/Windows, а затем преобразовать его в формат pem соответственно.

решение2

Я создал скрипт PowerShell, который способен записывать ca-cert.crtфайл на основе сертификатов CA, установленных в вашем хранилище сертификатов Windows (CurrentUser или LocalMachine). Запустите скрипт следующим образом:

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

Это создаст curl-ca-cert.crtфайл, который должен храниться в том же каталоге, что и , curl.exeи вы сможете проверять те же сайты, что и в приложениях Windows (обратите внимание, что этот файл также может использоваться git).

«Официальный» сценарий можно найти наGitHub, но первоначальная версия приведена здесь для справки:

[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-----"
}

решение3

На самом деле у нас была та же проблема с Typheous/Ruby. Решением было загрузитьcacert.pemи сохраняем его в C:\Windows\System32 (или где там у вас Windows). После этого устанавливаем глобальную переменную окружениякак описано здесьгде «Имя переменной» должно быть CURL_CA_BUNDLE, а «Значение переменной» — путь к файлу %SystemRoot%\System32\cacert.pem.

При запуске нового сеанса CMD теперь можно просто использовать Typheous/Libcurl для аутентификации SSL-соединений. Я успешно попробовал это с Windows 8.1.

Связанный контент