2323import java .security .SecureRandom ;
2424import java .util .Arrays ;
2525import java .util .Collections ;
26+ import java .util .List ;
2627import java .util .function .Supplier ;
2728
2829public class SSLDriverTests extends ESTestCase {
@@ -96,7 +97,7 @@ public void testRenegotiate() throws Exception {
9697 normalClose (clientDriver , serverDriver );
9798 }
9899
99- public void testBigAppData () throws Exception {
100+ public void testBigApplicationData () throws Exception {
100101 SSLContext sslContext = getSSLContext ();
101102
102103 SSLDriver clientDriver = getDriver (sslContext .createSSLEngine (), true );
@@ -124,8 +125,6 @@ public void testBigAppData() throws Exception {
124125 }
125126
126127 public void testHandshakeFailureBecauseProtocolMismatch () throws Exception {
127- // See https://github.com/elastic/elasticsearch/issues/33751
128- assumeTrue ("test fails on JDK 11 >= ea28 currently" , JavaVersion .current ().compareTo (JavaVersion .parse ("11" )) < 0 );
129128 SSLContext sslContext = getSSLContext ();
130129 SSLEngine clientEngine = sslContext .createSSLEngine ();
131130 SSLEngine serverEngine = sslContext .createSSLEngine ();
@@ -138,7 +137,7 @@ public void testHandshakeFailureBecauseProtocolMismatch() throws Exception {
138137
139138 SSLException sslException = expectThrows (SSLException .class , () -> handshake (clientDriver , serverDriver ));
140139 String oldExpected = "Client requested protocol TLSv1.1 not enabled or not supported" ;
141- String jdk11Expected = "Received fatal alert: protocol_version " ;
140+ String jdk11Expected = "The client supported protocol versions [TLSv1.1] are not accepted by server preferences [TLS12] " ;
142141 boolean expectedMessage = oldExpected .equals (sslException .getMessage ()) || jdk11Expected .equals (sslException .getMessage ());
143142 assertTrue ("Unexpected exception message: " + sslException .getMessage (), expectedMessage );
144143
@@ -148,7 +147,8 @@ public void testHandshakeFailureBecauseProtocolMismatch() throws Exception {
148147 }
149148 // Prior to JDK11 we still need to send a close alert
150149 if (serverDriver .isClosed () == false ) {
151- failedCloseAlert (serverDriver , clientDriver );
150+ failedCloseAlert (serverDriver , clientDriver , Arrays .asList ("Received fatal alert: protocol_version" ,
151+ "Received fatal alert: handshake_failure" ));
152152 }
153153 }
154154
@@ -172,12 +172,14 @@ public void testHandshakeFailureBecauseNoCiphers() throws Exception {
172172 }
173173 // Prior to JDK11 we still need to send a close alert
174174 if (serverDriver .isClosed () == false ) {
175- failedCloseAlert (serverDriver , clientDriver );
175+ List <String > messages = Arrays .asList ("Received fatal alert: handshake_failure" ,
176+ "Received close_notify during handshake" );
177+ failedCloseAlert (serverDriver , clientDriver , messages );
176178 }
177179 }
178180
179- @ AwaitsFix ( bugUrl = "https://github.com/elastic/elasticsearch/issues/32144" )
180- public void testCloseDuringHandshake () throws Exception {
181+ public void testCloseDuringHandshakeJDK11 () throws Exception {
182+ assumeTrue ( "this tests ssl engine for JDK11" , JavaVersion . current (). compareTo ( JavaVersion . parse ( "11" )) >= 0 );
181183 SSLContext sslContext = getSSLContext ();
182184 SSLDriver clientDriver = getDriver (sslContext .createSSLEngine (), true );
183185 SSLDriver serverDriver = getDriver (sslContext .createSSLEngine (), false );
@@ -199,30 +201,66 @@ public void testCloseDuringHandshake() throws Exception {
199201 serverDriver .initiateClose ();
200202 assertTrue (serverDriver .needsNonApplicationWrite ());
201203 assertFalse (serverDriver .isClosed ());
202- sendNeededWrites (serverDriver , clientDriver );
204+ sendNonApplicationWrites (serverDriver , clientDriver );
203205 // We are immediately fully closed due to SSLEngine inconsistency
204206 assertTrue (serverDriver .isClosed ());
205207 // This should not throw exception yet as the SSLEngine will not UNWRAP data while attempting to WRAP
206208 clientDriver .read (clientBuffer );
207- sendNeededWrites (clientDriver , serverDriver );
209+ sendNonApplicationWrites (clientDriver , serverDriver );
210+ clientDriver .read (clientBuffer );
211+ sendNonApplicationWrites (clientDriver , serverDriver );
212+ serverDriver .read (serverBuffer );
213+ assertTrue (clientDriver .isClosed ());
214+ }
215+
216+ public void testCloseDuringHandshakePreJDK11 () throws Exception {
217+ assumeTrue ("this tests ssl engine for pre-JDK11" , JavaVersion .current ().compareTo (JavaVersion .parse ("11" )) < 0 );
218+ SSLContext sslContext = getSSLContext ();
219+ SSLDriver clientDriver = getDriver (sslContext .createSSLEngine (), true );
220+ SSLDriver serverDriver = getDriver (sslContext .createSSLEngine (), false );
221+
222+ clientDriver .init ();
223+ serverDriver .init ();
224+
225+ assertTrue (clientDriver .needsNonApplicationWrite ());
226+ assertFalse (serverDriver .needsNonApplicationWrite ());
227+ sendHandshakeMessages (clientDriver , serverDriver );
228+ sendHandshakeMessages (serverDriver , clientDriver );
229+
230+ sendData (clientDriver , serverDriver );
231+
232+ assertTrue (clientDriver .isHandshaking ());
233+ assertTrue (serverDriver .isHandshaking ());
234+
235+ assertFalse (serverDriver .needsNonApplicationWrite ());
236+ serverDriver .initiateClose ();
237+ assertTrue (serverDriver .needsNonApplicationWrite ());
238+ assertFalse (serverDriver .isClosed ());
239+ sendNonApplicationWrites (serverDriver , clientDriver );
240+ // We are immediately fully closed due to SSLEngine inconsistency
241+ assertTrue (serverDriver .isClosed ());
242+ // This should not throw exception yet as the SSLEngine will not UNWRAP data while attempting to WRAP
243+ clientDriver .read (clientBuffer );
244+ sendNonApplicationWrites (clientDriver , serverDriver );
208245 SSLException sslException = expectThrows (SSLException .class , () -> clientDriver .read (clientBuffer ));
209246 assertEquals ("Received close_notify during handshake" , sslException .getMessage ());
210247 assertTrue (clientDriver .needsNonApplicationWrite ());
211- sendNeededWrites (clientDriver , serverDriver );
248+ sendNonApplicationWrites (clientDriver , serverDriver );
212249 serverDriver .read (serverBuffer );
213250 assertTrue (clientDriver .isClosed ());
214251 }
215252
216- private void failedCloseAlert (SSLDriver sendDriver , SSLDriver receiveDriver ) throws SSLException {
253+ private void failedCloseAlert (SSLDriver sendDriver , SSLDriver receiveDriver , List < String > messages ) throws SSLException {
217254 assertTrue (sendDriver .needsNonApplicationWrite ());
218255 assertFalse (sendDriver .isClosed ());
219256
220- sendNeededWrites (sendDriver , receiveDriver );
257+ sendNonApplicationWrites (sendDriver , receiveDriver );
221258 assertTrue (sendDriver .isClosed ());
222259 sendDriver .close ();
223260
224261 SSLException sslException = expectThrows (SSLException .class , () -> receiveDriver .read (genericBuffer ));
225- assertEquals ("Received fatal alert: handshake_failure" , sslException .getMessage ());
262+ assertTrue ("Expected one of the following exception messages: " + messages + ". Found: " + sslException .getMessage (),
263+ messages .stream ().anyMatch (m -> sslException .getMessage ().equals (m )));
226264 if (receiveDriver .needsNonApplicationWrite () == false ) {
227265 assertTrue (receiveDriver .isClosed ());
228266 receiveDriver .close ();
@@ -249,15 +287,15 @@ private void normalClose(SSLDriver sendDriver, SSLDriver receiveDriver) throws I
249287 sendDriver .initiateClose ();
250288 assertFalse (sendDriver .readyForApplicationWrites ());
251289 assertTrue (sendDriver .needsNonApplicationWrite ());
252- sendNeededWrites (sendDriver , receiveDriver );
290+ sendNonApplicationWrites (sendDriver , receiveDriver );
253291 assertFalse (sendDriver .isClosed ());
254292
255293 receiveDriver .read (genericBuffer );
256294 assertFalse (receiveDriver .isClosed ());
257295
258296 assertFalse (receiveDriver .readyForApplicationWrites ());
259297 assertTrue (receiveDriver .needsNonApplicationWrite ());
260- sendNeededWrites (receiveDriver , sendDriver );
298+ sendNonApplicationWrites (receiveDriver , sendDriver );
261299 assertTrue (receiveDriver .isClosed ());
262300
263301 sendDriver .read (genericBuffer );
@@ -267,7 +305,7 @@ private void normalClose(SSLDriver sendDriver, SSLDriver receiveDriver) throws I
267305 receiveDriver .close ();
268306 }
269307
270- private void sendNeededWrites (SSLDriver sendDriver , SSLDriver receiveDriver ) throws SSLException {
308+ private void sendNonApplicationWrites (SSLDriver sendDriver , SSLDriver receiveDriver ) throws SSLException {
271309 while (sendDriver .needsNonApplicationWrite () || sendDriver .hasFlushPending ()) {
272310 if (sendDriver .hasFlushPending () == false ) {
273311 sendDriver .nonApplicationWrite ();
@@ -315,7 +353,6 @@ private void sendHandshakeMessages(SSLDriver sendDriver, SSLDriver receiveDriver
315353 assertTrue (sendDriver .needsNonApplicationWrite () || sendDriver .hasFlushPending ());
316354
317355 while (sendDriver .needsNonApplicationWrite () || sendDriver .hasFlushPending ()) {
318- assertFalse (receiveDriver .needsNonApplicationWrite ());
319356 if (sendDriver .hasFlushPending () == false ) {
320357 sendDriver .nonApplicationWrite ();
321358 }
0 commit comments