java - Open Liberty 下 mpRestClient 证书身份验证握手失败

标签 java ssl open-liberty

我有一个在一个 Open Liberty 实例(jdk-11.0.5+10-openj9 下的版本 20.0.0.2)下运行良好的证书文件,用于使用标准 HttpsURLConnection 向使用 cert-auth 的特定端点发出出站调用。在同一版本/JDK 的单独服务器上,我正在使用 MicroProfile REST 客户端 API(使用 @Asynchronous,如果重要的话)创建一个新应用程序,但调用因握手失败而失败。我使用相同的证书和相同的 keystore 配置(并在两台服务器中启用了“ssl-1.0”功能)...

<keyStore id="defaultKeyStore" location="key.jks" password="changeit" type="jks"/>

我尝试在两台服务器下使用“-Djavax.net.debug=all”进行调试,发现在服务器启动时,在这两种情况下都找到了具有我的目标别名的证书并将其添加为受信任的证书....

SunX509KeyManagerImpl.java:164|found key for : my-alias (...)
X509TrustManagerImpl.java:79|adding as trusted certificates (...)
SSLContextImpl.java:115|trigger seeding of SecureRandom
SSLContextImpl.java:119|done seeding of SecureRandom

但是,对于 mpRestClient 应用程序,当我调用相关端点时,它似乎会自发地将信任存储切换到默认的 JDK cacerts 信任存储......

TrustStoreManager.java:112|trustStore is: C:\Program Files\AdoptOpenJDK\jdk-11.0.5+10-openj9\lib\security\cacerts
....
TrustStoreManager.java:311|Reload the trust store
TrustStoreManager.java:318|Reload trust certs
TrustStoreManager.java:323|Reloaded 88 trust certs
X509TrustManagerImpl.java:79|adding as trusted certificates (...)
SSLContextImpl.java:115|trigger seeding of SecureRandom
SSLContextImpl.java:119|done seeding of SecureRandom

经过一系列谈判,最终......

CertificateMessage.java:290|No X.509 certificate for client authentication, use empty Certificate message instead
CertificateMessage.java:321|Produced client Certificate handshake message (
  "Certificates": <empty list>
)
....
TransportContext.java:312|Fatal (HANDSHAKE_FAILURE): Couldn't kickstart handshaking (
  "throwable" : {
    javax.net.ssl.SSLException: readHandshakeRecord
    ....
  }
)

当然,没有找到用于客户端身份验证的证书,因为整个信任库已重新加载,从而清除了最初加载的信任库。这种信任存储的自发切换不会在其他服务器下发生。该服务器上相关的成功行为是...

SunX509KeyManagerImpl.java:401|matching alias: my-alias
ServerHelloDone.java:151|Consuming ServerHelloDone handshake message (
  <empty>
)
CertificateMessage.java:321|Produced client Certificate handshake message (...)
SSLSocketOutputRecord.java:241|WRITE: TLS12 handshake, length = 3769
SSLSocketOutputRecord.java:255|Raw write (...)
RSAClientKeyExchange.java:193|Produced RSA ClientKeyExchange handshake message (...)
SSLSocketOutputRecord.java:241|WRITE: TLS12 handshake, length = 262
SSLSocketOutputRecord.java:255|Raw write (...)
CertificateVerify.java:743|Produced CertificateVerify handshake message (...)
SSLSocketOutputRecord.java:241|WRITE: TLS12 handshake, length = 264
SSLSocketOutputRecord.java:255|Raw write (...)
ChangeCipherSpec.java:115|Produced ChangeCipherSpec message
SSLSocketOutputRecord.java:225|Raw write (...)
Finished.java:398|Produced client Finished handshake message (...)
....
ChangeCipherSpec.java:149|Consuming ChangeCipherSpec message
....
SSLSocketInputRecord.java:249|READ: TLSv1.2 handshake, length = 64
SSLCipher.java:1329|Padded plaintext after DECRYPTION (...)
Finished.java:535|Consuming server Finished handshake message (...)
SSLSocketOutputRecord.java:309|WRITE: TLS12 application_data, length = 339
SSLCipher.java:1483|Padded plaintext before ENCRYPTION (...)
SSLSocketOutputRecord.java:323|Raw write (...)
...
SSLSocketInputRecord.java:249|READ: TLSv1.2 application_data, length = 544
SSLCipher.java:1329|Padded plaintext after DECRYPTION (...)
[...and then I get my decrypted response...]

两种服务器设置之间的另一个区别是,成功的服务器是独立下载 javaee8 版本的 Open Liberty,而不成功的服务器则通过 Maven 执行...

mvn liberty:dev -Ddebug=false -DskipTests=true

我不知道为什么这会产生任何影响,但很明显是有影响的。配置的设置几乎相同。我一直在广泛地寻找并尝试着我能想到的一切来修补,但现在我只是不知道什么可能会产生影响。希望有人注意到一些事情。关键是让运行 mpRestClient 应用程序的服务器停止自发地将信任存储切换到 JDK cacerts 默认值。但到目前为止,我没有尝试过任何方法来阻止这种情况。

最佳答案

最终,我认为这是一个错误,所以我建议您在https://github.com/OpenLiberty/open-liberty/issues打开一个问题(请务必引用此页面)。我认为您可以通过添加 appSecurity-2.0 功能来解决此问题。 JAX-RS 似乎需要 SSL 和 AppSecurity 功能才能使用不同的 key 存储。这解释了 ClassNotFoundException - 如果安装了 appSecurity-2.0 (或 3.0)功能,则 JaxRsSSLManager 类仅添加到框架的类路径中。

使用 AppSecurity 功能应该可以解决该问题,但我认为这是一种解决方法。如果您使用 OpenLiberty 提出问题,我们可以尝试在不使用 AppSecurity 功能的情况下解决此问题。

希望这有帮助,安迪

关于java - Open Liberty 下 mpRestClient 证书身份验证握手失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60300147/

相关文章:

websphere - 使用开放式 liberty-maven-plugin 时如何设置委托(delegate)parentLast?

maven - 如何在 maven 构建期间将外部依赖项复制到 Open Liberty

java - 对 HashSet 集合进行排序

java - java例子中的facebook实时更新

java - 对对象数组列表进行排序问题

ssl - Nginx 重定向到 SSL 上的主域

ssl - 如何在 Apache Airflow 上启用 SSL?

java源码与intellij中的groovy插件和gradle的兼容性

android - 改造不适用于 sha256 测试 url 的 map api

java - 无法在 WebSphere Liberty 配置文件中为多个应用程序配置 log4j