2010-12-16 2 views
0

ssl 지원을 통해 간단한 메시지를 보낼 수있는 서버 - 클라이언트 번들을 만들려고합니다. 나는 자바에서 아주 새로운데, 나는 내 문제가 무엇인지 알 수 없다. 동일한 네트워크에있는 2 대의 컴퓨터에서 서버 및 클라이언트 프로그램을 실행 중이므로 메시지를 보낼 수 있습니다. 내 문제는 내가 wireshark와 함께 메시지를 캡처 할 때 프로토콜이 TCP이고 메시지를 읽을 수 있다는 것입니다. 인증서에 대해서는 openssl로 모든 인증서를 만들고 keytool로 .jks로 변환했습니다. Myca.jks는 자체 서명 된 인증서입니다.이 인증서로 서버와 클라이언트에 서명했습니다. 팁 주셔서 감사합니다!Cant가 java ssl 소켓을 사용하여 ssl 메시지를 보내십시오.

 
import java.io.*; 
import java.net.*; 
import java.security.*; 
import java.util.*; 
import javax.net.ssl.*; 


public class sslserver { 



ObjectOutputStream out; 
ObjectInputStream in; 
String message; 
sslserver(){} 
void run() throws Exception 
{ 

         char[] passphrase = "123456".toCharArray(); 
         KeyStore keystore = KeyStore.getInstance("JKS"); 
         keystore.load(new FileInputStream("/home/jimmysnn/JavaApplication4/src/keystore.jks"), passphrase); 
         KeyStore serverkeystore = KeyStore.getInstance("JKS"); 
         serverkeystore.load(new FileInputStream("/home/jimmysnn/JavaApplication4/src/server.jks"), passphrase); 

         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
         kmf.init(keystore, passphrase); 

         TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
         tmf.init(serverkeystore); 

         SSLContext context = SSLContext.getInstance("TLS"); 
         TrustManager[] trustManagers = tmf.getTrustManagers(); 
         KeyManager[] keyManagers = kmf.getKeyManagers(); 

         context.init(keyManagers, trustManagers, null); 

    //1. creating a server socket 
         SSLServerSocketFactory ssf = context.getServerSocketFactory(); 
         ServerSocket ss = ssf.createServerSocket(2004); 
    //2. Wait for connection 
    System.out.println("Waiting for connection"); 
    Socket s = ss.accept(); 
    System.out.println("Connection received from " + s.getInetAddress().getHostName()); 
    //3. get Input and Output streams 
    out = new ObjectOutputStream(s.getOutputStream()); 
    out.flush(); 
    in = new ObjectInputStream(s.getInputStream()); 
    sendMessage("Connection successful"); 
    //4. The two parts communicate via the input and output streams 
    Scanner input = new Scanner(System.in); 

         do{ 

    message = (String)in.readObject(); 
    System.out.println("client>" + message); 
    if (message.equals("bye")) 
     sendMessage("bye"); 

    }while(!message.equals("bye")); 



    //4: Closing connection 

    in.close(); 
    out.close(); 
    ss.close(); 


} 
void sendMessage(String msg) throws Exception 
{ 
    out.writeObject(msg); 
    out.flush(); 
    System.out.println("server>" + msg); 

} 
public static void main(String args[]) throws Exception 
{ 
    Server server = new Server(); 
    while(true){ 
    server.run(); 
    } 
} 



} 
 
import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.security.*; 
import javax.net.ssl.*; 

public class sslclient { 


ObjectOutputStream out; 
    ObjectInputStream in; 
    String message; 
sslclient(){} 
void run() throws Exception 
{ 

         char[] passphrase = "123456".toCharArray(); 
         KeyStore keystore = KeyStore.getInstance("JKS"); 
         keystore.load(new FileInputStream("/home/ge0rge/Javaaskhsh4/src/myca.jks"), passphrase); 

         KeyStore keystoreclient = KeyStore.getInstance("JKS"); 
         keystoreclient.load(new FileInputStream("/home/ge0rge/Javaaskhsh4/src/client.jks"), passphrase); 

         TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
         tmf.init(keystore); 

         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
         kmf.init(keystoreclient, passphrase); 

         SSLContext context = SSLContext.getInstance("TLS"); 
         TrustManager[] trustManagers = tmf.getTrustManagers(); 
         KeyManager[] keyManagers = kmf.getKeyManagers(); 

         context.init(keyManagers, trustManagers, null); 

         SSLSocketFactory sf = context.getSocketFactory(); 
       Socket s = sf.createSocket("192.168.1.5", 443); 
         System.out.println("Connected to localhost in port 2004"); 
    //2. get Input and Output streams 
    out = new ObjectOutputStream(s.getOutputStream()); 
    out.flush(); 
    in = new ObjectInputStream(s.getInputStream()); 
    //3: Communicating with the server 
         Scanner input = new Scanner(System.in); 


         message = (String)in.readObject(); 
    System.out.println("server>" + message); 





         //message = input.nextLine(); 
         sendMessage("Hi my server"); 
    do{ 

    message = input.nextLine(); 
    sendMessage(message); 
             if(message.equals("bye")){ 
             message = (String)in.readObject(); 
    System.out.println("server>" + message); 
            } 

    }while(!message.equals("bye")); 

    in.close(); 
    out.close(); 
    s.close(); 

} 
void sendMessage(String msg) throws Exception 
{ 
    out.writeObject(msg); 
    out.flush(); 
    System.out.println("client>" + msg); 

} 
public static void main(String args[]) throws Exception 
{ 
    Client client = new Client(); 
    client.run(); 
} 
} 
+1

그래서? 문제가 있습니까? 문제가 무엇입니까? "보낼 수 없다"는 것은 무엇을 의미합니까? 예외가 있습니까? 그렇다면 전체 추적을 게시하십시오. –

답변

3

당신은 당신의 구현 또는 실제로 어떤 실수에 약간의 혼동을 반영 할 수 코드에서 일부 비 표준 용어를 사용하고 있습니다.

  1. 서버에는 개인 키가 들어있는 키 저장소가 필요합니다.

  2. 클라이언트는 자신이 다른 사람들, 즉 서버에서 신뢰 준비가되어 인증서를 포함하는 trustore을 가지고 있습니다.

  3. CA의 서명이없는 한 서버의 인증서를 서버의 키 저장소에서 내 보낸 다음 클라이언트의 트러스트 스토어로 가져와야합니다. 이는 권장되고 정상적입니다.

  4. 서버의 키 스토어는 서버에 남아 있습니다. 클라이언트의 신뢰 저장소가 클라이언트에 있습니다. 따라서 'serverKeystore'등의 변수 이름은 필요하지 않습니다. 필요한 경우 'keystore'및 'truststore'만 입력하면됩니다. 클라이언트가 키 스토어를 필요로하지 않고 서버가 신뢰를 필요로하지 않도록

  5. 당신은 클라이언트 인증을 사용하고 있지 않습니다.

이러한 개념을 사용하여 코드를 다시 작성한 다음 모든 사람, 특히 당신에게 더 명확해질 수 있습니다.

여전히 작동하지 않으면 예외 및 스택 추적을 게시해야합니다. 서버 또는 클라이언트를 실행하거나 -Djavax.net.debug=ssl,handshake을 사용하여 결과를 게시해야 할 수도 있습니다.