Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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中的Websphere密钥库的情况下实现相互SSL?_Java_Ssl_Websphere_Keystore_Mutual Authentication - Fatal编程技术网

有没有一种方法可以在不直接访问Java中的Websphere密钥库的情况下实现相互SSL?

有没有一种方法可以在不直接访问Java中的Websphere密钥库的情况下实现相互SSL?,java,ssl,websphere,keystore,mutual-authentication,Java,Ssl,Websphere,Keystore,Mutual Authentication,我正在尝试在2台WebSphere8.5.5服务器之间建立相互SSL。我就叫他们ServerA和ServerB ServerA:客户端,将ServerB的SSL证书添加到DefaultTrustKeyStore中 服务器端,将ServerA的SSL证书添加到DefaultTrustKeyStore中。我还安装了一个WAR,它提供了一个servlet,可以接收HTTPPOST消息,记录它,并向客户机响应“OK”。客户端身份验证模式设置为“必需” 现在我遇到了一个问题:传统的相互SSL客户端必须直接

我正在尝试在2台WebSphere8.5.5服务器之间建立相互SSL。我就叫他们ServerA和ServerB

ServerA:客户端,将ServerB的SSL证书添加到DefaultTrustKeyStore中

服务器端,将ServerA的SSL证书添加到DefaultTrustKeyStore中。我还安装了一个WAR,它提供了一个servlet,可以接收HTTPPOST消息,记录它,并向客户机响应“OK”。客户端身份验证模式设置为“必需”

现在我遇到了一个问题:传统的相互SSL客户端必须直接读取密钥库来检索私钥,所以我们可以使用它来设置SSLContext来进行客户端身份验证。但直接访问密钥库可能存在安全缺陷。所以我需要找到一种方法,如果我可以让我的ServerA的websphere为我做这件事(或者可以命令websphere做这件事的Java代码)

有人能教我如何在不直接访问密钥库的情况下执行此操作吗


更新:

你好,德布雷奥

我试着用你的方法做一个环回连接,但它似乎不起作用

下面是SSL调试日志的最后一部分:

[2017/9/3   21:06:25:284 CST] 00000099 SystemOut     O JsseJCE:  Using KeyGenerator IbmTlsPrf from provider TBD via init 
[2017/9/3   21:06:25:284 CST] 00000099 SystemOut     O HandshakeMessage:  TLS Keygenerator IbmTlsPrf  from provider from init IBMJCE version 1.8
[2017/9/3   21:06:25:284 CST] 00000099 SystemOut     O WebContainer : 3, WRITE: TLSv1 Change Cipher Spec, length = 1
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O JsseJCE:  Using cipher AES/CBC/NoPadding from provider TBD via init 
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O CipherBox:  Using cipher AES/CBC/NoPadding from provider from init IBMJCE version 1.8
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O JsseJCE:  Using MAC HmacSHA1 from provider TBD via init 
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O MAC:  Using MessageDigest HmacSHA1 from provider IBMJCE version 1.8
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O *** Finished
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O verify_data:  { 226, 248, 159, 68, 107, 196, 76, 219, 134, 227, 129, 58 }
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O ***
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, WRITE: TLSv1 Handshake, length = 48
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, waiting for close_notify or alert: state 1
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, Exception while waiting for close java.net.SocketException: Software caused connection abort: recv failed
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O %% Invalidated:  [Session-27, SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA]
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, SEND TLSv1 ALERT:  fatal, description = handshake_failure
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, WRITE: TLSv1 Alert, length = 32
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, Exception sending alert: java.net.SocketException: Software caused connection abort: socket write error
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, called closeSocket()
[2017/9/3   21:06:25:285 CST] 00000099 SystemOut     O WebContainer : 3, handling exception: javax.net.ssl.SSLHandshakeException: java.net.SocketException: Software caused connection abort: recv failed
我正在使用生成的DefaultKeystore。由于动态出站端点页面不断给我
CWPKI0681E
错误,所以我应用了您的第一种方法

这对你有用吗?或者是因为我使用的是生成的默认CA


2006年11月更新:

我发现一些线索可能有助于解决这个问题。我尝试使用OpenSSL建立到服务器的客户端连接,这里有一些有趣的东西

首先,我使用我的客户端WAS连接到服务器端WAS,结果出现了这个异常,服务器刚刚断开了我的连接。以下是服务器端日志:

[2017/11/3   18:07:19:349 CST] 00000070 SystemOut     O WebContainer : 0, WRITE: TLSv1 Handshake, length = 2765
[2017/11/3   18:07:19:355 CST] 00000070 SystemOut     O WebContainer : 0, READ: TLSv1 Handshake, length = 77
[2017/11/3   18:07:19:355 CST] 00000070 SystemOut     O *** Certificate chain
[2017/11/3   18:07:19:355 CST] 00000070 SystemOut     O ***
[2017/11/3   18:07:19:357 CST] 00000070 SystemOut     O WebContainer : 0, fatal error: 40: null cert chain
javax.net.ssl.SSLHandshakeException: null cert chain
[2017/11/3   18:07:19:357 CST] 00000070 SystemOut     O %% Invalidated:      [Session-1, SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA]
[2017/11/3   18:07:19:357 CST] 00000070 SystemOut     O WebContainer : 0, SEND TLSv1 ALERT:  fatal, description = handshake_failure
[2017/11/3   18:07:19:358 CST] 00000070 SystemOut     O WebContainer : 0, WRITE: TLSv1 Alert, length = 2
[2017/11/3   18:07:19:358 CST] 00000070 SystemOut     O WebContainer : 0, fatal: engine already closed.  Rethrowing javax.net.ssl.SSLHandshakeException: null cert chain
现在,我尝试使用以下命令将服务器与OpenSSL连接,
ClientCA.key
是我的私钥:

openssl s_client -tls1 -connect 192.168.1.20:9443 -key ClientCA.key  -state

CONNECTED(00000168)
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
depth=1 C = US, O = IBM, OU = TestNode01, OU = TestNode01Cell, OU = Root    Certificate, CN = Test
verify error:num=19:self signed certificate in certificate chain
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:SSLv3/TLS read server key exchange
SSL_connect:SSLv3/TLS read server certificate request
SSL_connect:SSLv3/TLS read server done
SSL_connect:SSLv3/TLS write client certificate
SSL_connect:SSLv3/TLS write client key exchange
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished
SSL_connect:error in SSLv3/TLS write finished
write:errno=0
...
我被删除了,在日志的末尾也看到了同样的异常。但如果我用我的证书发出命令:

openssl s_client -tls1 -connect 192.168.1.20:9443 -cert ClientCA.crt -key ClientCA.pfx  -state

CONNECTED(00000150)
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
depth=1 C = US, O = IBM, OU = SAGE-AD2Node01, OU = SAGE-AD2Node01Cell, OU = Root Certificate, CN = SAGE-AD2
verify error:num=19:self signed certificate in certificate chain
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:SSLv3/TLS read server key exchange
SSL_connect:SSLv3/TLS read server certificate request
SSL_connect:SSLv3/TLS read server done
SSL_connect:SSLv3/TLS write client certificate
SSL_connect:SSLv3/TLS write client key exchange
SSL_connect:SSLv3/TLS write certificate verify
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS write finished
SSL_connect:SSLv3/TLS read change cipher spec
SSL_connect:SSLv3/TLS read finished
...
我已连接到服务器!和服务器日志看起来也不同:

[2017/11/6   16:19:55:246 CST] 00000073 SystemOut     O WebContainer : 0, WRITE: TLSv1 Handshake, length = 2765
[2017/11/6   16:19:55:309 CST] 00000073 SystemOut     O WebContainer : 0, READ: TLSv1 Handshake, length = 853
[2017/11/6   16:19:55:309 CST] 00000073 SystemOut     O *** Certificate chain
[2017/11/6   16:19:55:309 CST] 00000073 SystemOut     O chain [0] = [
[
  Version: V1
  ...

所以我怀疑我一定错过了客户端WAS的一些设置,所以它没有将我的证书发送到
P12
文件中的服务器。你能详细描述一下你是如何做到这一点的吗@Alaine@dbreaux

JSSE将处理获取客户端证书并在握手时将其发送到服务器。也就是说,只要通信的服务器端启用或支持客户端身份验证,并且客户端具有要发送的密钥。那么在服务器的SSL配置中是否启用了clientAuthentication或clientAuthenticationSupported?在控制台中,您将看到SSL配置面板中保护面板链接质量的设置。

JSSE将处理获取客户端证书并在握手时将其发送到服务器。也就是说,只要通信的服务器端启用或支持客户端身份验证,并且客户端具有要发送的密钥。那么在服务器的SSL配置中是否启用了clientAuthentication或clientAuthenticationSupported?在控制台中,您将看到SSL配置面板中保护质量面板链接的设置。

在WebSphere配置中,您似乎需要从密钥库中指定一个客户端证书,以便在进行出站连接时显示。(老实说,我不知道您是否可以编辑密钥库来设置其默认值。我看不到从管理控制台执行此操作的方法,但您可以从外部执行此操作。或者可能已经设置了密钥库,但这还不够。)

但是,可以在SSL配置中显式设置这一点。我相信所有这些级别都应该有效,但坦白说我还没有亲自尝试过

您可以在单元/节点默认SSL设置中进行设置:

或对于作用域,如单元、节点或服务器:

或者,您可以根据连接到的目的地进行设置:


在WebSphere配置中,似乎需要指定密钥库中的客户端证书,以便在进行出站连接时显示。(老实说,我不知道您是否可以编辑密钥库来设置其默认值。我看不到从管理控制台执行此操作的方法,但您可以从外部执行此操作。或者可能已经设置了密钥库,但这还不够。)

但是,可以在SSL配置中显式设置这一点。我相信所有这些级别都应该有效,但坦白说我还没有亲自尝试过

您可以在单元/节点默认SSL设置中进行设置:

或对于作用域,如单元、节点或服务器:

或者,您可以根据连接到的目的地进行设置:


客户端不发送密钥,它发送一个证书。您的权利它发送一个证书,但在发送到服务器之前,它必须是客户端上的一对证书的一部分。客户端不发送密钥,它发送一个证书。您的权利它发送一个证书,但在将密钥发送到服务器之前,它必须是客户端上的密钥对的一部分。如果您无法访问自己的密钥库,则无法成为正在进行身份验证的SSL对等方。什么安全漏洞?因为您必须访问它,所以您必须在程序(或文件)中的某个地方写下密钥库路径和密码。因此,我的雇主不喜欢WebSphere能够自动为您提供客户机证书,而您根本不必显式引用密钥库或私钥。这不起作用,或者你还没有试过吗?@dbreaux这部分是在你扮演服务器角色时使用的。但我需要做的是,当我是客户时,也就是当你是运行WAS的客户时。你有没有试过,但没用?在这种情况下,我开始回答,解释您可能必须指定要显示的客户端证书的位置。或者你还没有试过,因为你没想到会这样