在localhost上运行的HTTPS Web服务调用在测试环境中失败,但有异常:javax.net.ssl.SSLException:SSLSocketFactory为null

时间:2016-04-25 12:49:52

标签: java ssl soap websphere system-properties

我们正在通过HTTPS访问SOAP Web服务。我们设置了多个环境,用于开发,测试,用户接受,生产。主要问题是,我们对开发环境的SSL Web服务调用工作正常,但是当我们将它部署到测试环境时,我们得到了

javax.net.ssl.SSLException: SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called to create a socket and javax.net.ssl.* properties are not set.

尝试建立连接时。目标Web服务与开发和测试相同。

我们在两种环境中都使用IBM Websphere 7.0。它使用Java 1.6。

我注意到,本地和测试服务器JRE之间的系统属性存在差异。

  

localhost: java.fullversion = JRE 1.6.0 IBM J9 2.4 Windows 7 x86-32   jvmwi3260sr15-20131016_170922 (已启用JIT,已启用AOT)J9VM -   20131016_170922 JIT - r9_20130920_46510ifx2 GC -   GA24_Java6_SR15_20131016_1337_B170922

     

TestServer: java.fullversion = JRE 1.6.0 IBM J9 2.4 Windows Server 2008 amd64-64 jvmwa6460sr15-20131016_170922 (已启用JIT,已启用AOT)J9VM - 20131016_170922 JIT - r9_20130920_46510ifx2 GC - GA24_Java6_SR15_20131016_1337_B170922_CMPRSS

我们在代码中设置SSL的所有necesery系统属性:

String certLoc = Configuration.getString("CERT_LOCATION");

System.setProperty("javax.net.ssl.keyStore", certLoc + "\\certificate.pfx");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
System.setProperty("javax.net.ssl.trustStore", certLoc + "\\TRUSTSTORE.jks");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStorePassword", "password");

如果我检查每个环境的系统属性,则javax.net.ssl.*的值将被设置为corectly。

有人有类似的问题吗?你可以和我分享你的解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

由于您在测试环境(或远离开发计算机的任何系统)中运行,因此请确保您的代码通过记录它们来获取正确的系统属性值(可能将日志级别切换为debug)。运行代码的“用户”可能有一组不同的系统/运行时属性,或者根本没有设置。

如果您已确认您的开发属性确实是在测试环境中正在运行的代码的上下文中定义的,请检查您的属性指向的完整文件路径是否存在,并且您的代码具有对它的读取权限(特别是在* nix系统中)。另外,请检查certloc的值是否在环境中具有正确的分隔符。

为了获得更好的可移植性,在构建字符串路径值时,请考虑使用可以从file.separatorhttps://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html检索的path.separatorSystem.properties