我正在尝试调试一些Java 11测试代码,该代码使用SSLServerSocket作为服务器,使用SSLSocket作为回复。基本代码如下:
server.setNeedClientAuth(false);
need_Client_Auth = server.getNeedClientAuth();
assertFalse("Unexpected need client authority returned", need_Client_Auth);
server.setNeedClientAuth(true);
need_Client_Auth = server.getNeedClientAuth();
assertTrue("Unexpected need client authority returned", need_Client_Auth);
SSLClient sClient = new SSLClient(client, addr, SSLClient.START_HANDSHAKE);
sClient.start();
SSLSocket reply = (SSLSocket) (server.accept());
reply.startHandshake(); //this throws an SSLException
这里的想法是只使用needClientAuth/wantClientAuth,并在没有获得正确的客户端身份验证的情况下测试startHandshake的输出。
该测试期望SSLException抛出一个消息"0";空的[服务器]证书链";但取而代之的是";空[客户端]证书链";。这个测试来自一个完全工作的Java 8构建,据我所知,所创建的证书是正确的,并且与Java 8的对应证书相同。
我只是不确定从哪里开始调试,以及是什么原因导致了预期输出的微小变化。感谢您的帮助!
经过几天的研究和深入研究OpenJDK 11,我意识到我的测试用例期望;空服务器证书链";不正确。
在Java 11中,TLS或SSL协议支持TLSv1.2和TLSv1.3。测试用例主要基于以下伪代码来决定预期消息是什么:
if(protocolUsed == "TLSv1.3")
expectedMessage = "Empty client certificate chain";
else
expectedMessage = "Empty server certificate chain";
然而,在Java 8中(该测试就是从Java 8开始的(,SSL和TLS最多只支持TLSv1.2。这意味着实际的握手是在TLSv1.3中完成的,但if块中使用的协议仍然显示为SSL或TLS。所以TLSv1.3的工作正在进行中,但if块从未正确更新。我通过调试输出验证了所有这些。