Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用来自java的证书连接到webservice_Java_Web Services_Ssl_Certificate - Fatal编程技术网

使用来自java的证书连接到webservice

使用来自java的证书连接到webservice,java,web-services,ssl,certificate,Java,Web Services,Ssl,Certificate,我正在从java程序连接到Web服务。 Web服务需要证书才能返回任何数据。 我还没有用java代码建立证书连接。 相反,我使用了一种称为Stunnel的东西,它只是用证书创建到主机的连接。 现在,我想删除stunnel并从java执行所有操作。这肯定是可能的吗 这是特技的配置 cert = /etc/stunnel/client.pem options = NO_SSLv2 [https] client = yes accept = 8083 sni = www.xxx.se connect

我正在从java程序连接到Web服务。 Web服务需要证书才能返回任何数据。 我还没有用java代码建立证书连接。 相反,我使用了一种称为Stunnel的东西,它只是用证书创建到主机的连接。 现在,我想删除stunnel并从java执行所有操作。这肯定是可能的吗

这是特技的配置

cert = /etc/stunnel/client.pem
options = NO_SSLv2

[https]
client = yes
accept = 8083
sni = www.xxx.se
connect = www.xxx.se:443
为了启动隧道,我需要提供一个连接到证书的密码,所以代码中也需要这个密码

我现在的代码

 URL url = new URL(wsdlURL);            
 QName qname =  new QName("urn:ws.fps.xxx.com/supportToolSupport",       "SupportToolSupportService");      
 javax.xml.ws.Service = javax.xml.ws.Service.create(url, qname);        
 SupportToolSupport support = service.getPort(SupportToolSupport.class);    
 List<Company> companies =  support.supportToolGetCompanies("");
URL URL=newurl(wsdlURL);
QName QName=新的QName(“urn:ws.fps.xxx.com/supportToolSupport”,“SupportToolSupportService”);
javax.xml.ws.Service=javax.xml.ws.Service.create(url,qname);
SupportToolSupport=service.getPort(SupportToolSupport.class);
上市公司=support.supportToolGetCompanys(“”);

你知道在这段代码取代stunnel之前要做什么吗?

看起来类
SupportToolSupport
是从WSDL生成的pojo。调用
SupportToolSupport.SupportToolGetCompanys()
时,pojo实际上正在建立连接。默认情况下,它将使用JVM的证书存储,包括密钥存储和信任存储。密钥库通常称为Keystore.jks,信任库通常称为cacerts(.jks)。这些文件通常位于/lib/security中。您可以通过编程方式管理JVM访问证书存储的方式,但如果可能,设置环境会更容易。通过将以下变量传递给java,可以强制JVM在调用java时使用特定的密钥库、别名和密码:

-Djavax.net.ssl.keyStore="path to keyStore.jks"
-Djavax.net.ssl.keyStoreType="JKS"
-Djavax.net.ssl.keyStorePassword="changeit"
-Djavax.net.ssl.trustStore="path to cacerts"
例如,命令行:

java -Djavax.net.ssl.keyStore="path to keyStore.jks" ... -cp <class path> class.to.run
java-Djavax.net.ssl.keyStore=“keyStore.jks的路径”-cp class.to.run
对于Eclipse,请将上面的行复制并粘贴到运行配置中的参数选项卡的VM Arguments框中。
运行->运行配置->查找配置->选择参数选项卡

确定谢谢您的htis响应。我尝试过类似的方法:System.setProperty(“javax.net.ssl.keyStore”、“c:\\client.p12”);但从来没有让它起作用。可能是其中一个文件出错了,或者是文件路径或其他什么。我有一个jks文件,它应该与工作的pem文件相同。我猜密码也应该是一样的。但是我如何创建一个有效的信任库呢?我需要信任商店吗?我希望它信任我这边的一切,那么有没有更简单的方法呢?你几乎总是需要一个信任库——这就是你的JVM知道如何“信任”你正在连接的站点。使用证书颁发机构(CA)可能会变得复杂,但最简单的方法是将要连接的站点的公共证书添加到信任库中。然后确保您的JVM正在使用该信任库。是的,信任库和密钥库的默认密码通常为“changeit”。如果您创建自己的证书存储,您可以自己设置。您可以使用JDK附带的keytool来管理这些证书存储。此外,您也可以使用您的证书/密钥文件(即p12文件)作为密钥库,但必须将keyStoreType属性设置为pkcs12,而不是默认的JKS。不过,我不会这样做,而是使用keytool实用程序将p12导入keyStore.jks。它可能是这样的:
keytool-importcert-keystore keystore.jks-storepass changeit-file client.p12-alias myClient
-好的,我一直在尝试用谷歌搜索,但发现很难。我认为我拥有的密钥库和密码。我将使用jks文件。然而,我发现卡塞特更难。我是否应该从java\jre6\lib\security复制cacerts文件,然后以某种方式将相同的jks文件添加到此cacerts文件中,然后使用此cacert?如果我使用System.setProperty(“javax.net.ssl.keyStore”,“c:/client.jks”);方法,而不是设置环境(我不知道如何)。我应该如何编写文件路径?我已经看到c://和c:\\n我可以检查属性是否以某种方式设置为实际文件吗?好的,现在我有一个cacerts文件,我相信它包括client.pem文件。已经尝试过:System.setProperty(“javax.net.ssl.keyStore”,“c:/client.jks”);setProperty(“javax.net.ssl.keystrepassword”、“xxx”);setProperty(“javax.net.ssl.keyStoreType”、“JKS”);set属性(“javax.net.ssl.trustStore”、“c:/cacerts”);setProperty(“javax.net.ssl.trustStorePassword”、“changeit”);以及将路径更改为c:\\client.jks。这两个都不起作用。不幸的是,如果服务没有得到证书,它将以空列表响应,则不会出现错误