Я понимаю, что могу установить опцию на любом конкретном экземпляре, однако мне бы очень хотелось установить что-то php.ini или где-то подобное, которое будет обрабатывать это во всех проектах и во всех экземплярах.
Кто-нибудь знает, как мне это сделать?
EDIT: меня особенно интересует решение, которое позволит сертификатам находиться в разных местах на разных серверах.
Я разрабатываю на Windows-машине, которая нуждается в этом, но развертывается на сервере Linux, который не только не нуждается в нем, но даже не имеет указанного пути.
Я понимаю, что я могу использовать условия, чтобы проверить, где работает код, но предпочел бы, чтобы он работал из коробки. Мне кажется, что это действительно проблема для curl и PHP для обработки, а не для моего кода, и, следовательно, настройки для нее принадлежат.
Я нашел ответ здесь (в примечаниях пользователя): http://php.net/manual/en/function.curl-setopt.php
Просто добавьте это вам .ini (обратите внимание: вы не можете использовать ini_set
, хотя я не знаю, почему вы хотели бы. Спасибо @Carlton):
curl.cainfo=c:\php\cacert.pem
И получить этот файл: http://curl.haxx.se/docs/caextract.html
Работает, и вы не открываете себя для атак MITM
Вот патч, чтобы «эмулировать» то, что мы можем видеть в linux, когда действительные данные crt были найдены во время сборки (что имеет место почти для всех дистрибутивов):
http://www.php.net/~pierre/patches/curl_cacert_default.txt
он добавляет (системные) настройки ini для определения пути к cacert, curl.cainfo = c: \ curl \ ca.crt
Данные cacert можно получить здесь: http://curl.haxx.se/docs/caextract.html
DLL для php 5.3 можно найти здесь: http://www.php.net/~pierre/test/curl-5.3-vc9-x86-ts-nts-cainfodefault.zip DLL для php 5.2 можно найти здесь: http: //www.php.net/~pierre/test/curl-5.2-cainfodefault.zip
Пожалуйста, дайте мне знать, как это работает.
@Matt прав, но я бы добавил, что curl.cainfo является директивой PHP_INI_SYSTEM, поэтому вы должны установить его в php.ini … использование функции ini_set в скрипте всегда будет возвращать false, как я узнал после слишком большого количества минут треск
[curl] curl.cainfo="C:/xampp/php/cacert.pem"
Вы можете создать функцию-оболочку, которая устанавливает этот параметр, и использовать файл auto_prepend_file для php.ini для загрузки файла, в котором он определен, но ваш код нужно будет изменить, чтобы вместо этого использовать эту функцию-оболочку.
Пример:
function my_curl_init($url=null) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cert/ca.crt'); return $ch; }