1

com.sun.grizzly.SSLConfig.setKeyStoreFile()を使用してGrizzlyのSSLを設定しようとしています。入力として文字列のみを受け取ります(InputStreamまたはFileは取りません)。JARファイル内にあるjksファイルを使用したい。jarパス(C:\ dir \ my.jar!\ resources \ my.jksなど)に文字列を渡すと、失敗します。JARからファイルを解凍する以外に、そのJKSをグリズリーに使用するにはどうすればよいですか。

4

2 に答える 2

3

ファイル名以外のものを渡すことができるようには見えません。ソースを表示してメソッドvalidateConfiguration()とメソッドを見ると、変数がコンストラクターに直接createSSLContext()渡されていることがわかります。keyStoreFileFileInputStream

短期的には、解凍して直接ファイル名を使用することに固執している可能性があります。または、SSLContextを適切に検証および初期化するために、上記の2つのメソッドをオーバーライドすることもできます。長期的には、パッチを提出します。

于 2010-01-20T21:39:47.317 に答える
2

@Kevinのアイデアはうまくいきました!grizzly-servlet-webserver 1.9.8を使用して、次のコードを使用します。


SSLConfig ssl = new SSLConfig(){
 @Override
 public SSLContext createSSLContext() { 
  try{
   //Load the keystore.
   KeyStore keyStore=KeyStore.getInstance(KeyStore.getDefaultType());
   InputStream keyStream=ClassLoader.getSystemResourceAsStream("my.jks");
   //InputStream keyStream=new java.net.URL("jar:file:/C:/dir/my.jar!/my.jks").openStream();
   keyStore.load(keyStream,"mypassword");
   keyStream.close();

   //Create the factory from the keystore.
   String kmfAlgorithm=System.getProperty("ssl.KeyManagerFactory.algorithm",KeyManagerFactory.getDefaultAlgorithm());
   KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance(kmfAlgorithm);
   keyManagerFactory.init(keyStore,"mypassword");

   //Create the SSLContext
   SSLContext sslContext=SSLContext.getInstance("TLS");
   sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
   return sslContext;
  }

  //Wrap all Exceptions in a RuntimeException.
  catch(Exception e){
   throw new RuntimeException(e);
  }
 }
};

私はいくつかのショートカットを取りました(例外をログに記録しない、いくつかの文字列定数を使用するなど)が、あなたはその考えを理解することができます。

于 2010-01-22T15:54:40.757 に答える