Возобновление сеанса TLS при переполнении стека

Я пишу многопоточный клиент php, который отправляет запросы https на обратный прокси-сервер apache и измеряет некоторую статистику. Я пишу дипломную работу о повышении производительности с помощью возобновления сеанса TLS. Теперь мне нужно сделать доказательство концепции, которая доказывает / опровергает это. На данный момент у меня есть этот код:

            $this->synchronized(function($this){
$this->before = microtime(true);
}, $this);

$url = 'https://192.168.0.171/';
# Some dummy data
$data = array('name' => 'Nicolas', 'bank account' => '123462343');

// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
),
"ssl" => array(
"verify_peer" => false,
"verify_peer_name" => false,
"ciphers" => "HIGH:!SSLv2:!SSLv3")
);

$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
$this->synchronized(function($this){
$this->after = microtime(true);
}, $this);

$this->counter_group->write($this->before, $this->after, $result);

Этот код работает для полного рукопожатия, но я не могу понять, как возобновить рукопожатие в php?

Любая помощь будет принята с благодарностью!

9

Решение

Вы можете попробовать PHP curl и использовать CURL_LOCK_DATA_SSL_SESSION

из документации PHP http://php.net/manual/en/function.curl-share-setopt.php

CURL_LOCK_DATA_SSL_SESSION Совместно использует идентификаторы сеанса SSL, сокращая время
потратил на рукопожатие SSL при повторном подключении к тому же серверу. Заметка
что идентификаторы сеанса SSL по умолчанию повторно используются в том же дескрипторе

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

$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

тогда вы можете использовать повторно $sh между разными запросами

$ch1 = curl_init('https://192.168.0.171');
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_SSLVERSION, 6); // TLSV1.2
curl_setopt($ch1, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');

curl_setopt($ch1, CURLOPT_POST, 1);
curl_setopt($ch1, CURLOPT_POSTFIELDS,
http_build_query( array('name' => 'Nicolas', 'bank account' => '123462343') ));
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$output = curl_exec($ch1);

а затем использовать повторно (возобновить рукопожатие)

$ch2 = curl_init('https://192.168.0.171');
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_SSLVERSION, 6); // TLSV1.2
curl_setopt($ch2, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// ( ... )
curl_exec($ch2);

и тесные связи

curl_close($ch1);
curl_close($ch2);

Но вам также нужно поиграть с CURLOPT_SSLVERSION и CURLOPT_SSL_CIPHER_LIST. Кроме того, я думаю, что вам следует переключиться на другой язык, так как у PHP есть свои причуды, и если вы докажете или опровергнете тезис, лучше использовать что-то ближе к голому металлу, чтобы вы были уверены, что дополнительный слой (PHP) не сломает ваш тесты. Я измерял производительность обоих запросов, и это немного нелогично, но второй почти в два раза медленнее.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]