在TLS会话恢复在PHP

在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做一个恢复握手?

任何帮助将不胜感激!

+1

......或反驳。 :) – bishop

+0

file_get_contents()通常在请求...之后立即关闭TCP连接。需要保持活着的连接头和fopen()的句柄...我可惜没有足够的时间来调查现在: -/ – bwoebi

你可以试试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)不会破坏你的基准。我确实测量了这两个请求的性能,这有点违反直觉,但第二个几乎慢了两倍。

+1

感谢您的解决方案,这几乎是我最终实现它!而且我也意识到,使用php作为我的论文并不是最佳选择,但没有时间切换语言。话虽如此,我的论文将由我的大学出版。 – Nicolas