Настройка хранилища ключей Grizzly для использования jks в банке

Я пытаюсь использовать com.sun.grizzly.SSLConfig.setKeyStoreFile(), чтобы установить SSL для Grizzly. Он принимает только строку в качестве входных данных (а не InputStream или File). Я хочу использовать файл jks, который находится в файле JAR. Если я передам строку для пути jar (например, C:\dir\my.jar!\resources\my.jks), произойдет сбой. Помимо простого распаковывания файла из JAR, как я могу использовать этот JKS для гризли.


person User1    schedule 20.01.2010    source источник


Ответы (2)


Похоже, вы не можете передать что-либо, кроме имени файла. Если вы просматриваете source и посмотрите на методы validateConfiguration() и createSSLContext(), вы увидите, что он передает переменную keyStoreFile непосредственно в конструктор FileInputStream.

В краткосрочной перспективе вы, вероятно, застряли с распаковкой и использованием прямого имени файла. Или вы можете переопределить два метода, перечисленных выше, для правильной проверки и инициализации SSLContext. В долгосрочной перспективе я бы представил патч.

person Kevin    schedule 20.01.2010

@ Идея Кевина сработала! Используя 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);
  }
 }
};

Я использовал несколько сокращений (не регистрируя исключения, используя несколько строковых констант и т. д.), но вы можете понять идею.

person User1    schedule 22.01.2010