#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 (значение по умолчанию).