我们正在WebSphere Liberty Profile应用程序中使用JAX-RS 2.0客户端来调用外部服务。它在带有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.xml
,bootstrap.properties
和jvm.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 [[email protected]] : 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
我需要调查这个错误。
最佳答案
Alaine引导我朝着正确的方向前进,因此,这个答案值得他赞扬!
幸运的是,解决该问题的方法并不复杂。我必须使用WLP功能transportSecurity-1.0
而不是ssl-1.0
。
我必须将以下内容添加到server.xml
中的SSL配置中:
<sslDefault sslRef="sslConfig" />
我还遇到了OIDC的TAI问题。我不得不替换以下语句:
SSLContext sslContext = SSLContext.getDefault();
与:
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
简而言之,问题在于默认的SSL配置是不可变的,因此您必须确保创建自己的配置以覆盖它,而不是对其进行更改。