Авторизация SOAP клиента при помощи SSL сертификата

Привет всем!

Есть задача авторизовать SOAP client из Zend Framework (который по сути ни чем не отличается от обычного пхпшного клинта, кроме названия параметров), при помощи выданного клиентского сертификата.

Конфигурация сервера: Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.3 OpenSSL/1.0.1f
Конфигурация виртуалхоста где крутится SOAP сервер:
<VirtualHost _default_:443>
ServerAdmin test@localhost
ServerName test
DocumentRoot /var/www/test/public
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/test_error.log
CustomLog ${APACHE_LOG_DIR}/test_access.log combined

SSLEngine On
SSLCertificateFile /etc/ssl/my-server.crt
SSLCertificateKeyFile /etc/ssl/my-server.key
SSLCACertificateFile /etc/ssl/ca.crt
SSLOptions +StdEnvVars +ExportCertData

<Directory /var/www/test/public/>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

в htaccess помимо зендовых реврайтов дописано:
SSLRequireSSl
SSLVerifyClient require

Собственно сам запрос:
$local_cert = '/home/test/01.pem';
$wsdl = '/home/test/soap.wsdl';
$context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'allow_self_signed' => true,
'local_cert' => $local_cert,
),
));

$client = new Client($wsdl, array(
'stream_context' => $context,
));

$client->createOffer();

Запрос падает с ошибкой: Could not connect to host

Сразу скажу, что клиентские сертификаты импортированные в браузеры/soapUI проходят проверку
и успешно авторизуются на сервере (в soapUI происходит успешный вызов сервиса). Серверный сертификат является самоподписанным (поэтому в контексте включена соответсвующая опция), все сертификаты были сгенерированы на текущей версии openssl. Настройки ssl.conf дефолтные.

При попытке подключения ssl пишет в лог:
[ssl:info] [pid 2970] [client 127.0.0.1:57633] AH01964: Connection to child 6 established (server test:443)
[ssl:debug] [pid 2970] ssl_engine_io.c(1212): (70014)End of file found: [client 127.0.0.1:57633] AH02007: SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]
[ssl:info] [pid 2970] [client 127.0.0.1:57633] AH01998: Connection closed to child 6 with abortive shutdown (server test:443)

В результате проведенных опытов над пациентом было выяснено что такая ошибка падает при попытке передачи клиентского сертификата в параметре local_cert. Если этот параметр не передавать то клиент падает с ошибкой Error Fetching http headers, а в лог пишется:
[ssl:info] [pid 1471] SSL Library Error: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate -- No CAs known to server for verification? (собственно как я понимаю, тут все закономерно, все упало потому что небыло передано сертификата)
Если же выключить опцию SSLVerifyClient require, и не передавать сертификат, то все работает на ура.

Получается что при попытке отдать сертификат клиент сам рвет соединение во время хэндшэйка... Но вот почему он это делает ума не приложу(

Спасибо всем кто дочитал этот длиннопост до конца!
Заранее благодарен за ваши ответы, мысли, гайды и конструктивную критику!
 

AnrDaemon

Продвинутый новичок
Код:
openssl s_client -connect host:port -cert client.cer
Блин, какого чёрта форум смайлы посреди текста лепит?....
 

hell0w0rd

Продвинутый новичок
AnrDaemon, потому что форумы для постинга котят создают, а не для программистов. Для программистов бы давно сюда github-markdown вставили уже
 
Код:
openssl s_client -connect host:port -cert client.cer
Блин, какого чёрта форум смайлы посреди текста лепит?....
Сравнил свой тестовый запрос формата openssl s_client -connect host: port -cert client.cer -key client.key и понял что ему не хватает приватного ключа. Добавил приватный ключ в .pem файл, все заработало. Спасибо!
 

AnrDaemon

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