За последние 24 часа нас посетил 16501 программист и 1569 роботов. Сейчас ищут 925 программистов ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем stolium, 20 авг 2014.

  1. stolium

    stolium Новичок

    С нами с:
    20 авг 2014
    Сообщения:
    3
    Симпатии:
    0
    Привет всем!


    Есть задача авторизовать 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 дефолтные. Клиентский сертификат подписан сертификатом ca.crt.


    При попытке подключения ssl пишет в лог:
    [ssl] [pid 2970] [client 127.0.0.1:57633] AH01964: Connection to child 6 established (server test:443)
    [ssl] [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] [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] [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, и не передавать сертификат, то все работает на ура.


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


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

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не знаю =(
     
  3. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    а какое значение у SSLVerifyDepth в конфиге апача?
     
  4. stolium

    stolium Новичок

    С нами с:
    20 авг 2014
    Сообщения:
    3
    Симпатии:
    0
    Сейчас в конфиге не указан этот параметр. Но при любом, отличном от нуля значении, все так же плохо.
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
  6. stolium

    stolium Новичок

    С нами с:
    20 авг 2014
    Сообщения:
    3
    Симпатии:
    0
    Спасибо за ссылку, сегодня после очередного теста хоста формата: openssl s_client -connect host: port -cert client.cer -key client.key до меня дошло что в моем .pem файле не содержится приватного ключа. Добавил и все заработало.