Аутентификации по Сертификатам открытых ключей

Тема в разделе "PHP", создана пользователем smertnik, 5 мар 2014.

Модераторы: latteo
  1. smertnik

    smertnik Постоялец

    Регистр.:
    5 июн 2006
    Сообщения:
    68
    Симпатии:
    30
    Всем привет. Помогите решить задачу аутентификации по Сертификатам открытых ключей.

    Данные которые есть:
    Коммуникационные соединения через сеть интернет защищаются с помощью криптографического протокола TLS версии не ниже 1.0 c использованием аутентификации по Сертификатам открытых ключей.
    При соединении по протоколу TLS разрешены только следующие стойкие криптографические алгоритмы.

    Ассиметричное шифрование: алгоритм RSA с минимальной длиной ключа 2048 бит.
    Обмен ключами: алгоритм Диффи-Хеллмана (англ. Diffie-Hellman, DH).
    Цифровая подпись: алгоритм DSA.
    Симметричное шифрование: алгоритмы TripleDES, AES128, AES256 с режимом шифрования CBC (англ. Cipher Block Chaining).
    Получение хэш-функций: алгоритмы SHA-1, SHA-2.
    При соединении Платёжный шлюз проверяет сертификат и разрешенные криптографические параметры.
    Прикладные данные, обслуживающие запросы, передаются между Платёжным шлюзом и ИС ТСП в виде XML-сообщений по протоколу HTTP (сontent-type: text/xml) методом POST.
    Передаваемые данные имеют кодировку UTF-8.

    Что вышло сделать:

    Код:
    $fOut = fopen($_SERVER["DOCUMENT_ROOT"].'/keys/curl_out.txt', "w");
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", "Accept: text/xml"));
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 GTB6");
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    
    curl_setopt($ch, CURLOPT_SSLCERT, $_SERVER["DOCUMENT_ROOT"].'/keys/pubkey.pem');
    curl_setopt($ch, CURLOPT_SSLKEY, $_SERVER["DOCUMENT_ROOT"].'/keys/webshop_key.pem');
    curl_setopt($ch, CURLOPT_CAINFO, $_SERVER["DOCUMENT_ROOT"].'/keys/Bank-all-CA.pem');
    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlData);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    curl_setopt($ch, CURLOPT_STDERR, $fOut);
    
    $output = curl_exec($ch);
    if(!$output)
    {
        echo "Curl Error : " . curl_error($ch);
    }
    else
    {
        $info = curl_getinfo($ch);
        echo '<pre>'.print_r($info, true).'</pre>';
        echo htmlentities($output);
    }
    
    Проверка ключа платежного шлюза проходит (CURLOPT_SSL_VERIFYHOST, CURLOPT_SSL_VERIFYPEER) - это обязательное условие. А с моей стороны сертификат не передается для аутентификации, куда дальше копать уже не знаю. Прошу помочь или натолкнуть на мысль, что тут не хватает?