2016-05-08 13 views
-1

サーバーとクライアントオールインワンチャットアプリケーションを作成していますが、SSL接続に切り替えようとしています。プログラムが動作するクライアントがスロー接続を行うためにしようとしたとき、私は今、keystore.jksと証明書ファイル(.cer)を作成したが、:Java SSL接続エラー - 無効なキーストア形式

System.setProperty("javax.net.ssl.keyStore", "certificates/keystore.jks"); 
System.setProperty("javax.net.ssl.trustStore", "certificates/certificate.cer"); 
System.setProperty("javax.net.ssl.keyStorePassword", "password"); 

if (this.role == ConnectionRole.SERVER) { 
    connectingAlert.getJFrame().setVisible(true); 
    setupServer(); 
    do { 
     Thread.sleep(10); 
    } while (socket == null); 
} 

if (this.role == ConnectionRole.CLIENT) { 
    connectingAlert.getJFrame().setVisible(true); 
    setupClient(targetIP); 
} 

private void setupServer() throws IOException { 
    SSLServerSocketFactory sslSrvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
    serverSocket = (SSLServerSocket) sslSrvFact.createServerSocket(8080, 1); 
    socket = (SSLSocket) serverSocket.accept(); 
    setupStreams(); 
} 

private void setupClient(String IPAddress) throws IOException { 
    SSLSocketFactory sslFact = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    socket = (SSLSocket) sslFact.createSocket("localhost", 8080); 
    setupStreams(); 
} 

private void setupStreams() throws IOException { 
    dataOut = new ObjectOutputStream(socket.getOutputStream()); 
    dataIn = new ObjectInputStream(socket.getInputStream()); 
    chatInterface = ChatInterface.getInstance(); 
} 
+0

私は全く新しいです。チュートリアルに従うだけです。 javax.net.ssl.trustStoreを追加すると、エラーが発生しなくなりました: 'javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX path building failed:sun.security.provider.certpath.SunCertPathBuilderException:できません要求されたターゲットへの有効な証明書パスを見つける ' – user3278983

+0

投稿で使用されたコードのバージョン(無効なフォーマットエラー)から' System.setProperty( "javax.net.ssl.trustStore"、 "certificates/certificate .cer ");'私は何のエラーが発生したかを示します。私はラインを追加した後。ポストにあるコードと同じコードで、リンクされた「重複している可能性のある」クエリーに行き、トップのコメントにあったコードの正確な行を使用しました。私は私が得たkeytoolエラーに関するコメントを投稿しました。後で今日私はキーストアと証明書を作成しようと再試行し、私がこれを行うために使用したコマンドについてコメントします。 – user3278983

+0

私はしませんでした。それは私の問題かもしれないように聞こえる。だから私は、サーバー用とクライアント用に作成する必要があります。だから私は、サーバーとクライアントの両方のキーストアにある自己署名証明書を使用する必要があると思いますか? – user3278983

答えて

0
System.setProperty("javax.net.ssl.trustStore", "certificates/certificate.cer"); 

問題:ここで

Caused by: java.io.IOException: Invalid keystore format

コードですここにある。 .cerファイルはトラストストアではありません。 -trustcacertsオプションを使用してkeytool経由で実際のJavaトラストストアにインポートする必要があります。

しかし、トラストストアを使用する理由は明確ではありません。自己署名証明書を持つ同僚があなたにそれらを送ることを期待していますか?ほとんどの場合、Javaに付属のトラストストアを使用し、javax.net.ssl.trustStoreを設定しないでください。

+0

私は何を使うべきですか?このように思えるソリューションをオンラインで見ると、私が使用しているはずのものです。これは1つのプログラム内のサーバー/クライアントです(ユーザーの入力に応じて異なります)。SSL接続を確立するにはどうすればよいですか? – user3278983

+0

'しかし、なぜトラストストアを使っているのかはっきりしません。'、 'Javaに付属のトラストストアを使うだけです。私はこれをする方法を尋ねていた。 'javax.net.ssl.keyStore'と' javax.net.ssl.keyStorePasword'を設定するだけで、クライアント側では 'PKIX path building failed'エラーが発生し、サーバ側では' Received fatal alert:certificate_unknown'というエラーが発生します。 – user3278983

+0

私が尋ねた質問にあなたが答えたとします。 '自己署名証明書を持っている同業者があなたにそれを送ることを期待していますか?'もしそうなら、なぜですか? CA署名付き証明書を使用する必要があります。しかし、それがあなたがやっていることなら、カスタムトラストストアが必要なのです。 'unknown_certificate'の問題は、別個の問題であり、サーバーはあなたの証明書を信頼しません。 – EJP

関連する問題