我有jar
将使用websockets
连接到网站进行通信。该网站是 SSL 网站,因此我有.ts
程序需要加载文件。以下是用于加载.ts文件的java代码
System.setProperty("javax.net.ssl.trustStore",
"foo.ts");
System.setProperty("javax.net.ssl.trustStorePassword", "password");
并且java程序在一个名为foo.web
的包中,因此当打包到jar中时,它位于一个名为foo
的文件夹中,然后有一个名为web
的子文件夹。
我的问题是,我是否将foo.ts
放在我的类所在的foo/web
文件夹中,或者我应该将foo.ts
文件放在jar的根目录下来加载我的用于加载foo.ts
文件的程序中的当前代码?
答案 0 :(得分:2)
System.setProperty周围的工作...需要'常规'文件路径,正在使用机制来解析类资源:
a
//this will find the file in the package folder
URL cert = this.getClass().getResource("ts");
String path = cert.toString(); //this translate the url to file system location
if (path.startsWith("file:"))
path = path.substring("file:".length()+1,path.length()); //getting rid of file prefix as not needed
System.setProperty("javax.net.ssl.trustStore", path);
如果你想在jar中包含ts,类似的技巧,但不是路径(这将无法工作,阅读内容并将其保存到临时位置
in = this.getClass().getResourceAsStream(wsdl);
... save it to tmp location
System.setProperty("javax.net.ssl.trustStore", your tmp location);
答案 1 :(得分:1)
我假设您有未签名的自生成证书,您希望将其用于ssl连接。
通过ssl服务内容的部分(您的tomcat在443或apache上)需要知道证书及其密钥(在tomcat或apache文件中配置)。 您在该服务器上部署的Java代码不需要知道证书,甚至不需要知道ssl。
但是想要连接到这样的服务器的代码,让我们说Web服务客户端将抛出异常(并且非常模糊btw),因为它无法识别证书并拒绝连接(不同于Web浏览器哪个对话框可以让你添加例外)。 因此,客户端代码需要在oppening连接之前添加到其TrustedStore的证书(使用System.property的技巧完成工作)。由于它,客户端可以信任连接,因为您的远程证书与他已有的远程证书匹配。
如果您的客户端代码恰好在同一个tomcat上运行,它仍然需要将证书添加到商店,因为443处的连接器的配置选项仅将证书暴露给可以读取它的任何人,但不添加它到tomcat的知识库池。为此,您需要-catava.net.ssl.trustStore = YOUR_TS -Djavax.net.trustStorePassword =用于tomcat启动的PASS选项,或者应用程序代码中的System.setProperty。
答案 2 :(得分:0)
javax.net.ssl.trustStore属性的值是指向磁盘上信任库的位置的文件路径。如果您没有指定文件夹,它将假定该程序的当前工作目录,该目录很可能是调用JVM的位置。如果您不确定当前的工作目录是什么,可以从user.dir系统属性获取它。
System.getProperty("user.dir"));