2013-08-13 7 views
10

मैं stream_socket_server() का उपयोग कर सॉकेट सर्वर बनाने की कोशिश कर रहा हूं।PHP सॉकेट सर्वर जो एडीएच का उपयोग करता है। कैसे?

सामान्य कनेक्शन ठीक काम करते हैं, लेकिन मैं एक सर्वर बनाना चाहता हूं जो प्रमाण पत्र के बिना कनेक्शन को एन्क्रिप्ट करता है। मुझे पता है कि यह एडीएच सिफर के साथ पूरा किया जा सकता है, और हाँ, मुझे पता है कि यह सैद्धांतिक रूप से प्रमाण पत्र से कम सुरक्षित है ...

कारण मैं इस सर्वर को पहली जगह बना रहा हूं एक अलग सर्वर का नकल करना जिस पर एक ग्राहक कनेक्ट होता है (this protocol से अधिक, यदि आप सोच रहे हैं)।

क्लाइंट को पहले प्रमाणपत्र के लिए पूछने के लिए कॉन्फ़िगर किया गया है, और एडीएच पर फ़ॉलबैक - मैंने इसे वास्तविक चीज़ के साथ परीक्षण किया है, और यह बिना किसी समस्या के कनेक्ट करता है, इसलिए समस्या सॉकेट सर्वर के साथ है।

मैंने जो भी प्रयास किया है, उसके परिणामस्वरूप "हैंडशेक विफलता" त्रुटि हुई है।

विन्यास मैं कोशिश की है में से कुछ:

<?php 
$server = stream_socket_server(
     "tls://127.0.0.1:6667", 
     $errorno, 
     $errstr, 
     STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, 
     stream_context_create(
      array('ssl' => array('ciphers' => 'ADH')) 
     ) 
    ); 
?> 

<?php 
$server = stream_socket_server(
     "tls://127.0.0.1:6667", 
     $errorno, 
     $errstr, 
     STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, 
     stream_context_create(
      array('ssl' => array('ciphers' => '-COMPLEMENTOFALL ADH')) 
     ) 
    ); 
?> 

मैं भी ग्राहक बिना शर्त ADH का उपयोग (ऊपर दूसरा उदाहरण में है), बस परीक्षण की खातिर के लिए समायोजित करने की कोशिश की है, लेकिन वह भी विफल रहता है।

यह मेरे द्वारा किए गए प्रत्येक PHP संस्करण के साथ होता है, जिसमें से नवीनतम 5.5.0 है।

कोई विचार?

+0

भी इस देख सकते हैं इस मदद हो हो सकता है आप http://christophh.net/2012/ देखते 07/24/php-socket-प्रोग्रामिंग/ – krishna

+0

@ कृष्णा उस लेख में एन्क्रिप्शन का भी उल्लेख नहीं है, और यह देखते हुए कि अनएन्क्रिप्टेड कनेक्शन ठीक काम करता है, यह बिल्कुल मदद नहीं करता है। –

उत्तर

5

मैं तार पर जाने वाली बिट्स की जांच करने के लिए वायरसहार्क जैसे टूल का उपयोग करूंगा ताकि मैं यह निर्धारित कर सकूं कि हैंडशेक के साथ क्या गलत हो रहा है। उस क्षमता के बिना, आप उड़ने जा रहे हैं (या डीबगिंग) अंधे।

एक बार जब आप जानते हैं कि आपके हैंडशेक में क्या गलत हो रहा है, तो आप "क्यों" समझ सकते हैं।

+0

किसी कारण से, Wireshark मेरे कंप्यूटर से यातायात को अपने आप वापस नहीं लेता है। यह तब भी होता है जब मैं अपने कंप्यूटर (सार्वजनिक) आईपी के साथ "127.0.0.1" को प्रतिस्थापित करता हूं। मैं एक माध्यमिक कंप्यूटर स्थापित करने की कोशिश करूंगा, और देख सकता हूं कि यह चाल है ... –

+0

कच्चे बाइट्स यहां देखे जा सकते हैं https://gist.github.com/boenrobot/6331636 जहां तक ​​वायरशर्क डीकोड यह - हैलो पैकेट में केवल एडीएच सिफर होते हैं (जैसा कि इस विशेष परीक्षण के लिए अपेक्षित है), और सर्वर "हैंडशेक विफलता (40)" के साथ जवाब देता है। –

+0

ओह, और क्लाइंट पर, निम्न त्रुटि संदेश दिखाया गया है: "त्रुटि: 140 9 4410: एसएसएल दिनचर्या: SSL3_READ_BYTES: sslv3 अलर्ट हैंडशेक विफलता"। (विषम ...मैं दोनों सहकर्मियों पर टीएलएस का उपयोग कर रहा हूं, एसएसएलवी 3 नहीं) –

1

सबसे पहले जांचें कि SSL आपके सर्वर में सही तरीके से सेटअप है? सेवा में Run SSL Scanner। मेरे पास एक टेस्ट स्क्रिप्ट है जो बिल्कुल काम नहीं करती है, क्योंकि OpenSSL कॉल एक महत्वपूर्ण फ़ाइल के बिना नहीं चलती हैं। यह कोई जवाब नहीं है, लेकिन मुझे अधिक जांच के लिए समय नहीं है ...

आप जानते हैं कि एडीएच एक कमजोर एन्क्रिप्शन है? ~ अधिकांश सुरक्षा सलाहकार इसे बंद करने की सलाह देते हैं। ADH http://wiki.openssl.org/index.php/Manual:Ciphers(1)

+0

हां। जैसा कि मैंने शीर्ष पर कहा था, मुझे पता है कि एडीएच प्रमाण पत्र के साथ कनेक्शन से कम सुरक्षित है, और मैं एक इकाई परीक्षण में एक नकली के रूप में एक सर्वर बनाने की कोशिश कर रहा हूं, न कि "उत्पादन" उपयोग के लिए। असली सर्वर एडीएच को वैकल्पिक के रूप में समर्थन देता है जब सर्वर का कोई प्रमाण पत्र नहीं होता है। एसएसएलस्केन के लिए ... मैंने भाग लिया [एसएसएलस्केन का विंडोज पोर्ट] (http://code.google.com/p/sslscan-win/), और स्क्रिप्ट को stream_socket_accept() में विफलता पर फिर से समायोजित करने के बाद, मैं फिर भी विफलता पर, सभी सिफर को सर्वर के साथ "अस्वीकृत" के रूप में देखें, जैसा कि पहले उल्लेख किया गया था, उसी सटीक उसी पैकेट को वापस भेज रहा है। –

+0

बीटीडब्लू, ध्यान देने योग्य दिलचस्प बात ... ऊपर के रूप में परीक्षण सर्वर के साथ, मुझे केवल टीएलएसवी 1 और एसएसएलवी 3 सिफर "अस्वीकृत" और एसएसएलवी 2 को "असफल" के रूप में मिलता है। जब मैं एक खाली फ़ाइल को "local_cert" संदर्भ विकल्प के रूप में रखता हूं, तो मुझे एसएसएलवी 2 सिफर भी "अस्वीकृत" के रूप में मिलता है। –

+0

खाली स्थानीय प्रमाण ... मैं इसकी अपेक्षा करता हूं। चूंकि यह एक सुरक्षा बिंदु से लिखा गया है; एक खाली फ़ाइल एक अमान्य प्रमाण के समान है जो सभी को अस्वीकार करती है। –

1

पर सामान्य पढ़ने यह आप

<?php 
// PHP SOCKET SERVER 
error_reporting(E_ERROR); 
// Configuration variables 
$host = "127.0.0.1"; 
$port = 4041; 
$max = 20; 
$client = array(); 

// No timeouts, flush content immediatly 
set_time_limit(0); 
ob_implicit_flush(); 

// Server functions 
function rLog($msg){ 
      $msg = "[".date('Y-m-d H:i:s')."] ".$msg; 
      print($msg."\n"); 

} 
// Create socket 
$sock = socket_create(AF_INET,SOCK_STREAM,0) or die("[".date('Y-m-d H:i:s')."] Could not create socket\n"); 
// Bind to socket 
socket_bind($sock,$host,$port) or die("[".date('Y-m-d H:i:s')."] Could not bind to socket\n"); 
// Start listening 
socket_listen($sock) or die("[".date('Y-m-d H:i:s')."] Could not set up socket listener\n"); 

rLog("Server started at ".$host.":".$port); 
// Server loop 
while(true){ 
      socket_set_block($sock); 
      // Setup clients listen socket for reading 
      $read[0] = $sock; 
      for($i = 0;$i<$max;$i++){ 
          if($client[$i]['sock'] != null) 
             $read[$i+1] = $client[$i]['sock']; 
      } 
      // Set up a blocking call to socket_select() 
      $ready = socket_select($read,$write = NULL, $except = NULL, $tv_sec = NULL); 
      // If a new connection is being made add it to the clients array 
      if(in_array($sock,$read)){ 
          for($i = 0;$i<$max;$i++){ 
             if($client[$i]['sock']==null){ 
                if(($client[$i]['sock'] = socket_accept($sock))<0){ 
                   rLog("socket_accept() failed: ".socket_strerror($client[$i]['sock'])); 
                }else{ 
                   rLog("Client #".$i." connected"); 
                } 
                break; 
             }elseif($i == $max - 1){ 
                rLog("Too many clients"); 
             } 
          } 
          if(--$ready <= 0) 
          continue; 
      } 
      for($i=0;$i<$max;$i++){ 
          if(in_array($client[$i]['sock'],$read)){ 
             $input = socket_read($client[$i]['sock'],1024); 
             if($input==null){ 
                unset($client[$i]); 
             } 
             $n = trim($input); 
             $com = split(" ",$n); 
             if($n=="EXIT"){ 
                if($client[$i]['sock']!=null){ 
                   // Disconnect requested 
                   socket_close($client[$i]['sock']); 
                   unset($client[$i]['sock']); 
                   rLog("Disconnected(2) client #".$i); 
                   for($p=0;$p<count($client);$p++){ 
                       socket_write($client[$p]['sock'],"DISC ".$i.chr(0)); 
                   } 
                   if($i == $adm){ 
                       $adm = -1; 
                   } 
                } 
             }elseif($n=="TERM"){ 
                // Server termination requested 
                socket_close($sock); 
                rLog("Terminated server (requested by client #".$i.")"); 
                exit(); 
             }elseif($input){ 
                // Strip whitespaces and write back to user 
                // Respond to commands 
                /*$output = ereg_replace("[ \t\n\r]","",$input).chr(0); 
                socket_write($client[$i]['sock'],$output);*/ 
                if($n=="PING"){ 
                   socket_write($client[$i]['sock'],"PONG".chr(0)); 
                } 
                if($n=="<policy-file-request/>"){ 
                   rLog("Client #".$i." requested a policy file..."); 
                   $cdmp="<?xml version=\"1.0\" encoding=\"UTF-8\"?><cross-domain-policy xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd\"><allow-access-from domain=\"*\" to-ports=\"*\" secure=\"false\" /><site-control permitted-cross-domain-policies=\"master-only\" /></cross-domain-policy>"; 
                   socket_write($client[$i]['sock'],$cdmp.chr(0)); 
                   socket_close($client[$i]['sock']); 
                   unset($client[$i]); 
                   $cdmp=""; 
                } 
             } 
          }else{ 
             //if($client[$i]['sock']!=null){ 
                // Close the socket 
                //socket_close($client[$i]['sock']); 
                //unset($client[$i]); 
                //rLog("Disconnected(1) client #".$i); 
             //} 
          } 
      } 
} 
// Close the master sockets 
socket_close($sock); 
?> 
see this अधिक के लिए

मदद और के लिए more

+0

आपकी मदद करने की कोशिश करने के लिए धन्यवाद, लेकिन यह कोड - साथ ही साथ आप जिन लेखों से लिंक करते हैं, वे एन्क्रिप्शन से बिल्कुल निपटते नहीं हैं, जो पूरे प्रश्न में समस्याग्रस्त हिस्सा है। अनएन्क्रिप्टेड कनेक्शन सॉकेट एक्सटेंशन के बिना भी ठीक काम करते हैं। पूरी चीज में एन्क्रिप्शन का एकमात्र उल्लेख ज़ेंड आलेख में एक पैराग्राफ है जो टीएलएस प्रति से भी संबंधित नहीं है, और इसका उल्लेख मैक्रिप्ट के लिए मूल उदाहरण भी नहीं है। –

संबंधित मुद्दे