2009-04-08 3 views
21

Я пытаюсь написать PHP-скрипт с использованием cURL, который может авторизовать пользователя через страницу, использующую сертификат SSL, в дополнение к имени пользователя и паролю, и я не могу получить после этапа SSL cert.Ошибка при использовании PHP cURL с сертификатами SSL

В этом случае curl_setopt($handle, CURLOPT_VERIFYPEER, 0), к сожалению, не является вариантом. Сертификат является обязательной частью аутентификации, в противном случае я получаю ошибку, указанную в this other similar SO post.

Я попробовал несколько командной строки выполняется с Curl:

> curl --url https://website

Это возвращает ошибку (60) SLL certificate problem. Если я регулирую команду включить --cacert вариант:

> curl --url https://website --cacert /path/to/servercert.cer

Он работает просто отлично; возвращается веб-сайт auth.

Однако, я попытался следующий PHP код:

$handle = curl_init(); 
$options = array( 
        CURLOPT_RETURNTRANSFER => false, 
        CURLOPT_HEADER   => true, 
        CURLOPT_FOLLOWLOCATION => false, 
        CURLOPT_SSL_VERIFYHOST => '0', 
        CURLOPT_SSL_VERIFYPEER => '1', 
        CURLOPT_CAINFO   => '/path/to/servercert.cer', 
        CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)', 
        CURLOPT_VERBOSE  => true, 
        CURLOPT_URL   => 'https://website' 
      ); 

curl_setopt_array($handle, $options); 
curl_exec($handle); 
if (curl_errno($handle)) { 
    echo 'Error: ' . curl_error($handle); 
} 
curl_close($handle); 

Я бы подумал, что код был по существу аналогичны командам оболочки, но вместо этого я поздоровался со следующим сообщением об ошибке:

Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none

Я прочитал всю литературу, которую я могу найти (особенно на php.net и curl.haxx), и, похоже, не может найти ничего, что устраняет эту проблему. Какие-либо предложения?

EDIT: Я пробовал chmod 777 servercert.cer без каких-либо успехов. Однако при выполнении PHP-скрипта с указанным выше кодом из командной строки вместо браузера через php test.php он работает отлично. Любое объяснение того, почему он не работает в браузере?

РЕДАКТИРОВАТЬ 2: Эти дисквалификации на единственные души, достаточно храбрые, чтобы ответить на этот вопрос, стареют. Либо сделайте что-нибудь значимое, либо передайте, пожалуйста.

+0

Есть ли у PHP определенно разрешение на чтение этого файла? Попробуйте запустить скрипт из командной строки: php my.php – Greg

+0

Странно! Я тестировал его, как вы сказали, и он отлично работал! Зачем это работать из командной строки, но не из браузера? – Magsol

+0

http://serverfault.com/questions/121768/curl-or-ssl-problems-how-to-solve/297484#297484 – 2011-08-04 09:20:47

ответ

11

Потому что все работает через командную строку, но не через php, используя curl, тогда я буду преследовать завиток, являющийся проблемой.

В соответствии с этим URL, http://curl.haxx.se/docs/sslcerts.html, которая была ссылка в SO опубликовать вы упоминавшееся выше (reading SSL page with CURL (php)) ...

«До 7.18.0, завиток не в комплекте с сильно устаревшую ча расслоение файл, который был установлен на по умолчанию. В эти дни архивы curl не содержат сертификатов ca на . Вам нужно получить их в другом месте. Например,

Если удаленный сервер использует самозаверяющий сертификат, если вы не устанавливаете CA комплект сертификатов, если сервер использует сертификат, подписанный ЦС, который не является i микробатареи в комплекте вы используете или если удаленный хост самозванец выдает себя за свой любимый сайт, и вы хотите перенести файлы из этого сервера, выполните одно из следующих действий:»

Затем он продолжает перечислять ряд шагов, которые вы можете попробовать.

Поскольку ваша версия 7.16.3 завитка до 7.18.0, если вы еще этого не сделали, я бы рекомендовал обновить компоненты curl и openssl, а затем работать с указанным выше списком.

3

Теперь, когда этот вопрос является старым, но может быть полезным для некоторых пользователей, которые ищут ответ в настоящее время.

У меня аналогичная проблема с API с SSL, проблема с CURL (а не с браузерами). Моя проблема заключалась в том, что я просто поместил сертификат, но не цепочку цепочек/пакетов. Затем я положил это, и все начало работать. Поэтому это важно для того, чтобы избежать проблем.

Надеюсь, это может быть полезно для кого-то.

5

После 6 лет вопроса, я встречаю ту же проблему с общим хостом, и, видимо, нет удовлетворительного ответа. Я нашел для себя решение, надеюсь, что это полезно для всех.

Вы можете попробовать этот конфиг:

curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0); 
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1); 
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt'); 
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt'); 

Я встретил ту же ошибку с @Magsol: Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none; поэтому я добавил 4-ю строку для установки CAPath.

Это работа со мной. Но обратите внимание: файл CA должен находиться в доступном каталоге dir (с chmod 755 или 777), и лучше, если файл CA находится в том же каталоге с файлом PHP.

+0

Это работало, ** только если я установить путь, абсолютный путь ** ... если у вас есть 'ca-bundle.crt' в том же каталоге, что и вызывающий PHP-файл, это означает, что путь будет фактически' __DIR __. '/ ca-bundle.crt'' –

0

разработать и Суммируя все это:

, если у вас есть PHP файл с помощью PHP локон и поместить сертификат CA. для систем в том же каталоге, приведенный ниже код даст вам Jumpstart

$url = "https://myserver.mydomain.local/get_somedata.php"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 

//These next lines are for the magic "good cert confirmation" 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_VERBOSE, true); 

//for local domains: 
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included 
//place the pem or crt ca certificate file in the same directory as the php file for this code to work 
    curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem'); 
    curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem'); 

//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause  
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

//Error handling and return result 
    if (curl_exec($ch) === false) 
     { 
     $result = curl_error($ch); 
     } 
    else 
     { 
     $result = curl_exec($ch); 
     } 
    // Close handle 
    curl_close($ch); 
    return $result; 
+0

oops if statement в конце вызывает двойной вызов ... мой плохой, настроить как таковой –

+0

$ data = curl_exec ($ ch); if ($ data === false) { $ result = curl_error ($ ch); } else { $ result = $ data; } –