WebSphere Liberty Profile 17.0.0.4打破JAX-RS客户端TrustStore -

时间:2018-01-24 02:07:17

标签: ssl jax-rs websphere-liberty

我们在WebSphere Liberty Profile应用程序中使用JAX-RS 2.0 Client来调用外部服务。它适用于带有Java 8.0的WLP 16.0.0.4。当我尝试在17.0.0.4上运行相同的应用程序时,我们在信任库上收到证书错误。

经过大量试验和错误后,似乎WLP不再从以下属性加载信任库(这来自我的jvm.options文件):

-Djavax.net.ssl.trustStore=../../shared/resources/security/trust_yourIBM_TEST.jks

以上工作在16.0.0.4中,但javax.net.ssl.trustStore属性不再用于指向信任库(如果我将该属性指向16.0.0.4中的丢失文件,我收到一个错误,找不到文件,但在17.0.0.4中,我没有收到错误)。所以我添加了以下内容:

-Djavax.net.ssl.trustStore=../../shared/resources/security/trust_yourIBM_TEST.jks
-Dcom.ibm.ssl.trustStore=../../shared/resources/security/trust_yourIBM_TEST.jks

这仍然无效。我无法在任何地方找到WLP发行说明来解释JAX-RS在WLP 17.x中的表现不同。

有谁知道我如何指向WLP 17.0.0.4中的信任库?

==========================================

更新#1 - 2018/01/24

我使用完全相同的JDK,server.xmlbootstrap.propertiesjvm.options文件,以及相同的应用程序文件。唯一的区别是WLP实例。我也使用默认信任库的相同条目,它指向我在上面粘贴的jvm.properties中指向的同一文件。以下是启动日志条目:

17.0.0.4
product = WebSphere Application Server 17.0.0.4 (wlp-1.0.19.201712061531)
wlp.install.dir = C:/IBM/WLP_17.0.0.4/
java.home = C:\IBMJava80\jre
java.version = 1.8.0_151
java.runtime = Java(TM) SE Runtime Environment (8.0.5.7 - pwa6480sr5fp7-20171216_01(SR5 FP7))

16.0.0.4
product = WebSphere Application Server 16.0.0.4 (wlp-1.0.15.cl160420161113-0206)
wlp.install.dir = C:/IBM/WLP_16.0.0.4/
java.home = C:\IBMJava80\jre
java.version = 1.8.0_151
java.runtime = Java(TM) SE Runtime Environment (8.0.5.7 - pwa6480sr5fp7-20171216_01(SR5 FP7))

当我将信任库更改为不存在的文件时,这是我在16.0.0.4中遇到的错误:

[1/24/18 10:50:06:025 EST] 0000006e id=         uribm.services.expensesaggregator.ejb.ExpensesEjbCommonUtils E callUnifiedProfile() Exception has occurred Exception encountered during call to UP: javax.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://w3-services1.w3-969.ibm.com/myw3/unified-profile/v1/docs/instances/masterByEmail?email=dlwester%40us.ibm.com: java.security.cert.CertificateException: No X509TrustManager implementation available for [userId=dlwester@us.ibm.com] : javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://w3-services1.w3-969.ibm.com/myw3/unified-profile/v1/docs/instances/masterByEmail?email=dlwester%40us.ibm.com: java.security.cert.CertificateException: No X509TrustManager implementation available

这是我的密钥库/信任库条目(信任库指向与jvm.options相同的文件):

<!-- default keystore -->
<keyStore id="defaultKeyStore"
          location="${keystoreLocation}"
          password="${keystorePassword}" />

<!-- default truststore -->
<keyStore id="defaultTrustStore"
          location="${truststoreLocation}"
          password="${truststorePassword}" />

<ssl id="sslConfig"
     keyStoreRef="defaultKeyStore"
     trustStoreRef="defaultTrustStore"
     sslProtocol="SSL_TLSv2"
     serverKeyAlias="${serverKeyAlias}" />

=====

更新#2

我向WLP添加了transportSecurity-1.0功能,如果我指向一个不存在的文件,现在我在17.0.0.4中收到错误。如果我指向正确的信任库文件,我现在得到一个不同的错误:

[1/24/18 12:03:19:905 EST] 0000003d id=         com.ibm.w3.security.tai.OAuthDownStreamTAI                   E getSslSocketFactoryWithTrustStore() exception encountered on sslContext.init() for truststore C:/IBM/WLP_17.0.0.4/usr/shared/resources//security/trust_yourIBM_TEST.jks - java.security.KeyManagementException: Default SSLContext is initialized automatically

我需要调查此错误。

1 个答案:

答案 0 :(得分:0)

Alaine引导我朝着正确的方向前进,所以这个答案归功于他!

幸运的是,这个问题的解决方案并不复杂。我不得不使用WLP功能transportSecurity-1.0而不是ssl-1.0

我必须在server.xml中的SSL配置中添加以下内容:

<sslDefault sslRef="sslConfig" />

我的OIDC TAI也遇到了问题。我不得不替换以下声明:

SSLContext sslContext = SSLContext.getDefault();

with:

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");

简而言之,问题是默认的SSL配置是不可变的,因此您必须确保创建自己的配置以覆盖它,而不是更改它。