我正在嘗試除錯一些 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 對應的證書相同。
我只是不確定從哪里開始除錯以及可能導致預期輸出發生這種非常小的變化的原因。任何幫助表示贊賞!
uj5u.com熱心網友回復:
經過幾天的研究和深入研究 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 塊從未正確更新以解決它。我通過除錯輸出驗證了所有這些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/366318.html
