29

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

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

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

Как решить это?

3 ответа3

33

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

  1. Загрузите версию Curl с поддержкой SSL или создайте версию с поддержкой 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 соответственно.

6

Я создал сценарий 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]::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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .