簡體   English   中英

設置Grizzly的密鑰庫以在罐子中使用jks

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM