Java 11:获取“空 [客户端] 证书链”而不是“空 [服务器] 证书链”
Posted
技术标签:
【中文标题】Java 11:获取“空 [客户端] 证书链”而不是“空 [服务器] 证书链”【英文标题】:Java 11: Getting an "Empty [client] certificate chain" instead of an "Empty [server] certificate chain" 【发布时间】:2021-12-27 14:47:53 【问题描述】:我正在尝试调试一些 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 抛出“空 [服务器] 证书链”消息,但它是“空 [客户端] 证书链”。该测试来自一个完整的 Java 8 版本,据我所知,所创建的证书是正确的,并且与它们的 Java 8 对应物相同。
我只是不确定从哪里开始调试以及可能导致预期输出发生这种非常小的变化的原因。任何帮助表示赞赏!
【问题讨论】:
【参考方案1】:在对 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(此测试的来源)中,SSL 和 TLS 仅支持最高 TLSv1.2。这意味着实际的握手是在 TLSv1.3 中完成的,但在该 if 块中使用的协议仍显示为 SSL 或 TLS。所以 TLSv1.3 的工作已经完成,但 if 块从未正确更新以解决它。我通过调试输出验证了所有这些。
【讨论】:
8u261 up 支持 TLS1.3(从 11 向后移植)。将字符串与 Java 中的==
进行比较是不可靠的,并且通常是错误的,除非它们都是文字或以其他方式进行的;这上面有数百个问题。以上是关于Java 11:获取“空 [客户端] 证书链”而不是“空 [服务器] 证书链”的主要内容,如果未能解决你的问题,请参考以下文章
从 List<Student> 中获取具有匹配名称的学生对象而不进行迭代(Java)
java:从另一个类获取私有变量,而不设置getter [重复]
仅在 QA 环境中而不是在本地获取“java.lang.NoClassDefFoundError:无法初始化类”?
获取Java中arrayList中重复值的计数而不影响arrayList的顺序[重复]
获取 `UIRefreshControl` 到 `UITableViewController` 内容上方的北边,而不是在标题下?