Php curl with ssl certificate

Use clientside ssl certificate with curl and php

Clientside certificates are often used in soap webservices. For example the wsdl file link might require a clientside certificate. The server throws an error like this :

Curl Command

To use clientside certificate with curl , test the following command

curl —cert certificate_file.pem https://www.example.com/some_protected_page
or
curl —cert certificate_file.pem:password https://www.example.com/some_protected_page

The above command should fetch the protected page which required the clientside certificate.

Php Code

Once the above command works, the equivalent code in php would be :

<?php $url = "https://www.example.com/some_protected_page"; $cert_file = ‘certificate_file.pem’; $cert_password = ‘password’; $ch = curl_init(); $options = array( CURLOPT_RETURNTRANSFER => true, //CURLOPT_HEADER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_USERAGENT => ‘Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)’, //CURLOPT_VERBOSE => true, CURLOPT_URL => $url , CURLOPT_SSLCERT => $cert_file , CURLOPT_SSLCERTPASSWD => $cert_password , ); curl_setopt_array($ch , $options); $output = curl_exec($ch); if(!$output) < echo "Curl Error : " . curl_error($ch); >else

The above code would use the certificate file and the password to fetch the url.

Certificate Formats

SSL certificates come in a variety of formats like cer , pfx , pem etc. When using curl its a good idea to convert pfx certificate files to pem format.

The openssl command can be used to do this.

$ openssl pkcs12 -in cert_file.pfx -out cert_file.pem
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying — Enter PEM pass phrase:
$

A Tech Enthusiast, Blogger, Linux Fan and a Software Developer. Writes about Computer hardware, Linux and Open Source software and coding in Python, Php and Javascript. He can be reached at [email protected] .

Источник

SSL из PHP: socket и cURL

Сегодня, этим сонным летним утром, я расскажу вам про SSL соединение из PHP скрипта. Расскажу исходя не только лишь из теории, а ещё и решая вполне себе практическую задачу — логин на гугловский блогосервис blogger.com.

Начнём с сокетов. В хелпе заявлена возможность использования HTTPS протокола, поэтому пробуем. Набор POST переменных взят из developer’s guide. Хабрапарсер обрамляет мыло ссылкой, поэтому «@» заменена на (at).

$postvars = array( 
"Email" => "mail(at)gmail.com",
"Passwd" => "pass",
"service" => "blogger"
);

$postdata = "";
foreach ( $postvars as $key => $value )
$postdata .= "&".rawurlencode($key)." ssl://google.com", 443);
$send = "";
$send .= "POST /accounts/ClientLogin HTTP/1.1\r\n";
$send .= "Host: google.com\r\n";
$send .= "Content-length: ".strlen($postdata)."\r\n";
$send .= "Content-type: text/plain\r\n";
$send .= "Connection: close\r\n";
$send .= "\r\n";
$send .= $postdata."\r\n\r\n";

fputs($fp, $send);
$html = fread($fp, 1000000);
fclose($fp);

echo "".$html."

В функции fsockopen в качестве префикса перед именем сервера используем не https, а ssl. Так прямым текстом написано в хелпе. Дальше всё просто. Формируем HTTP-header, и пихаем его в открытый сокет. Читаем ответ, и получаем

Короче, если опустить часовые мытарства и пляски вокруг функций сокета, у меня ничего не вышло. Ну то есть не вышло передать POST данные, хотя GET запросы возвращаются нормально. Может это связано только с гугловским сервером, а где-то в другом месте получится.

UPD. Огромное спасибо хабраюзеру anabolik, который подсказал что если изменить одну строку заголовка и сделать
$send .= «Content-type: application/x-www-form-urlencoded\r\n»;
то всё сразу заработает. Ещё раз спасибо. Отблагодарил всякими способами =).

Переходим ко второму способу.

Открываем страницу мана про cURL и радуемся. Столько возможностей для запросов, для всякого конфигурирования. Должно получиться. Итак, лезем в curl_setopt. Нам понадобятся
CURLOPT_URL — это URL запроса.
CURLOPT_POST — говорим, что будем посылать POST запрос.
CURLOPT_POSTFIELDS — собственно POST переменыые.
CURLOPT_RETURNTRANSFER — вернуть результат запроса, а не выводить в браузер.

Теперь собственно о SSL параметрах:
CURLOPT_SSL_VERIFYPEER — если поставить его в 0, то удалённый сервер не будет проверять наш сертификат. В противном случае необходимо этот самый сертификат послать.
CURLOPT_CAINFO — указывать файл сертификата, если CURLOPT_SSL_VERIFYPEER установлен в 1.
CURLOPT_SSLVERSION — целое число, указывает версию SSL (2 или 3), обычно определяется автоматически.
CURLOPT_SSL_VERIFYHOST — будет ли производиться проверка имени удалённого сервера, указанного в сертификате. Если установить значение «2», то будет произведена ещё и проверка соответствия имени хоста. (если честно, я так и не понял что делает этот флаг)

Вот и всё. Нам для гугла понадобится только указать, что мы с собой никаких сертификатов не принесли, пустите нас так пожалуйста. Пишем код.

$postvars = array(
«Email» => «mail(at)gmail.com»,
«Passwd» => «pass»,
«service» => «blogger»
);

$postdata = «»;
foreach ( $postvars as $key => $value )
$postdata .= «&».rawurlencode($key).» https://www.google.com/accounts/ClientLogin»);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);

В переменной $result у нас теперь находятся три строки, из которых нужна только одна — последняя, которая начинается с «Auth=». Но про это, наверное, в следующий раз.

Источник

nebulak / cert-curl.php

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

//source: http://www.zedwood.com/article/php-curl-connect-with-ssl-client-certificate
class SecureRequest
private m_publicCertPath; //»/public_cert.pem»
private m_privateCertPath; //»/private.pem»)
private m_caInfoPAth; //»/etc/ssl/certs/ca-certificates.crt»
public function init ( $ publicCertPath , $ privateCertPath , $ caInfoPath )
$ this -> m_publicCertPath = $ publicCertPAth ;
$ this -> m_privateCertPath = $ privateCertPath ;
$ this -> m_caInfoPath = $ caInfoPath ;
>
public function post ( $ url , $ data )
return $ this -> sendRequest (» POST «, $ url , $ data );
>
public function get ( $ url , $ data )
$ queryData = http_build_query( $ data );
$ urlWithData = $ url . ‘?’ . $ queryData ;
return $ this -> sendRequest (» GET «, $ urlWithData , array ());
>
private function sendRequest ( $ method , $ url , $ data )
//TODO: enforce https://-url
//$data = array(‘key’=>’value’);
$ ch = curl_init();
curl_setopt( $ ch , CURLOPT_URL , $ url );
curl_setopt( $ ch , CURLOPT_PORT , 443 );
curl_setopt( $ ch , CURLOPT_VERBOSE , 0 );
curl_setopt( $ ch , CURLOPT_HEADER , 0 );
curl_setopt( $ ch , CURLOPT_SSLCERT , $ this -> m_publicCertPath );
curl_setopt( $ ch , CURLOPT_SSLKEY , $ this -> m_privateCertPath );
curl_setopt( $ ch , CURLOPT_CAINFO , $ this -> m_caInfoPath );
curl_setopt( $ ch , CURLOPT_SSL_VERIFYPEER , 1 );
curl_setopt( $ ch , CURLOPT_RETURNTRANSFER , 1 );
if ( strtoupper( $ method ) == » POST » )
curl_setopt( $ ch , CURLOPT_POST , 1 );
curl_setopt( $ ch , CURLOPT_POSTFIELDS , http_build_query( $ data ));
>
$ response = curl_exec( $ ch );
//$info =curl_errno($ch)>0 ? array(«curl_error_».curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch);
//print_r($info);
curl_close( $ ch );
return $ response ;
>
>
?>

Источник

Студия WeltkindСоздание сайтов в Бишкеке

В процессе интеграции веб приложений с другими приложениями, зачастую, может возникнуть задача:

  • Идентифицировать удаленный сервер, используя сертификат .cer.
  • Идентифицировать себя для удаленного сервера, используя сертификат .pfx
  • Передать данные, используя curl

Для решения этой задачи средствами php – curl, нам требуется иметь сертификаты в формате: .crt и .pem

Воспользуемся программой openssl.
После скачивания и установки, переконвертируем сначала клиентский сертификат

V:\ssl\bin\openssl.exe pkcs12 -in V:\ssl\cert.pfx -out V:\ssl\cert.key
V:\ssl\bin\openssl.exe rsa -in V:\ssl\cert.key -out V:\ssl\cert.pem
V:\ssl\bin\openssl.exe x509 -in V:\ssl\cert.key >> V:\ssl\cert.pem

V:\ssl\ — путь где установлена программа openssl и там же лежат наши сертификаты.

После второй команды наc попросят указать наш текущий пароль и задать новый. Новый пароль, мы будем использовать далее.

Все готово. Теперь, используя CURL соединение, подключимся к удаленному серверу.
Например:

curl_setopt($ch, CURLOPT_URL, ‘https://xxx.xxx.xxx.xxx/’);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

В настройках CURL-соединения следует указать:

curl_setopt($ch, CURLOPT_VERBOSE, ‘1’);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, ‘1’);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CAINFO, ‘путь к .crt файлу’);
curl_setopt($ch, CURLOPT_SSLCERT, ‘путь к .pem файлу’);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, ‘новый пароль’);

Источник

Читайте также:  Java bounds что это
Оцените статью