2012-03-04 17 views
3

とそれぞれclientがクライアント認証をサポートしていますが、ここに記載されているように:SSLHandshakeException: no cipher suites in commonは、trustStoreの参照を持っていません。つまり、デフォルトのtrustStoreを使用します。 trustStoreはどのように指定できますか?クライアント認証用にtrustStoreを追加

ClassFileServerを:

private static ServerSocketFactory getServerSocketFactory(String type) { 
    if (type.equals("TLS")) { 
     SSLServerSocketFactory ssf = null; 

     Properties systemProps = System.getProperties(); 
     systemProps.put("javax.net.ssl.trustStore", "cacerts.jks"); 
     systemProps.put("javax.net.ssl.trustStorePassword", "[email protected]"); 
     System.setProperties(systemProps); 

     try { 
      // set up key manager to do server authentication 
      SSLContext ctx; 
      KeyManagerFactory kmf; 
      KeyStore ks; 
      char[] passphrase = "[email protected]".toCharArray(); 

      ctx = SSLContext.getInstance("TLS"); 
      kmf = KeyManagerFactory.getInstance("SunX509"); 
      ks = KeyStore.getInstance("JKS"); 
      ks.load(new FileInputStream("keystore.jks"), passphrase); 
      kmf.init(ks, passphrase); 
      ctx.init(kmf.getKeyManagers(), null, null); 

      ssf = ctx.getServerSocketFactory(); 
      return ssf; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

SSLSocketClientWithClientAuth:

try { 

     /* 
     * Set up a key manager for client authentication 
     * if asked by the server. Use the implementation's 
     * default TrustStore and secureRandom routines. 
     */ 
     Properties systemProps = System.getProperties(); 
     systemProps.put("javax.net.ssl.trustStore", "cacerts.jks"); 
     systemProps.put("javax.net.ssl.trustStorePassword", "changeit"); 
     System.setProperties(systemProps); 

     SSLSocketFactory factory = null; 
     try { 
      SSLContext ctx; 
      KeyManagerFactory kmf; 
      KeyStore ks; 
      char[] passphrase = "changeit".toCharArray(); 

      ctx = SSLContext.getInstance("TLS"); 
      kmf = KeyManagerFactory.getInstance("SunX509"); 
      ks = KeyStore.getInstance("JKS"); 

      ks.load(new FileInputStream("keystore.jks"), passphrase); 

      kmf.init(ks, passphrase); 
      ctx.init(kmf.getKeyManagers(), null, null); 

      factory = ctx.getSocketFactory(); 
     } catch (Exception e) { 
      throw new IOException(e.getMessage()); 
     } 

     SSLSocket socket = (SSLSocket)factory.createSocket(host, port); 
+0

'ベター' を定義。 – EJP

答えて

2

システムプロパティを設定することにより、trustStoreを指定します。

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");

またはコマンドラインからの呼び出しを経由:

-Djavax.net.ssl.keyStore=path/to/keystore.jks

+2

あなたがそれを行う方法を指摘すれば、私はこの回答を+1します... – rexford

+2

'systemProps'とは何ですか? – EJP

+0

systemPropsはシステムプロパティであり、答えを明確にしました。 – Astron

1

'共通んの暗号スイートは、' デフォルトのトラストストアを使用することによって引き起こされていません。これは、鍵ストアを持たないか、秘密鍵と証明書を持たないことによって、またはピアツーピアの暗号スイートを過度に指定することによって発生します。

サーバに秘密鍵がない場合、デフォルトで無効になっている安全でない匿名のものを除き、暗号スイートは使用できません。したがって警告。だけ場合は、自己署名証明書を使用している場合は異なる問題の原因となりますデフォルトのトラストストアを使用して

。簡単な解決策:しないでください。より複雑なソリューション:それぞれのキーストアからそれぞれの証明書をエクスポートして、相手のトラストストアにインポートします。

JSSE Reference Guideを参照してください。

+0

正常に動作していますが、上手く見えないsystemPropsを追加しました。理想的ではありません。 – Astron

+0

@Astronは、カスタムTrustManagerzの使用については、より難しく見えます。 – EJP

+0

カスタムTrustManger [ここ](http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores)の使用方法については参照していますが、 'trustStore'の詩' keyStore'を読むと、ほぼ同じように見えます。 – Astron

関連する問題