2016-05-13 9 views
9

Ich schreibe einen Multithread-PHP-Client, der eine HTTPS-Anfragen an einen Apache umgekehrten Proxy macht und einige Statistiken misst. Ich schreibe eine Bachelorarbeit über die Verbesserung der Leistung mit TLS Session Resumption. Jetzt muss ich einen Proof of Concept machen, der dies beweist/widerlegt. Im Moment habe ich diesen Code:TLS-Session-Wiederaufnahme in 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); 

Dieser Code funktioniert eine vollständige Handshake zu tun, aber ich kann nicht scheinen, um herauszufinden, wie eine wiederaufgenommen Handshake in PHP zu tun?

Jede Hilfe würde sehr geschätzt werden!

+1

... oder widerlegt. :) – bishop

+0

file_get_contents() schließt die TCP-Verbindung sofort nach der Anfrage ... normalerweise. Needs keep-alive Verbindung Header und fopen() mit einem Handle ... Ich habe leider nicht genug Zeit, um jetzt zu untersuchen: -/ – bwoebi

Antwort

5

können Sie versuchen, curl PHP und CURL_LOCK_DATA_SSL_SESSION

von PHP-Dokumentation http://php.net/manual/en/function.curl-share-setopt.php

CURL_LOCK_DATA_SSL_SESSION Aktien SSL Session-IDs verwenden, die Verringerung der Zeit auf dem SSL-Handshake ausgegeben, wenn auf dem gleichen Server wieder anschließen. Hinweis , dass SSL-Session-IDs standardmäßig im gleichen Griff wiederverwendet wird

Wie Sie aus der obigen Beschreibung lesen können, wird die Session-ID mit dem gleichen Griff wiederverwendet werden. Aber wenn Sie zwischen den Griffen teilen möchten, können Sie curl_share_init zum Beispiel verwenden

$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); 

dann können Sie $sh zwischen verschiedenen Anträgen wiederzuverwenden

$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); 

und dann wiederverwendet werden (wieder Handshake)

$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); 

und enge Verbindungen

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

Aber Sie müssen auch mit CURLOPT_SSLVERSION und CURLOPT_SSL_CIPHER_LIST spielen. Ich denke auch, dass Sie zu einer anderen Sprache wechseln sollten, da PHP seine eigenen Eigenheiten hat und wenn Sie Thesen beweisen oder widerlegen, ist es besser, etwas näher an Bare Metal zu verwenden, so dass Sie sicher sind, dass die Extra-Ebene (PHP) nicht bricht Benchmarks. Ich habe die Leistung beider Anfragen gemessen und es ist etwas kontraintuitiv, aber die zweite ist fast doppelt so langsam.

+1

Vielen Dank für Ihre Lösung, das ist fast genau, wie ich es umgesetzt habe! Und ich erkannte auch, dass es nicht optimal war, PHP für meine Diplomarbeit zu verwenden, aber keine Zeit hatte, die Sprache zu wechseln. Davon abgesehen wird meine Abschlussarbeit von meiner Hochschule veröffentlicht. – Nicolas