PHP-клиент для проверки сертификатов https

#php #web-services #ssl #https

#php #веб-службы #ssl #https

Вопрос:

Мне нужно создать php, который будет действовать как клиент и использовать некоторые веб-службы под https. Моя проблема в том, что я также хочу проверить сертификат сервера.Мне нужно знать, что у меня правильный сервер и что нет никого посредника, который выступает в качестве сервера. Кто-нибудь может мне помочь, пожалуйста?

Спасибо!

Комментарии:

1. Хороший шаг, но бесполезный для проверки атак типа «человек посередине». Google «Diginotar», чтобы понять, почему вся система SSL CA фундаментально нарушена.

2. @Marc B: Без каких-либо принципиальных разногласий я хотел бы отметить, что вы можете избежать многих проблем на практике, если позаботитесь о том, чтобы список доверенных центров сертификации был как можно короче. Например, в подобном случае действительно нет необходимости доверять какому-либо CA, кроме конкретного, используемого сайтом, к которому вы подключаетесь.

Ответ №1:

Если у вас есть расширение curl, его можно настроить для проверки сертификата при подключении.

http://php.net/manual/en/function.curl-setopt.php

 // As of writing this, Twitter uses Verisign, Google uses Eqifax
$exampleUrl = 'https://twitter.com/'; // Success
$exampleUrl = 'https://google.com/';  // Fails

// create a new CURL resource
$ch = curl_init($exampleUrl);

// enable verification
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

// list of CAs to trust
// If the remote site has a specific CA, they usually have a .crt
// file on their site you can download.  Or you can export key items from
// some browsers.
// In this example, using: Verisign [1]
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/ca_bundle.crt');
// - or -
curl_setopt($ch, CURLOPT_CAPATH, __DIR__ . '/ca_certs/');

// If the remote site uses basic auth:
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);

// And a helpful option to enable while debugging
//curl_setopt($ch, CURLOPT_VERBOSE, true);

// defaults to stdout, don't want that for this case.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$page = curl_exec($ch);
  

[1] http://www.verisign.com/support/verisign-intermediate-ca/extended-validation/apache /

Комментарии:

1. Спасибо! извините за глупый вопрос. но я не вижу, как я могу протестировать URL-адрес или использовать его в качестве клиента веб-службы. Я действительно новичок в php. 🙂

2. Соединение завершится ошибкой, если сервер не предоставит действительный сертификат, подписанный одним из центров сертификации в ca_bundle.crt

3. Спасибо за помощь! Но, тем не менее, как первый, так и второй вызовы не выдают никаких предупреждений. и когда я делаю ‘var_dump ($ page)’, я получаю логическое значение false. Пожалуйста, помогите … 🙂 И после этого, как я могу вызвать функции сервера? (например, как клиент soap?)

4. Пожалуйста, обратите внимание на ошибку в приведенном выше коде: CURLOPT_SSL_VERIFYHOST должен быть целочисленным параметром и должен быть установлен в 2 (по умолчанию). См . php.net/manual/en/function.curl-setopt.php для получения более подробной информации. Если вы установите значение true равным , вы фактически отключаете проверку хоста и, следовательно, разрешаете атаки MITM!

5. @LeighSimpson Спасибо. Отредактировал ответ, чтобы исправить его.

Ответ №2:

Похоже, что начиная с Curl 7.10, теперь все это установлено для проверки по умолчанию:
http://php.net/manual/en/function.curl-setopt.php


CURLOPT_SSL_VERIFYPEER

FALSE, чтобы остановить cURL от проверки сертификата узла. Альтернативные сертификаты для проверки можно указать с помощью опции CURLOPT_CAINFO или каталог сертификатов можно указать с помощью опции CURLOPT_CAPATH.

TRUE по умолчанию, начиная с cURL 7.10. Пакет по умолчанию установлен с версии cURL 7.10.


CURLOPT_SSL_VERIFYHOST

1, чтобы проверить наличие общего имени в одноранговом сертификате SSL. 2. проверить наличие общего имени, а также убедиться, что оно соответствует указанному имени хоста. В производственных средах значение этого параметра должно быть равно 2 (значение по умолчанию).