设置Grizzly的密钥库以在jar中使用jks

时间:2010-01-20 20:01:27

标签: java ssl jar jks grizzly

我正在尝试使用com.sun.grizzly.SSLConfig.setKeyStoreFile()为Grizzly设置SSL。它只接受一个String作为输入(不是InputStream或File)。我想使用JAR文件中的jks文件。如果我为jar路径传递一个字符串(例如C:\ dir \ my.jar!\ resources \ my.jks),它就会失败。除了从JAR解压缩文件之外,我如何将这个JKS用于灰熊。

2 个答案:

答案 0 :(得分:3)

您似乎无法传递文件名以外的任何内容。如果您查看source并查看validateConfiguration()createSSLContext()方法,您会看到它将keyStoreFile变量直接传递给FileInputStream构造函数

短期内,您可能会遇到解压缩并使用直接文件名。或者您可以覆盖上面列出的两种方法来正确验证和初始化SSLContext。从长远来看,我会提交补丁。

答案 1 :(得分:2)

@凯文的想法奏效了!使用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);
  }
 }
};

我采用了一些快捷方式(不记录异常,使用多个字符串常量等),但是你可以得到这个想法。