2010-12-16 8 views
0

sslサポートで簡単なメッセージを送ることができるサーバークライアントバンドルを作成しようとしています。私はJavaでかなり新しいですし、私の問題が何であるか把握できません。私は同じネットワーク上の2台のコンピュータでサーバーとクライアントプログラムを実行しています。メッセージを送信できます。私の問題は、wiresharkでメッセージをキャプチャするときにプロトコルがTCPであり、メッセージを読むことができることです。 証明書について、私はopensslですべての証明書を作成して、keytoolで.jksに変換しました。 Myca.jksは自己署名されたcaの証明書です。私はこの証明書でサーバーとクライアントに署名しました。 ヒントありがとう!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. クライアントには、他の人物、つまりサーバーから信頼できる証明書が含まれています。

  3. サーバーの証明書をサーバーのキーストアからエクスポートし、CAの署名がない限りクライアントのトラストストアにインポートする必要があります(推奨され、通常です)。

  4. サーバーのキーストアはサーバーに残ります。クライアントのトラストストアはクライアントにあります。したがって、 'serverKeystore'などの変数名は必要ありません。必要に応じてちょうど 'keystore'と 'truststore'が必要です。

  5. クライアントは認証を使用していないため、クライアントにはキーストアが必要なく、サーバーにトラストストアは必要ありません。

これらのコンセプトを使用してコードをやり直すことをお勧めします。そして、皆さん、特にあなたにはもっと明確になるかもしれません。

それでも動作しない場合は、例外とスタックトレースを送信する必要があります。サーバーまたはクライアント、またはその両方を-Djavax.net.debug=ssl,handshakeで実行し、結果をここに掲載する必要があります。

関連する問題