Java 11:获取 "Empty [client] certificate chain" 而不是 "Empty [server] certificate chain"
Java 11: Getting an "Empty [client] certificate chain" instead of an "Empty [server] certificate chain"
我正在尝试调试一些 Java11 测试代码,该代码使用 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 会抛出“空 [服务器] 证书链”消息,但实际上是“空 [客户端] 证书链”。这个测试来自一个完全工作的 Java 8 版本,据我所知,正在创建的证书是正确的,并且与 Java 8 对应的证书相同。
我只是不确定从哪里开始调试,以及什么可能导致预期输出发生如此微小的变化。感谢您的帮助!
经过几天的研究和深入研究 OpenJDK 11,我意识到我期望“空服务器证书链”的测试用例是不正确的。
在Java11中,TLS或SSL协议支持TLSv1.2和TLSv1.3。测试用例主要基于以下伪代码来决定预期的消息是什么:
if(protocolUsed == "TLSv1.3")
expectedMessage = "Empty client certificate chain";
else
expectedMessage = "Empty server certificate chain";
但是在 Java8(这是该测试的起源地)中,SSL 和 TLS 仅支持最高 TLSv1.2。这意味着实际的握手是在 TLSv1.3 中完成的,但是 if 块中使用的协议仍然显示为 SSL 或 TLS。所以 TLSv1.3 工作已经完成,但 if 块从未正确更新以解决它。我通过调试输出验证了所有这些。
我正在尝试调试一些 Java11 测试代码,该代码使用 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 会抛出“空 [服务器] 证书链”消息,但实际上是“空 [客户端] 证书链”。这个测试来自一个完全工作的 Java 8 版本,据我所知,正在创建的证书是正确的,并且与 Java 8 对应的证书相同。
我只是不确定从哪里开始调试,以及什么可能导致预期输出发生如此微小的变化。感谢您的帮助!
经过几天的研究和深入研究 OpenJDK 11,我意识到我期望“空服务器证书链”的测试用例是不正确的。
在Java11中,TLS或SSL协议支持TLSv1.2和TLSv1.3。测试用例主要基于以下伪代码来决定预期的消息是什么:
if(protocolUsed == "TLSv1.3")
expectedMessage = "Empty client certificate chain";
else
expectedMessage = "Empty server certificate chain";
但是在 Java8(这是该测试的起源地)中,SSL 和 TLS 仅支持最高 TLSv1.2。这意味着实际的握手是在 TLSv1.3 中完成的,但是 if 块中使用的协议仍然显示为 SSL 或 TLS。所以 TLSv1.3 工作已经完成,但 if 块从未正确更新以解决它。我通过调试输出验证了所有这些。