Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenLiberty下的mpRestClient证书身份验证握手失败_Java_Ssl_Open Liberty - Fatal编程技术网

Java OpenLiberty下的mpRestClient证书身份验证握手失败

Java OpenLiberty下的mpRestClient证书身份验证握手失败,java,ssl,open-liberty,Java,Ssl,Open Liberty,我有一个cert文件,它在一个OpenLiberty实例(jdk-11.0.5+10-openj9下的版本20.0.0.2)下运行良好,可以使用标准的HttpsURLConnection对使用cert auth的特定端点进行出站调用。在同一版本/JDK的单独服务器上,我正在使用MicroProfile REST客户端API创建一个新的应用程序(如果需要的话,使用@Asynchronous),但由于握手失败,调用失败。我使用相同的证书和相同的密钥库配置(并且在两台服务器中都启用了“ssl-1.0”

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

但是,对于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
    ....
  }
)

我不知道为什么这会有什么不同,但很明显有些事情是这样的。配置的设置几乎相同。我一直在到处寻找,尝试着我能想到的一切去修补,但现在我只是在茫然不知是什么让我变得与众不同。希望有人注意到一些事情。关键是让运行mpRestClient应用程序的服务器停止自动将信任存储切换到JDK cacerts默认值。但到目前为止,我还没有尝试过阻止这种情况发生。

最终,我认为这是一个bug,因此我建议您在(请务必参考此页面)打开一个问题。我认为您可以通过添加appSecurity-2.0功能来解决这个问题。JAX-RS似乎需要SSL和AppSecurity特性才能使用不同的密钥存储。这就解释了ClassNotFoundException——只有在安装了
appSecurity-2.0
(或3.0)功能的情况下,才会将JAXRSSLManager类添加到框架的类路径中

使用AppSturnices特性应该解决这个问题,但我认为这是一个解决办法。如果您使用OpenLiberty打开一个问题,我们可以尝试在没有AppSecurity功能的情况下使其正常工作


希望这能有所帮助,Andy最终,我认为这是一个bug,因此我建议您在上打开一个问题(请务必参考此页面)。我认为您可以通过添加appSecurity-2.0功能来解决这个问题。JAX-RS似乎需要SSL和AppSecurity特性才能使用不同的密钥存储。这就解释了ClassNotFoundException——只有在安装了
appSecurity-2.0
(或3.0)功能的情况下,才会将JAXRSSLManager类添加到框架的类路径中

使用AppSturnices特性应该解决这个问题,但我认为这是一个解决办法。如果您使用OpenLiberty打开一个问题,我们可以尝试在没有AppSecurity功能的情况下使其正常工作


希望这能有所帮助,安迪

你好,雅各布,你能发布工作和失败案例的messages.log吗?我特别感兴趣的是已启用的功能列表,以及是否存在有关功能或捆绑包的任何警告/错误。我猜失败的案例缺少某些功能。工作服务器的功能包括完整的MicroFile-3.0功能:
A CWWKF0012I:服务器安装了以下功能:[appSecurity-2.0、cdi-2.0、concurrent-1.0、distributedMap-1.0、ejbLite-3.2、javaMail-1.6、jaxb-2.2、jaxrs-2.1、jaxrsClient-2.1、jaxws-2.2、jdbc-4.2、jndi-1.0、jpa-2.2、jpaContainer-2.2.2、json-1.0、jsonb-1.0、jsonp-1.1.1.1、jwt-1.0、localConnector-1.0、FILE-3.0、MicroPROPROPROCONFIG-1.3、MPP-2.0、MPP-2.0、MPP-1.0、MPP-1.0、MPWT-1.0、MP1.0、MP1.0、MP1.0、MP1.0、MPI-1.1、mpOpenTracing-1.3、mpRestClient-1.3、opentracing-1.3、restConnector-2.0、servlet-4.0、ssl-1.0]。
故障服务器的功能,使用更精简的功能集(这一次是transportSecurity-1.0,但也尝试只使用ssl-1.0,在行为上没有重大差异):
A CWWKF0012I:服务器安装了以下功能:[cdi-2.0、jaxrs-2.1、jaxrsClient-2.1、jndi-1.0、jsonp-1.1、localConnector-1.0、mpConfig-1.3、mpRestClient-1.3、servlet-4.0、ssl-1.0、transportSecurity-1.0].
我确实在失败的服务器中注意到了这一点,尽管这对我来说没有意义,因为我在文件
configDropins/defaults/keystore.xml
中的密钥库中提供了密码,正如您在上面看到的:
I CWPKI0819I:默认密钥库没有创建,因为在元素上没有配置密码,而“keystore\u”剑的环境变量未设置。
现在我明白了原因。几行之后,它会处理配置下拉列表,所以这不重要:
一个CWWKG0093A:处理配置下拉列表资源:[…路径到…]\target\liberty\wlp\usr\servers\defaultServer\configDropins\defaults\keystore.xml
Hi Jacob,您能发布工作和失败案例的messages.log吗?我特别感兴趣的是已启用的功能列表,以及是否有任何关于功能或捆绑包的警告/错误。我猜失败案例丢失了某些功能或其他。工作服务器的功能包括完整的MicroFile-3.0功能:
A CWWKF0012I:服务器安装了以下功能:[appSecurity-2.0、cdi-2.0、concurrent-1.0、distributedMap-1.0、ejbLite-3.2、javaMail-1.6、jaxb-2.2、jaxrs-2.1、jaxrsClient-2.1、jaxws-2.2、jdbc-4.2、jndi-1.0、jpa-2.2、jpaContainer-2.2.2、json-1.0、jsonb-1.0、jsonp-1.1.1.1、jwt-1.0、localConnector-1.0、FILE-3.0、MicroPROPROPROCONFIG-1.3、MPP-2.0、MPP-2.0、MPP-1.0、MPP-1.0、MPWT-1.0、MP1.0、MP1.0、MP1.0、MP1.0、MPI-1.1、mpOpenTracing-1.3、mpRestClient-1.3、opentracing-1.3、restConnector-2.0、servlet-4.0、ssl-1.0]。
故障服务器的功能,使用更精简的功能集(这一次是transportSecurity-1.0,但也尝试只使用ssl-1.0,在行为上没有重大差异):
A CWWKF0012I:服务器安装了以下功能:[cdi-2.0、jaxrs-2.1、jaxrsClient-2.1、jndi-1.0、jsonp-1.1、localConnector-1.0、mpConfig-1.3、mpRestClient-1
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...]
mvn liberty:dev -Ddebug=false -DskipTests=true