我正在尝试使用com.sun.grizzly.SSLConfig.setKeyStoreFile()为 Grizzly 设置 SSL。它只需要一个字符串作为输入(不是 InputStream 或 File)。我想使用 JAR 文件中的 jks 文件。如果我为 jar 路径传递一个字符串(例如 C:\dir\my.jar!\resources\my.jks),它会失败。除了从 JAR 中解压缩文件之外,我如何将 JKS 用于 grizzly。
问问题
2077 次
2 回答
3
除了文件名之外,您似乎无法传递任何内容。如果您查看源代码并查看validateConfiguration()
andcreateSSLContext()
方法,您会发现它正在将keyStoreFile
变量直接传递给FileInputStream
构造函数。
短期而言,您可能会被解压缩并使用直接文件名。或者您可以覆盖上面列出的两种方法来正确验证和初始化 SSLContext。从长远来看,我会提交一个补丁。
于 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 回答