2017-07-13 21 views
0

私はStackOverflowのどこでも検索しましたが、それらの問題は私のものとは異なるように見えますが、私はそれを修正する際に多くの問題を抱えています。今のSSLSocketハンドシェイク例外共通の暗号スイート

、私のプログラムは、単にクライアントがただ一つのメッセージを送信し、それが閉じSSLソケットを使用したクライアントサーバー接続を行う必要があります(私は後でそれをより多くのものを追加します)

私はとの問題を取得しますメッセージ部分と共通のエラーなし暗号スイート。以下では、サーバーコードとクライアントコードを出力とともに掲示します。

public static void main(String[] args) 
     throws IOException, KeyStoreException, NoSuchAlgorithmException, 
     CertificateException, UnrecoverableKeyException, KeyManagementException { 

    FileInputStream keyFile = new FileInputStream(archivoKey);//Server.jks with Client.crt and .key as well as Server.crt and .key 
    char[] archivopwd = mypassword.toCharArray(); 
    String password = mypassword; 

    System.setProperty("javax.net.ssl.trustStore", archivoKey); 
    System.setProperty("javax.net.ssl.trustStorePassword", password); 

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    keyStore.load(keyFile, archivopwd); 

    KeyManagerFactory keyManagerFactory = 
      KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    keyManagerFactory.init(keyStore, archivopwd); 
    KeyManager keyManagers[] = keyManagerFactory.getKeyManagers(); 

    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(keyManagers, null, null); 


    SSLServerSocketFactory factory=(SSLServerSocketFactory) 
      SSLServerSocketFactory.getDefault(); 
    SSLServerSocket ss = (SSLServerSocket) factory.createServerSocket(6000); 
    System.out.println("Esperando conexion..."); 
    ss.setEnabledCipherSuites(ss.getSupportedCipherSuites()); 
    SSLSocket so =(SSLSocket) ss.accept(); 
    so.startHandshake(); 
    System.out.println("Conexion realizada"); 

    BufferedReader in = new BufferedReader 
     (new InputStreamReader(so.getInputStream())); 
    String msg = in.readLine(); 
    System.out.println(msg); 

} 

サーバー出力:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: no cipher suites in common 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:292) 
at sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:1045) 
at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:741) 
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:224) 
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026) 
at sun.security.ssl.Handshaker.process_record(Handshaker.java:961) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
at servidorseguridad.ServidorSeguridad.main(ServidorSeguridad.java:73) 

クライアントコード

public static void main(String[] args) { 
    int port = 6000; 
    String host = "localhost"; 
    String password = mypassword; 
    System.setProperty("javax.net.ssl.trustStore", archivoKey); 
    System.setProperty("javax.net.ssl.trustStorePassword", password); 
    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     InputStream keyFile = new FileInputStream(archivoKey); //Client.jks, exactly the same as the Server.jks 
     try { 
      keyStore.load(keyFile, archivopwd); 
     } finally { 
      if (keyFile != null) { 
       keyFile.close(); 
      } 
     } 
     KeyManagerFactory keyManagerFactory = 
       KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyManagerFactory.init(keyStore, archivopwd); 

     sc.init(null, null, null); 

     SocketFactory factory = sc.getSocketFactory(); 

     System.out.println("Buscando conexion..."); 

     try (SSLSocket so = (SSLSocket) factory.createSocket(host, port)) { 
      so.getEnabledCipherSuites(); 
      so.startHandshake(); 

      System.out.println("Conexion exitosa!"); 

      DataOutputStream os = new DataOutputStream(so.getOutputStream()); 

      os.writeUTF("Prueba!"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

クライアント出力

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) 
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
at clienteseguridad.ClienteSeguridad.main(ClienteSeguridad.java:65) 
私はUbuntuの16.04とNetBeans 8.2

Serverのコードを使用しています

ほとんどのもの(System.setPropertyのようなもの)は私がここで読んだいくつかのオプションをテストしていました。 .jksは、crtファイルとキーファイルをp12ファイルに変換し、.jksファイルに追加することで生成されました。

私は本当にここにアイデアがないので、どんな助けもありがとうございます。あなたが必要とするものは何でも聞くことができます。ありがとう

答えて

0

この例外は、通常、サーバーに秘密キーがないことを意味します。これは、匿名の暗号スイートのみをサポートできることを意味し、クライアントがそれらを許可しない場合、そうしてはならないので、共通の暗号スイートは存在しません。

あなたのセットアップコードは奇妙です:

  • あなたは両方がシステムプロパティの設定トラストをロードしている:あなたは両方を行う必要はありません。
  • キーストアとトラストストアで同じファイルを使用していますが、これは技術的には有効ですが推奨されません。あなたはキーペア、サーバー側のキーストアを作成する必要があり、その後、いずれかの

    1. 自己署名あなたは、クライアントのトラストストアにエクスポートする必要がwhihc証明書、またはより良いまだ

CSRによって認証され、CAによって署名され、鍵ペアの作成に使用したのと同じエイリアスを使用して、署名された証明書をサーバ鍵ストアにインポートします。

最後に:

ss.setEnabledCipherSuites(ss.getSupportedCipherSuites()); 

この行を削除します。それは安全ではない。決してこれをしないでください。

+0

こんにちは、お返事ありがとうございます!私が言ったように、(setEnabledCipherSuitesのように)それを修正しようとしていたときにいくつかの行が追加されましたが、私にはそれが安全でないと言ってくれてありがとう。私はすでに当局から署名されたCSRを持っており、それは最後に述べた.p12にインポートされています。私はそれが最良の回避策だと言われたので、言及したものを使用しました。私はそれをしておかないと、代わりに何かをjksキーストアにインポートする必要がありますか? – luismzk

+0

'.jksは、crtファイルとキーファイルをp12ファイルにして、.jksに追加することで生成されました。' – EJP

+0

私は[この投稿](https://stackoverflow.com/questions/17695297/importing-the-private-key-public-certificate-pair-in-the-java-keystore)の指示に従いました – luismzk

関連する問題