2016-04-20 8 views
0

エンタープライズアプリケーションへのサポートJMXの追加に多くの努力を費やしました。 JMXはSQLによるSSLとクライアント認証を使用する必要があります。それは問題ではありません。 私はSSLを有効にするためにシステムプロパティを使用しています。 システムプロパティはJVMに対してグローバルです。特に大規模なアプリケーションでは、別の構成方法が利用できない場合に、迅速に競合が発生する可能性があります。システムプロパティを使用しないSSLを使用したJMX

特に、大規模なエンタープライズアプリケーションでは、異なる証明書を必要とするさまざまなサービス、特に自動証明書選択に関する制限があるため、必要に応じて柔軟なコードを使用してこれにフックする方法が必要です。 残念ながら、JMXとRMIは現在、システムプロパティまたはデフォルトのソケットファクトリにのみ依存するフックを提供していません。

システムプロパティを使用しないでSSLを使用してJMXを作成する方法はありますか?

編集:SslRMIClientSocketFactoryを使用して

は動作しませんでした。

//   System.setProperty("java.rmi.server.randomIDs", "true"); 
//   System.setProperty("javax.net.ssl.keyStore", keystore); 
//   System.setProperty("javax.net.ssl.keyStorePassword", 
//    "password"); 

      // SSL-based RMI socket factories. 
      SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory(); 
      SslRMIServerSocketFactory ssf = new SslRMIServerSocketFactory(); 
      map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, csf); 
      map.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, ssf); 

例外:

java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:304) 

答えて

0

あなたがあなた自身のRMIConnectorServerを作成し、条件付きSSLのためにそれを有効にすることができます。サーバーインスタンスを構築するとき、環境マップは定義済みのRMIClientSocketFactoryRMIServerSocketFactoryのインスタンスでロードできます。 SSLを有効にするには、これらのファクトリを設定済みのSslRMIClientSocketFactoryおよびSslRMIServerSocketFactoryインスタンスとして設定することができます。これにより、システム・プロップ構成のコネクタ・サーバーに相当するインスタンスが再作成されます。私はSSLでこれをしなかったが、それはかなりよく文書化されているようだ。

+0

結果:java.rmi.ConnectIOException。私の下の編集を見てください。 – Benni

+0

パラメータなしのctorではなく、SSLファクトリに構成を提供する必要があります。 – Nicholas

0

ソリューション:

SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory(); 
    SslRMIServerSocketFactory ssf = createSslRMIServerSocketFactory(null,null,false); 
    map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, csf); 
    map.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, ssf);  

.... 

private static SslRMIServerSocketFactory createSslRMIServerSocketFactory(
      String[] enabledCipherSuites, String[] enabledProtocols, 
      boolean sslNeedClientAuth) 
     { 
      try 
      { 
      // Load the SSL keystore properties from the config file 
      String keyStore = "KeyStore.jks"; 
      String keyStorePassword = "pass"; 
      String trustStore = "truststore"; 
      String trustStorePassword = "pass"; 

      char[] keyStorePasswd = null; 
      if (keyStorePassword.length() != 0) 
      { 
       keyStorePasswd = keyStorePassword.toCharArray(); 
      } 

      char[] trustStorePasswd = null; 
      if (trustStorePassword.length() != 0) 
      { 
       trustStorePasswd = trustStorePassword.toCharArray(); 
      } 

      KeyStore ks = null; 
      if (keyStore != null) 
      { 
       ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
       FileInputStream ksfis = new FileInputStream(keyStore); 
       try 
       { 
       ks.load(ksfis, keyStorePasswd); 
       } 
       finally 
       { 
       ksfis.close(); 
       } 
      } 
      KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory 
       .getDefaultAlgorithm()); 
      kmf.init(ks, keyStorePasswd); 

      KeyStore ts = null; 
      if (trustStore != null) 
      { 
       ts = KeyStore.getInstance(KeyStore.getDefaultType()); 
       FileInputStream tsfis = new FileInputStream(trustStore); 
       try 
       { 
       ts.load(tsfis, trustStorePasswd); 
       } 
       finally 
       { 
       tsfis.close(); 
       } 
      } 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory 
       .getDefaultAlgorithm()); 
      tmf.init((KeyStore) ts); 

      SSLContext ctx = SSLContext.getInstance("SSL"); 
      ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

      return new SslRMIServerSocketFactory (ctx, enabledCipherSuites, enabledProtocols, 
       sslNeedClientAuth); 
      } 
      catch (Exception e) 
      { 
      Logger.getGlobal().log(Level.SEVERE, e.getMessage()); 
      return null; 
      } 
     } 
+0

ニース。良い参考例。それは機能しますか? – Nicholas

+0

はい、素晴らしいです!ありがとう! – Benni

関連する問題