java - 配置嵌入式 Tomcat7 以使用嵌入在可执行 jar 中的 keystore 文件

标签 java eclipse executable-jar keystore embedded-tomcat-7

我已经设法将我的嵌入式 tomcat 配置为使用 keystore 文件,并且当我从 eclipse 执行项目时它可以工作。

代码很简单:

...
String keystore = new File(MyServer.class.getResource("/keystore").toURI()).toPath().toString();
httpsConnector.setAttribute("keystoreFile",keystore);
...

文件 keystore 位于添加到构建路径的源目录中。

将项目导出到可执行 jar 后,我可以验证 jar 根目录中是否存在 keyfile

但是在执行 jar 时,我得到了这个错误:

Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical

所以我假设,我无法使用 httpsConnector.setAttribute("keystoreFile",...) 配置 key 文件。还有另一种配置方法吗?我真的不想在临时目录中复制 key 文件并从那里引用它。

最佳答案

i really dont want to copy the keyfile in a temp dir and reference it from there.

我很同情,但看起来你将不得不这样做。可以从任何类型的输入流加载 Java keystore (请参阅 Keystore.load ),因此您会认为可以从 jar 文件中的资源加载 keystore 。但是,如果您在 Tomcat 7 源代码中搜索字符串“ks.load”,您会发现它始终将 keystoreFile 属性解释为 File 的名称,并创建一个 FileInputStream,然后将其传递给 ks .load.

因此,有必要创建包含 keystore 的临时文件,并将此文件的位置作为您的 keystoreFile 属性传递。

顺便说一句 - 如果您打算分发这个 jar 并且愿意将其保密,那么您嵌入 keystore 的方法可能没问题。

但是,如果您计划将此 jar 分发到多个站点,那么每个站点的安全性都基于相同的私钥。此外,任何有权访问 jar 文件的人都可能提取私钥,然后可以窃听或中间人攻击您的所有站点。

一般来说,安装过程最好由站点管理员生成一个新的私钥和证书(即使它只是一个自签名证书)。这样每个 key 都是不同的,破坏该站点的唯一方法是访问该服务器的 keystore 和密码。

关于java - 配置嵌入式 Tomcat7 以使用嵌入在可执行 jar 中的 keystore 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141794/

相关文章:

java - Android调试器和JSOUP : Source not found

eclipse - 如何在 Eclipse 中的任何地方获取 "for loop"的内容帮助?

java - 基于 Eclipse 的 E3 应用程序,切换工作区不起作用

java - SWT 浏览器 - 禁用垂直滚动我如何隐藏它?

java - Android-sqlite 全部删除

java - 如何为没有主类的小程序获取 JAR 可执行文件?

spring-boot - Spring boot JSF可执行JAR找不到xhtml文件

java - Tomcat - 运行外部 JAR/WAR

java - Android 中如何删除 View 与其轮廓边框之间的多余空格?

java - 如何从主 Activity 调用 fragment 方法