有没有一种方法可以在不直接访问Java中的Websphere密钥库的情况下实现相互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代码) 有人能教我如何在不直接访问密钥库的情况下执行此操作吗有没有一种方法可以在不直接访问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客户端必须直接
更新: 你好,德布雷奥 我试着用你的方法做一个环回连接,但它似乎不起作用 下面是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@dbreauxJSSE将处理获取客户端证书并在握手时将其发送到服务器。也就是说,只要通信的服务器端启用或支持客户端身份验证,并且客户端具有要发送的密钥。那么在服务器的SSL配置中是否启用了clientAuthentication或clientAuthenticationSupported?在控制台中,您将看到SSL配置面板中保护面板链接质量的设置。JSSE将处理获取客户端证书并在握手时将其发送到服务器。也就是说,只要通信的服务器端启用或支持客户端身份验证,并且客户端具有要发送的密钥。那么在服务器的SSL配置中是否启用了clientAuthentication或clientAuthenticationSupported?在控制台中,您将看到SSL配置面板中保护质量面板链接的设置。在WebSphere配置中,您似乎需要从密钥库中指定一个客户端证书,以便在进行出站连接时显示。(老实说,我不知道您是否可以编辑密钥库来设置其默认值。我看不到从管理控制台执行此操作的方法,但您可以从外部执行此操作。或者可能已经设置了密钥库,但这还不够。)
但是,可以在SSL配置中显式设置这一点。我相信所有这些级别都应该有效,但坦白说我还没有亲自尝试过
您可以在单元/节点默认SSL设置中进行设置:
或对于作用域,如单元、节点或服务器:
或者,您可以根据连接到的目的地进行设置:
在WebSphere配置中,似乎需要指定密钥库中的客户端证书,以便在进行出站连接时显示。(老实说,我不知道您是否可以编辑密钥库来设置其默认值。我看不到从管理控制台执行此操作的方法,但您可以从外部执行此操作。或者可能已经设置了密钥库,但这还不够。) 但是,可以在SSL配置中显式设置这一点。我相信所有这些级别都应该有效,但坦白说我还没有亲自尝试过 您可以在单元/节点默认SSL设置中进行设置: 或对于作用域,如单元、节点或服务器: 或者,您可以根据连接到的目的地进行设置:
客户端不发送密钥,它发送一个证书。您的权利它发送一个证书,但在发送到服务器之前,它必须是客户端上的一对证书的一部分。客户端不发送密钥,它发送一个证书。您的权利它发送一个证书,但在将密钥发送到服务器之前,它必须是客户端上的密钥对的一部分。如果您无法访问自己的密钥库,则无法成为正在进行身份验证的SSL对等方。什么安全漏洞?因为您必须访问它,所以您必须在程序(或文件)中的某个地方写下密钥库路径和密码。因此,我的雇主不喜欢WebSphere能够自动为您提供客户机证书,而您根本不必显式引用密钥库或私钥。这不起作用,或者你还没有试过吗?@dbreaux这部分是在你扮演服务器角色时使用的。但我需要做的是,当我是客户时,也就是当你是运行WAS的客户时。你有没有试过,但没用?在这种情况下,我开始回答,解释您可能必须指定要显示的客户端证书的位置。或者你还没有试过,因为你没想到会这样