Чому 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.