在TLS会话恢复在PHP
我正在写一个多线程的PHP客户端,使https请求到apache反向代理并测量一些统计数据。我正在撰写关于通过TLS会话恢复提高性能的学士论文。现在我需要做一个证明/证明这一点的概念证明。目前,我有这样的代码:在TLS会话恢复在PHP
$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做一个恢复握手?
任何帮助将不胜感激!
你可以试试PHP卷曲和使用CURL_LOCK_DATA_SSL_SESSION
从PHP文件http://php.net/manual/en/function.curl-share-setopt.php
CURL_LOCK_DATA_SSL_SESSION股份SSL会话ID,减少重新连接到同一台服务器时,花费在SSL握手的时间 。需要注意的是 SSL会话ID会被默认
同一手柄内重用你可以从上面的描述看,会话ID是由同一个手柄重用。但是如果你想把手之间共享,你可以使用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)不会破坏你的基准。我确实测量了这两个请求的性能,这有点违反直觉,但第二个几乎慢了两倍。
感谢您的解决方案,这几乎是我最终实现它!而且我也意识到,使用php作为我的论文并不是最佳选择,但没有时间切换语言。话虽如此,我的论文将由我的大学出版。 – Nicolas
......或反驳。 :) – bishop
file_get_contents()通常在请求...之后立即关闭TCP连接。需要保持活着的连接头和fopen()的句柄...我可惜没有足够的时间来调查现在: -/ – bwoebi