Ситдиков Роман
Новичок
Привет всем!
Есть задача авторизовать 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
eer did not return a certificate -- No CAs known to server for verification? (собственно как я понимаю, тут все закономерно, все упало потому что небыло передано сертификата)
Если же выключить опцию SSLVerifyClient require, и не передавать сертификат, то все работает на ура.
Получается что при попытке отдать сертификат клиент сам рвет соединение во время хэндшэйка... Но вот почему он это делает ума не приложу(
Спасибо всем кто дочитал этот длиннопост до конца!
Заранее благодарен за ваши ответы, мысли, гайды и конструктивную критику!
Есть задача авторизовать 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

Если же выключить опцию SSLVerifyClient require, и не передавать сертификат, то все работает на ура.
Получается что при попытке отдать сертификат клиент сам рвет соединение во время хэндшэйка... Но вот почему он это делает ума не приложу(
Спасибо всем кто дочитал этот длиннопост до конца!
Заранее благодарен за ваши ответы, мысли, гайды и конструктивную критику!