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