Laravel Guzzle: ошибка скручивания 77, ошибка установки сертификата, проверка местоположения - PullRequest
0 голосов
/ 15 мая 2018
  • ОС: Ubuntu 16.04
  • PHP: 7.2
  • CURL: curl 7.47.0 (x86_64-pc-linux-gnu) libcurl / 7.47.0 GnuTLS / 3.4.10zlib / 1.2.8 libidn / 1.32 librtmp / 2.3
  • Guzzle: 6.3

Мой проект в настоящее время использует некоторые пакеты, которые зависят от Guzzle, например: AWS, Mailgun ... Однако, он часто выкидывал эту ошибку:

error: cURL error 77: error setting certificate verify locations:
CAfile: /etc/ssl/certs
CApath: /etc/ssl/certs (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

Ниже приведена часть моего php.ini

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo='/etc/ssl/certs/ca-certificates.crt'

[openssl]
; The location of a Certificate Authority (CA) file on the local     filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
openssl.cafile='/etc/ssl/certs/ca-certificates.crt'

; If openssl.cafile is not specified or if the CA file is not found, the
; directory pointed to by openssl.capath is searched for a suitable
; certificate. This value must be a correctly hashed certificate directory.
; Most users should not specify a value for this directive as PHP will
; attempt to use the OS-managed cert stores in its absence. If specified,
; this value may still be overridden on a per-stream basis via the "capath"
; SSL stream context option.
openssl.capath='/etc/ssl/certs/'

Ничего из этой работы, даже если поиск через ini_get () это нормально и полностьюраспознан.На данный момент я должен сделать обходной путь, изменив vendor / guzzlehttp / guzzle / src / Client.php и изменив конфигурацию по умолчанию на 'verify' => '/ etc / ssl / certs / ca-certificates.crt ' тогда все в порядке (что я считаю не лучшим вариантом)

получение с помощью init_get ()

array(8) {
["default_cert_file"]=> string(21) "/usr/lib/ssl/cert.pem"
["default_cert_file_env"]=>  string(13) "SSL_CERT_FILE"
["default_cert_dir"]=>  string(18) "/usr/lib/ssl/certs"
["default_cert_dir_env"]=>  string(12) "SSL_CERT_DIR"
["default_private_dir"]=>  string(20) "/usr/lib/ssl/private"
["default_default_cert_area"]=>  string(12) "/usr/lib/ssl"
["ini_cafile"]=>  string(34) "/etc/ssl/certs/ca-certificates.crt"
["ini_capath"]=>  string(15) "/etc/ssl/certs/"
}

openssl.cafile: /etc/ssl/certs/ca-certificates.crt
curl.cainfo: /etc/ssl/certs/ca-certificates.crt

Примечание : я пытался настроить ~ / .curlrc вместе с export CURL_CA_BUNDLE = / etc / ssl / certs / ca-сертификаты.crt но ничего из этого не работаетУ кого-нибудь есть какое-либо решение или какой-либо ключ, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 03 июля 2018

Относится к «проблеме с сертификатом SSL: невозможно получить сертификат локального эмитента».Совершенно очевидно, что это относится к системе, отправляющей запрос CURL (а не к серверу, получающему запрос)

  1. Загрузите последнюю версию cacert.pem из https://curl.haxx.se/ca/cacert.pem

  2. Добавьте следующую строку в php.ini (если это общий хостинг, и у вас нет доступа к php.ini, вы можете добавить его в .user.ini в public_html)

    curl.cainfo="/path/to/downloaded/cacert.pem"
    

    Убедитесь, что вы заключили путь в двойные кавычки !!!

  3. предоставьте разрешение пользователю вашего веб-сервера, например, ngnix или www-data, на чтение файла.

    sudo chown www-data /etc/ssl/certs/cacert.pem
    
  4. последний шаг, перезапустите fpm и ngnix или apache

...