2017-02-16 14 views
0

私はJSSEリファレンスガイドを読んでいましたが、SSL/TLSプロトコルではあまりよく知られていません。 TCP接続で何らかのセキュリティが必要なプロジェクトに取り組んでいますので、最も一般的なプロトコルとしてTLSを選択しました。TLSプロトコルを使用してクライアントとサーバー間の通信に使用する暗号スイート

JSLSリファレンスガイドでSSLSocketとSSLServerSocketのコードを見つけてプロジェクトにコピーしましたが、そのアクションの結果は実際には期待できませんでした。サーバー(Javaアプリケーション)を起動すると、クライアント(Javaアプリケーション)に接続しようとした時点ですべてがうまくいくように見えます。その時点で、SSLHandshakeExceptionが発生しました。共通の暗号スイートはありません。

私の質問は、一般的に暗号スイートあるもの、である(私はそれをグーグルが、私は本当に理解していなかった、初心者のための基本的な解釈は、私は必要なものである)と私が作るために下記のコードを修正する必要がありますか私のプロジェクトは完璧に動作しますか?

のSSLSocket

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

. . . 

int port = availablePortNumber; 
String host = "hostname"; 

try { 
    SSLSocketFactory sslFact = 
     (SSLSocketFactory)SSLSocketFactory.getDefault(); 
    SSLSocket s = (SSLSocket)sslFact.createSocket(host, port); 

    OutputStream out = s.getOutputStream(); 
    InputStream in = s.getInputStream(); 

    // Send messages to the server through 
    // the OutputStream 
    // Receive messages from the server 
    // through the InputStream 
} 

catch (IOException e) { 
} 

はSSLServerSocket:

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

. . . 

int port = availablePortNumber; 

SSLServerSocket s; 

try { 
    SSLServerSocketFactory sslSrvFact = 
     (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); 
    s = (SSLServerSocket)sslSrvFact.createServerSocket(port); 

    SSLSocket c = (SSLSocket)s.accept(); 

    OutputStream out = c.getOutputStream(); 
    InputStream in = c.getInputStream(); 

    // Send messages to the client through 
    // the OutputStream 
    // Receive messages from the client 
    // through the InputStream 
} 

catch (IOException e) { 
} 

答えて

1

おそらく、サーバー証明書を持っていません。 SSLContextを明示的に作成しないので、サーバが証明書と秘密鍵にアクセスする唯一の方法は、特定のシステムプロパティを設定してプログラムを実行する場合です。必要なキーマテリアルがなければ、匿名の暗号スイートのみがサーバーによって有効になります。

クライアントは、実際にセキュリティを提供していないため、これらの匿名暗号スイートをデフォルトで無効にします。したがって、共通の暗号スイートがないため、ハンドシェイクが失敗します。

+0

サーバーも無効にします。したがって、証明書がなければ、* no *暗号スイートがサーバーによって有効になります。 – EJP

+0

どうすれば有効にできますか? –