当前位置: 首页 > 面试题库 >

如何在jar中使用文件作为javax.net.ssl.keystore?

杨起运
2023-03-14
问题内容

我正在尝试做类似的事情

URL clientks = com.messaging.SubscriptionManager.class.getResource( "client.ks" );
String path = clientks.toURI().getPath();
System.setProperty( "javax.net.ssl.keyStore", path);

其中client.ks是我正在运行的jar文件中com / messaging中存储的文件。

读取javax.net.ssl.keyStore的对象期望jar中的client.ks文件的路径。如果可能的话,我宁愿不提取文件并将其放在客户端的计算机上。那么可以在jar中引用文件吗?

这不起作用,因为getPath()返回null。还有另一种方法吗?


问题答案:

仍在实施中,但我相信可以通过InputStream从jar中加载密钥库,并以编程方式显式设置TrustStore(与设置System属性相对)。

得到它的工作!

InputStream keystoreInput = Thread.currentThread().getContextClassLoader()
    .getResourceAsStream(<path in jar>/client.ks");
InputStream truststoreInput = Thread.currentThread().getContextClassLoader()
    .getResourceAsStream(<path in jar>/client.ts");
setSSLFactories(keystoreInput, "password", truststoreInput);
keystoreInput.close();
truststoreInput.close();

private static void setSSLFactories(InputStream keyStream, String keyStorePassword, 
    InputStream trustStream) throws Exception
{    
  // Get keyStore
  KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

  // if your store is password protected then declare it (it can be null however)
  char[] keyPassword = keyStorePassword.toCharArray();

  // load the stream to your store
  keyStore.load(keyStream, keyPassword);

  // initialize a key manager factory with the key store
  KeyManagerFactory keyFactory = 
  KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());    
  keyFactory.init(keyStore, keyPassword);

  // get the key managers from the factory
  KeyManager[] keyManagers = keyFactory.getKeyManagers();

  // Now get trustStore
  KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

  // if your store is password protected then declare it (it can be null however)
  //char[] trustPassword = password.toCharArray();

  // load the stream to your store
  trustStore.load(trustStream, null);

  // initialize a trust manager factory with the trusted store
  TrustManagerFactory trustFactory = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    
  trustFactory.init(trustStore);

  // get the trust managers from the factory
  TrustManager[] trustManagers = trustFactory.getTrustManagers();

  // initialize an ssl context to use these managers and set as default
  SSLContext sslContext = SSLContext.getInstance("SSL");
  sslContext.init(keyManagers, trustManagers, null);
  SSLContext.setDefault(sslContext);    
}


 类似资料:
  • 我有一个可运行的java jar文件,我们称之为。在这个中,如果我使用7Zip或WinRAR提取它,还有其他罐,让我们称之为。 ProGuard设法混淆了主罐子,但是当我看的时候——里面的lib罐子不是。正因为如此,程序(主rogram.jar)在某一点中断。我也已经在我的条件设置选项。 我通过蚂蚁build.xml.调用proguard.jar,这是我的配置文件

  • 问题内容: 我不知道如何 在 Java .jar文件中包括一个SQLite数据库以进行部署(通过Java WebStart)。 数据库并 没有 需要在运行时更新中…它本质上是一个华而不实的配置文件。 顺便说一下,使用Eclipse。 问题答案: 要考虑的另一个不错的选择可能是derby,javadb。它现在已与Java捆绑在一起,并且安装速度非常快,并且具有良好的性能。 问候,斯特凡

  • 我需要安装一个JAR文件作为库,同时设置数据库群集作为Azure发布管道的一部分。到目前为止,我已经完成了以下工作- 使用Azure CLI任务创建群集定义 使用curl命令将JAR文件从Maven仓库下载到管道代理文件夹 在管道代理上设置数据库CLI 使用将JAR文件从本地(管道代理)目录复制到dbfs:/FileStore/jars文件夹 我正在尝试创建一个集群范围的init脚本(bash)脚

  • 问题内容: 我在Sun上阅读了有关JAR文件的Java教程,但是仍然找不到解决我问题的方法。我需要使用一个名为jtwitter.jar的jar文件中的类,我下载了该文件并尝试执行该文件(昨天我发现可以通过双击来执行.jar文件),而Vista却给我一个错误提示:无法从[路径] /jtwitter.jar加载Main-Class Manifest属性。 编码.jar文件的人要我将其导入,但是在哪里将

  • 我编写docker文件是为了运行jar文件,而它并没有创建日志文件,请参阅下面的控制台是我的docker文件

  • 我想创建一个场景,在这个场景中我想使用来自jar文件的数据到Jmeter循环逻辑中。 我的罐子看起来像: 1)有了上面的数据,我想像贝娄图片中描述的那样“feed”Jmeter调用 2)每当我在jar文件中添加新的国家时,循环就会相应地增加。 有些人想如何做到这一点,我应该用什么作为变量,我如何告诉循环增加?