PHP CURL и SSL сертификат (или цепочка сертификатов) - PullRequest
1 голос
/ 20 августа 2011

Добрый день!

У меня есть REST API, который доступен через SSL (https://). Я хотел бы поставить правильный сертификат (или цепочку сертификатов) вместе со своими сценариями, написанными на PHP и CURL, чтобы сделать запрос.

Вот как выглядят сертификаты из моей цели (http://api.vkontakte.ru) в Firefox:

http://speedcap.net/img/bc687485819715c65d6fe1e4ca1fdc40/1a2be.png

Вот фрагмент из сохраненной "цепочки сертификатов"X.509 в формате PEM "от Firefox (описано здесь: http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/):

-----BEGIN CERTIFICATE-----
MIIFVzCCBD+gAwIBAgIHKx5Ov2FOejANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
[..skip...]
0npsf5fkvT8E13NgVY0PK6V/baMTlTgWXKQZ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
[..skip...]
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
U+4=
-----END CERTIFICATE-----

Вот пример кода инициализации CURL:

$this->ch = curl_init();
    curl_setopt_array($this->ch, array(

        CURLOPT_TIMEOUT => 30,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_AUTOREFERER => TRUE,
        CURLOPT_FOLLOWLOCATION => TRUE,

        CURLOPT_SSL_VERIFYPEER => TRUE,
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_CAINFO => <path to my cert>,        
    )); 

У меня ошибка CURL 60 (CURLE_SSL_CACERT) жалуется на wron cert.

Что я пробовал:

  • Я проверил, что мой файл сертификата используется, потому что, когда я указываю неправильный путьон жалуется, что не может найти сертификат (ошибка 70)

  • Я проверил с помощью SDK Facebook и их цепочки сертификатов, что мой CURL работает с такой настройкой

  • Я пытался экспортировать различные цепочки (включая или исключая) последний сертификат в цепочке

  • Пробовал CURLOPT_SSL_VERIFYHOST => 1.

Любые идеиДобро пожаловать!

Ответы [ 3 ]

2 голосов
/ 26 февраля 2013

Вконтакте перешел с домена vkontakte.ru на vk.com несколько лет назад.И они также меняют свой URL обработчика API.Это мое решение:

  1. Открыть https://vk.com/ в Firefox
  2. Экспортировать цепочку сертификатов как X.509 для этого сайта
  3. Изменить целевой URL с http://api.vkontakte.ru до https://api.vk.com/

Это мой код с параметрами curl:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() ."/ffchainvk.crt"); //  ok

Где ffchainvk.crt - файл с экспортированной цепочкой сертификатов.

2 голосов
/ 20 августа 2011

Curl использует сертификаты CA в отдельном месте на сервере, чем остальная часть системы, как на рабочем столе.Я должен был установить сертификаты CA в файловую систему раньше.PHP libcurl будет использовать библиотеки, которые также использует утилита командной строки.Пожалуйста, смотрите http://curl.haxx.se/docs/sslcerts.html.

0 голосов
/ 01 февраля 2018

Вот шаги, которые, кажется, работают:

  1. Посетите URL-адрес https в Firefox
  2. Нажмите зеленую полосу, нажмите стрелку, а затем «Дополнительная информация»
  3. Нажмите «Просмотреть сертификат», затем перейдите на вкладку «Сведения» вверху
  4. Затем щелкните каждый уровень и экспортируйте каждый сертификат:

    Корневой CA

    Сервер CA и

    example-website.invalid .

    Вы должны сохранить все три файлана ваш компьютер.Скопируйте все три файла в один файл, например, custom_name_cert.pem

Скопируйте этот файл pem в каталог, доступный через PHP, в идеале файл имеет разрешения 644. Вы можете даже пойти на444, чтобы предотвратить вмешательство, и измените его на 644. Когда вам нужно его обновить.

Затем обновите путь в вашем коде, например:

CURLOPT_CAINFO => '/var/www/certs/custom_name_cert.pem'

ПРЕДУПРЕЖДЕНИЕ: Когда веб-сайт обновляет свои сертификаты SSL, указанный выше файл может устареть, и вызовы HTTPS cURL могут завершиться сбоем, что нарушит работу вашего приложения.Надеемся, что кто-то ответит здесь хорошим способом для автоматизации обновлений этого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...