
Когда я пытаюсь использовать Curl в Windows для получения https
URL-адреса, я получаю ужасную «ошибку подключения (60)».
Точное сообщение об ошибке:
curl: (60) Проблема с сертификатом SSL, проверьте, что сертификат CA в порядке. Подробности:
ошибка:14090086:Процедуры SSL:SSL3_GET_SERVER_CERTIFICATE:сбой проверки сертификата
Подробнее здесь:http://curl.haxx.se/docs/sslcerts.html
Как решить эту проблему?
решение1
Не знаю почему, но я не нашел всю эту информацию в одном месте.
Загрузите версию Curl с поддержкой SSL или создайте ее самостоятельно.
Отhttp://curl.haxx.se/docs/caextract.html, Загрузите файл cacert.pem.
Поместите файлы curl.exe и .pem в один каталог.
Переименуйте
cacert.pem
файл вcurl-ca-bundle.crt
Перезапустите 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.