[英]Setting Grizzly's keystore to use a jks in a jar
我正在嘗試使用com.sun.grizzly.SSLConfig.setKeyStoreFile()為Grizzly設置SSL。 它僅將String作為輸入(而不是InputStream或File)。 我想使用JAR文件中的jks文件。 如果我為jar路徑傳遞字符串(例如C:\\ dir \\ my.jar!\\ resources \\ my.jks),它將失敗。 除了只是從JAR解壓縮文件外,我如何才能使用該JKS進行灰熊操作。
除文件名外,您似乎無法傳入任何其他內容。 如果查看源代碼並查看validateConfiguration()
和createSSLContext()
方法,您會看到它正在將keyStoreFile
變量直接傳遞到FileInputStream
構造函數中。
短期來看,您可能會陷入解壓縮和使用直接文件名的困境。 或者,您可以重寫上面列出的兩個方法以正確地驗證和初始化SSLContext。 長期來看,我會提交一個補丁。
@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);
}
}
};
我采取了一些捷徑(不記錄異常,不使用幾個字符串常量,等等),但是您可以理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.