我正在编写一个多线程php客户端,它向apache反向代理发出https请求,并测量一些统计数据。我正在写一篇关于提高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中进行恢复握手?
如有任何帮助,我们将不胜感激!
您可以尝试PHP curl并使用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_StL_CIPHER_LIST。此外,我认为你应该换一种不同的语言,因为PHP有自己的怪癖,如果你证明或反驳了这一论点,最好使用更接近裸机的语言,这样你就可以确保额外的层(PHP)不会破坏你的基准。我确实测量了两个请求的性能,这有点违背直觉,但第二个请求几乎慢了两倍。