Чому CURL не може правильно перевірити сертифікат у Windows?


30

Коли я намагаюся використовувати Curl у Windows, щоб отримати httpsURL-адресу, я отримую жахливу "помилку підключення (60)".

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

Точне повідомлення про помилку:

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

Як це вирішити?


SU не любить слово "проблема" в заголовку, тому що воно не є описовим. Якщо ви не можете знайти спосіб переформулювати заголовок без слова "проблема", ви не дуже намагаєтесь. :)
Гаррет

1
це точна цитата повідомлення, про яке я питаю. Я не хочу намагатися видалити це слово, це важливо для індексації пошуку.
Cheeso

@Cheeso: Вміст публікації також індексується, хтось, хто шукає ваше запитання, побачить його в описі під заголовком.
Тамара Війсман

Відповіді:


36

Я не знаю чому, але я не знайшов цю інформацію в одному місці.

  1. Завантажте відому SSL версію Curl або побудуйте версію, відому SSL.

  2. Завантажте файл cacert.pem з http://curl.haxx.se/docs/caextract.html .

  3. Помістіть файл curl.exe і .pem в ту саму директорію.

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

  5. Повторно запустіть curl.exe!


Редагувати:

Є й інші способи вирішення проблеми. саме цей спосіб покладається на кацерт, виготовлений виробником Curl. Це може бути не тим, що ви хочете, і, зокрема, це може не працювати у випадках, коли у вас є маловідомий сертифікаційний орган (наприклад, орган, відомий лише вашій корпорації) для сертифіката, який використовується веб-сайтом SSL . У такому випадку вам потрібно буде генерувати власний curl-ca-bundle.crtфайл. Ви можете використовувати certreq.exe і openssl.exe, щоб експортувати такий сертифікат із магазину IE / Windows, а потім конвертувати у формат pem відповідно.


1
Дякую!!! Нещодавно я спробував зірвати HTTPS і мав час, намагаючись зрозуміти, як змусити його працювати. Як і ви, мені теж доводилося перевіряти різні джерела для інформації, але, на жаль, я не знайшов частини про те, щоб завантажити файл cert з сайту CURL (я бачив багато матеріалів про завантаження cert з цільового сайту, але не це).
Synetech

Радий, що це допомогло.
Чесо

Який сенс перейменувати його на curl-ca-bundle.crt? Це специфічні вікна?
nawfal

Спасибі! Я використовував curlпозначене WinSSLв Windows 7. Відповідно до посилання на документацію, так позначені версії повинні працювати лише за допомогою сертифікатів системи. Однак я отримував помилку, поки не дотримувався вашого рішення.
Джордж

Однак якщо кінцевий користувач не має права адміністратора, він не зможе помістити новий сертифікат на папки, що належать до системи. Як варіант, користувач може використовувати змінну середовища set CURL_CA_BUNDLE=<path to crt>. Переконайтеся, що формат файлу правильний. Цей метод спрацює, навіть якщо у вас є кілька curlустановок, наприклад, git, бродячий ...
Aaron C

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.