【问题标题】:Connect to webservice with certificate from java使用来自 java 的证书连接到 web 服务
【发布时间】:2015-07-08 23:49:31
【问题描述】:

我正在从 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("");

知道在此代码之前要执行什么代码来替换通道吗?

【问题讨论】:

    标签: java web-services ssl certificate


    【解决方案1】:

    看起来SupportToolSupport 类是从 WSDL 生成的 pojo。当您致电SupportToolSupport.supportToolGetCompanies() 时,pojo 实际上正在建立连接。默认情况下,它将使用您的 JVM 的证书存储,包括 Keystore 和 TrustStore。 Keystore 通常称为 keyStore.jks,TrustStore 通常称为 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
    

    对于 Eclipse,将上面的行复制并粘贴到运行配置中 Arguments TabVM Arguments 框中。 运行 -> 运行配置 -> 找到您的配置 -> 选择参数选项卡

    【讨论】:

    • 好的,感谢您对 htis 的回复。我试过这样的事情: System.setProperty("javax.net.ssl.keyStore", "c:\\client.p12");但从来没有让这个工作。也许其中一个文件是错误的,或者文件路径或其他东西。我有一个 jks f,它应该与有效的 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 - Docs on keytool
    • OK 一直在尝试用谷歌搜索,但发现很难。我认为我拥有的密钥库和密码。我将使用 jks 文件。但是我觉得更难。我是否应该从我的 java Java\jre6\lib\security 复制 cacerts 文件,然后以某种方式将这个相同的 jks 文件添加到这个 cacerts 文件中,然后使用这个 cacert?另外,如果我使用 System.setProperty("javax.net.ssl.keyStore", "c:/client.jks");在代码中处理而不是设置环境(我不确定如何)。我应该如何编写文件路径?我已经看到了 c:/ 和 c:\\ 我可以检查该属性是否以某种方式设置为实际文件吗?
    • OK 现在有一个 cacerts 文件,我相信它包含 client.pem 文件。试过这个: System.setProperty("javax.net.ssl.keyStore", "c:/client.jks"); System.setProperty("javax.net.ssl.keyStorePassword", "xxx"); System.setProperty("javax.net.ssl.keyStoreType", "JKS"); System.setProperty("javax.net.ssl.trustStore", "c:/cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");以及将路径更改为 c:\\client.jks。这两个都不起作用。不幸的是,如果服务没有获得它以空列表响应的证书,则没有错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多