代码之家  ›  专栏  ›  技术社区  ›  User1

设置grizzly的keystore以使用jar中的jk

  •  1
  • User1  · 技术社区  · 15 年前

    我想用 com.sun.grizzly.SSLConfig.setKeyStoreFile() 为灰熊设置SSL。它只接受一个字符串作为输入(而不是inputstream或file)。我想使用JAR文件中的JKS文件。如果我传递JAR路径的字符串(例如c:\dir\my.jar!)\资源\my.jks),失败。除了从jar中解压缩文件之外,我如何使用jks来处理grizzly。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Kevin    15 年前

    除了文件名外,您似乎无法传递其他任何信息。如果您查看 source 看看 validateConfiguration() createSSLContext() 方法,您将看到它正在通过 keyStoreFile 变量直接进入 FileInputStream 构造函数。

    短期内,您可能会陷入解压和使用直接文件名的困境。或者您可以重写上面列出的两个方法来正确验证和初始化sslcontext。长期来看,我会提交一个补丁。

        2
  •  2
  •   User1    15 年前

    @凯文的主意奏效了!使用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);
      }
     }
    };
    

    我走了一些捷径(不记录异常,使用几个字符串常量等),但您可以理解。