我已经设法将我的嵌入式 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/