19

私は次のようなことをしようとしています

URL clientks = com.messaging.SubscriptionManager.class.getResource( "client.ks" );
String path = clientks.toURI().getPath();
System.setProperty( "javax.net.ssl.keyStore", path);

ここで、client.ksは、実行しているjarファイルのcom/messagingに保存されているファイルです。

javax.net.ssl.keyStoreを読み取るものは、jarにあるclient.ksファイルへのパスを予期しています。可能であれば、ファイルを抽出してクライアントのマシンに配置したくありません。では、jar内のファイルを参照することは可能ですか?

getPath()がnullを返すため、これは機能しません。これを行う別の方法はありますか?

4

3 に答える 3

37

まだ実装に取り​​組んでいますが、InputStream を介して jar からキーストアをロードし、(システム プロパティの設定に対して) TrustStore をプログラムで明示的に設定することは可能だと思います。記事を参照してください:同じ JVM で複数のトラストストアを設定する

うまくいきました!

InputStream keystoreInput = Thread.currentThread().getContextClassLoader()
    .getResourceAsStream(<path in jar>/client.ks");
InputStream truststoreInput = Thread.currentThread().getContextClassLoader()
    .getResourceAsStream(<path in jar>/client.ts");
setSSLFactories(keystoreInput, "password", truststoreInput);
keystoreInput.close();
truststoreInput.close();

private static void setSSLFactories(InputStream keyStream, String keyStorePassword, 
    InputStream trustStream) throws Exception
{    
  // Get keyStore
  KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());    

  // if your store is password protected then declare it (it can be null however)
  char[] keyPassword = keyStorePassword.toCharArray();

  // load the stream to your store
  keyStore.load(keyStream, keyPassword);

  // initialize a key manager factory with the key store
  KeyManagerFactory keyFactory = 
  KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());    
  keyFactory.init(keyStore, keyPassword);

  // get the key managers from the factory
  KeyManager[] keyManagers = keyFactory.getKeyManagers();

  // Now get trustStore
  KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());    

  // if your store is password protected then declare it (it can be null however)
  //char[] trustPassword = password.toCharArray();

  // load the stream to your store
  trustStore.load(trustStream, null);

  // initialize a trust manager factory with the trusted store
  TrustManagerFactory trustFactory = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    
  trustFactory.init(trustStore);

  // get the trust managers from the factory
  TrustManager[] trustManagers = trustFactory.getTrustManagers();

  // initialize an ssl context to use these managers and set as default
  SSLContext sslContext = SSLContext.getInstance("SSL");
  sslContext.init(keyManagers, trustManagers, null);
  SSLContext.setDefault(sslContext);    
}
于 2013-06-27T20:51:31.950 に答える
5

InputStreamjarファイル内のリソースにアクセスできますが、 。は取得できませんFile。キーストアを最終的に読み取る「もの」がFileファイルへのパスまたはパスを予期している場合、唯一のオプションはそれをファイルシステムに抽出することです。

于 2008-12-05T18:49:00.333 に答える