2012-03-06 12 views
5

मेरा लक्ष्य जावा सर्वर और सी # में लिखे गए क्लाइंट के बीच एक सुरक्षित संचार करना है।जावा और सी # अनुप्रयोगों के बीच एसएसएल संचार

जावा सर्वर कोड:

System.setProperty("javax.net.ssl.keyStore","cert/mySrvKeystore"); 
    System.setProperty("javax.net.ssl.keyStorePassword","myPassword"); 

    SSLServerSocketFactory sslserversocketfactory = 
      (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
    SSLServerSocket sslserversocket = = (SSLServerSocket) sslserversocketfactory.createServerSocket(2389); 

    while(true) { 
    System.err.println("server w8 new connection"); 
    try { 

      SSLSocket sslsocket = (SSLSocket) sslserversocket.accept(); 
      //sslsocket.startHandshake(); 

      in = sslsocket.getInputStream(); 
      out = sslsocket.getOutputStream(); 
      out.flush(); 

      String response = new String(receiveMessage()); 
      while (response != "end") { 
       System.out.println("Server recv="+response); 
       response = new String(receiveMessage()); 
       sendMessage(("echo="+response).getBytes()); 
      } 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 

और ग्राहक सी # में लिखा:

 client = new TcpClient() { SendTimeout = 5000, ReceiveTimeout = 5000 }; 
     IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port); 

     client.Connect(serverEndPoint); 
     client.NoDelay = true; 
     Console.WriteLine("Client connected."); 

     // Create an SSL stream that will close the client's stream. 
     SslStream sslStream = new SslStream(client.GetStream(), false, ValidateServerCertificate, null); 
     // The server name must match the name on the server certificate. 
     try 
     { 
      sslStream.AuthenticateAsClient("someName"); 
     } 
     catch (AuthenticationException error) 
     { 
      Console.WriteLine("Exception: {0}", error.Message); 
      if (error.InnerException != null) 
      { 
       Console.WriteLine("Inner exception: {0}", error.InnerException.Message); 
      } 
      Console.WriteLine("Authentication failed - closing the connection."); 
      client.Close(); 
      return; 
     } 

     ASCIIEncoding ascii = new ASCIIEncoding(); 
     SendData(ascii.GetBytes("Hello World"));  

और

public static bool ValidateServerCertificate(
      object sender, 
      X509Certificate certificate, 
      X509Chain chain, 
      SslPolicyErrors sslPolicyErrors) 
    { 
     if (sslPolicyErrors == SslPolicyErrors.None) 
      return true; 

     Console.WriteLine("Certificate error: {0}", sslPolicyErrors); 

     // Do not allow this client to communicate with unauthenticated servers. 
     return false; 
    } 

और मैं निम्नलिखित त्रुटियाँ मिलती है: सी # में

A first chance exception of type "System.Security.Authentication.AuthenticationException" occurred in System.dll 
Certificate error: RemoteCertificateChainErrors 
Exception: The remote certificate is invalid according to the validation procedure. 
Authentication failed - closing the connection. 

मुझे पता है कि यह मुद्दा यह तथ्य हो सकता है कि मैं विभिन्न प्रकार के प्रमाणपत्रों का उपयोग करता हूं, लेकिन मुझे नहीं पता कि जावा में X509 प्रमाणपत्र के साथ मानक एसएसएलसेवर सॉकेट कैसे बनाना है। क्या कोई मेरी मदद कर सकता है, अच्छे उदाहरण के साथ, या कुछ सलाह मैं अपने लक्ष्य तक कैसे पहुंच सकता हूं?

पीएस मैं बाउंसीकैसल लाइब्रेरी की तलाश में था, क्योंकि इसमें जावा और सी # कार्यान्वयन दोनों हैं, लेकिन मैं मानक पुस्तकालयों और भाषाओं की अंतर्निहित कार्यक्षमता का उपयोग करना चाहता हूं।

+2

आह, [यादें] (http://stackoverflow.com/questions/719556/c-sharp-client-connecting-to-a-java-server-over-ssl)। (एसओ पर मेरे पहले प्रश्नों में से एक) –

+0

यह स्टैक ओवरफ्लो पर एक और प्रश्न के समान है, हालांकि मैं टिप्पणियां पोस्ट नहीं कर सकता प्रश्न: [x509 बाउंसीकास्टल के बिना प्रमाणपत्र बनाना] (http://stackoverflow.com/questions/1615871/create-an-x509-circuit-in-java-without-bouncycastle) और यहां पृष्ठ पर एक लिंक दिया गया है जो वर्णन करता है कि यह कैसे करें: [जावा में x509 प्रमाणपत्र बनाना] (http://bfo.com/ ब्लॉग/2011/03/08/odds_and_ends_creating_a_new_x_509_certificate.html) – ry8806

+0

धन्यवाद, यह वास्तव में मुझे X509 प्रमाणपत्र उत्पन्न करने में मदद करता है, लेकिन अब मैं इसे जावा में SSLServerSocket में कैसे बंडल कर सकता हूं? – savionok

उत्तर

2

आपके उदाहरण से, ऐसा लगता है कि आपको अपना प्रमाणपत्र और निजी कुंजी प्रोग्रामेटिक रूप से उत्पन्न करने की आवश्यकता नहीं है। भी

keytool -genkey -alias myalias -keystore mykeystore.jks -dname "CN=www.example.com" 

या बेहतर, साथ सैन विस्तार, यदि आप जावा 7 के keytool उपयोग कर रहे हैं:: आप keytool साथ अपने सर्वर कुंजीस्टोर में एक प्रमाण पत्र उत्पन्न कर सकते हैं

keytool -genkey -alias myalias -keystore mykeystore.jks -dname "CN=www.example.com" -ext san=dns:www.example.com 

यहाँ, www.example.com मेजबान है ग्राहक द्वारा देखा गया नाम। आप विषय डीएन (dname) में अन्य चीजें जोड़ सकते हैं, लेकिन सुनिश्चित करें कि CN होस्ट का नाम है।

एक बार जब यह उत्पन्न कर रहा है, का उपयोग कर अपने स्व-हस्ताक्षरित प्रमाणपत्र निर्यात:

keytool -export myservercert.crt -alias myalias -keystore mykeystore.jks 

फिर आप सी # से उपयोग से आपके Windows प्रमाणपत्र संग्रह में एक विश्वसनीय प्रमाणपत्र के रूप में यह आयात करने के लिए सक्षम होना चाहिए।

+0

आपको कभी भी अपने प्रमाणपत्र को निजी कुंजी प्रोग्रामेटिक रूप से उत्पन्न करने की आवश्यकता क्यों होगी? इस पर भरोसा कौन करेगा? – EJP

+0

@EJP सहमत है, यह अधिक उपयोग नहीं है। यदि आप "एमआईटीएम प्रॉक्सी" (फिडलर या [स्क्विड के एसएसएलबंप] (http://wiki.squid-cache.org/Features/SslBump) लिखते हैं तो यह आसान हो सकता है) जहां आप प्रॉक्सी के सीए प्रमाण को अपने ब्राउज़र में आयात करेंगे लेकिन अनुरोधित मेजबान के लिए फ्लाई पर एक नया प्रमाण उत्पन्न करें। – Bruno

+0

धन्यवाद! सीआरटी के लिए जेक्स निर्यात, और एक विश्वसनीय प्रमाण पत्र के रूप में ओएस में इस सीआरटी आयात करने से मेरी समस्या हल हो गई! – savionok

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