Code Review Request, JDK-8207009 SSLEngine#closeInbound mentions SSLException when no close_notify is received

Bradford Wetmore bradford.wetmore at oracle.com
Mon Aug 13 23:43:29 UTC 2018


Hi Xuelei,

 > Let's use two to emphasize the behaviors:
 > 1. both input and output streams should be closed in each side, and
 > 2. both client and server should perform #1.

SSLEngine.java
--------------
159:  Both sides (i.e. the peer) may not be a SSLEngine:

both the client and server applications should close the {@code 
SSLEngine} by calling {@link SSLEngine#closeInbound} and {@link 
SSLEngine#closeOutbound} and should send/receive any...
->
the application should close the {@code SSLEngine} by calling {@link 
SSLEngine#closeInbound} and {@link SSLEngine#closeOutbound} and should 
send/receive any...


SSLSocket.java
--------------
With all of the ways to close, trying to say anything here is going to 
get really ugly really fast.  SSLSocket.close(), InputStream.close() & 
OutputStream.close, and now Socket.shutdownInput() & 
Socket.shutdownOutput().  Even shutdownInput()/shutdownOutput() still 
throw UnsupportedOperationExceptions in JDK 10 all the way back to 1.4.

Can we just leave it at SSLSocket.close() and skip the 
Input/OutputStream.close() and shutdownInput/Output?  Or something like:

@apiNote
The TLS standard has evolved over the years, especially when it comes to 
closing Sockets and streams.  The most straightforward way to close a 
connection is for an application to call SSLSocket.close().  Some 
versions of the standard allow for independently closing the input or 
output sides of a connection, but may throw Exceptions if certain 
conditions aren't met.  If such a connection state is desired, the 
output stream should generally be closed before the input stream.

Once an {@code SSLSocket} is closed, it is not reusable: a new
{@code SSLSocket} must be created.

Brad




On 8/13/2018 11:50 AM, Xue-Lei Fan wrote:
> Hi Jamil,
> 
> Thanks for review.  One more step close to the integration.
> 
> On 8/13/2018 11:45 AM, Jamil Nimeh wrote:
>> Hi Xuelei,
>>
>>   * SSLSocket.java
>>       o 134: Nit - You can remove the first "both" in this sentence
>>         since you use it later with the input/output stream closure.
>>
> Let's use two to emphasize the behaviors:
> 1. both input and output streams should be closed in each side, and
> 2. both client and server should perform #1.
> 
> Thanks,
> Xuelei
> 
>> Looks good to me otherwise.
>>
>> --Jamil
>>
>> On 8/13/2018 11:31 AM, Xue-Lei Fan wrote:
>>> One more update:
>>> http://cr.openjdk.java.net/~xuelei/8207009/webrev.05/
>>>
>>> It is desired to make a note in SSLSocket and SSLEngine 
>>> specification, so that users have a good sense that an application 
>>> should close the input and output stream always.
>>>
>>> Updated for SSLEngine.java and SSLSocket.java only.  No changes in 
>>> other files.
>>>
>>> Please let me know your concerns by the end of today.
>>>
>>> Thanks,
>>> Xuelei
>>>
>>> On 8/10/2018 4:02 PM, Jamil Nimeh wrote:
>>>> I'm good with the changes.
>>>>
>>>> --Jamil
>>>>
>>>> On 8/7/2018 5:24 PM, Xuelei Fan wrote:
>>>>> Hi Jamil,
>>>>>
>>>>> Thanks for comments.  Here is the updated webrev:
>>>>> http://cr.openjdk.java.net/~xuelei/8207009/webrev.04/
>>>>>
>>>>> Thanks,
>>>>> Xuelei
>>>>>
>>>>> On 8/7/2018 3:12 PM, Jamil Nimeh wrote:
>>>>>> Hi Xuelei, mostly small stuff:
>>>>>>
>>>>>>   * SSLEngineImpl.java
>>>>>>       o 717: Nit, inbout --> inbound
>>>>>>   * SSLEngineOutputRecord.java
>>>>>>       o 162, 169: Nit, applicatoin --> application
>>>>>>       o Same section: It looks like the "if" and "else if" clauses 
>>>>>> take
>>>>>>         the same actions with the same message.  Maybe just do "if
>>>>>>         (isClosed())" ?  Or were you planning to have different 
>>>>>> messages
>>>>>>         here?
>>>>>>   * SSLSocketOutputRecord.java
>>>>>>       o 58, 97, 204: Typo,  closedd --> closed
>>>>>>   * TLSEngineClosureTest.java
>>>>>>       o 2: Copyright date fix
>>>>>>       o 26: If this is a new test should the bug ID be different than
>>>>>>         8085979?
>>>>>>
>>>>>> --Jamil
>>>>>>
>>>>>>
>>>>>> On 08/07/2018 07:46 AM, Xuelei Fan wrote:
>>>>>>> New webrev:
>>>>>>> http://cr.openjdk.java.net/~xuelei/8207009/webrev.03/
>>>>>>>
>>>>>>> Thanks for a find of Tim Brooks, that the SSLEngine 
>>>>>>> inbound/outbound status is incorrect if closing during handshake. 
>>>>>>> The above webrev is trying to fix the problems. See more in the 
>>>>>>> OpenJDK thread:
>>>>>>> http://mail.openjdk.java.net/pipermail/security-dev/2018-August/017778.html 
>>>>>>>
>>>>>>>
>>>>>>> Please let me know your concerns before this Wednesday.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Xuelei
>>>>>>>
>>>>>>> On 8/3/2018 1:55 PM, Xuelei Fan wrote:
>>>>>>>> Update: http://cr.openjdk.java.net/~xuelei/8207009/webrev.02/
>>>>>>>>
>>>>>>>> In webrev.01, the socket close may be blocked by super class 
>>>>>>>> close synchronization.  Updated the SSLSocketImpl.java to use 
>>>>>>>> handshake only lock in the startHandshake() implementation.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Xuelei
>>>>>>>>
>>>>>>>> On 8/1/2018 7:27 PM, Xuelei Fan wrote:
>>>>>>>>> Update: http://cr.openjdk.java.net/~xuelei/8207009/webrev.01/
>>>>>>>>>
>>>>>>>>> Integrated the fix for JDK-8208642, "Server initiated TLSv1.2 
>>>>>>>>> renegotiation fails if Java client allows TLSv1.3". 
>>>>>>>>> SSLHandshake.java is updated to use negotiated version so that 
>>>>>>>>> TLS 1.2 HelloRequest is acceptable in TLS 1.3 client side.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Xuelei
>>>>>>>>>
>>>>>>>>> On 7/30/2018 10:24 AM, Xuelei Fan wrote:
>>>>>>>>>> <loop in net-dev as well>
>>>>>>>>>> Please let me know your concerns by the end of August 1st, 2018.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Xuelei
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 7/30/2018 9:59 AM, Xuelei Fan wrote:
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> Please review the update for the TLS 1.3 half-close and 
>>>>>>>>>>> synchronization implementation:
>>>>>>>>>>> http://cr.openjdk.java.net/~xuelei/8207009/webrev.00/
>>>>>>>>>>>
>>>>>>>>>>> Unlike TLS 1.2 and prior versions, for TLS 1.3, the 
>>>>>>>>>>> close_notify is use to close the local write side and peer 
>>>>>>>>>>> read side only. After the close_notify get handles, the local 
>>>>>>>>>>> read side and peer write side may still be open.
>>>>>>>>>>>
>>>>>>>>>>> In this update, if an application calls 
>>>>>>>>>>> SSLEngine.closeInbound/Outbound() or 
>>>>>>>>>>> SSLSocket.shutdownInput/Output(), half-close will be used. 
>>>>>>>>>>> For compatibility, if SSLSocket.close() get called, a duplex 
>>>>>>>>>>> close will be tried.  In order to support duplex close, JDK 
>>>>>>>>>>> will use the user_canceled warning alert even the handshake 
>>>>>>>>>>> complete.
>>>>>>>>>>>
>>>>>>>>>>> In practice, an application may only close outbound even it 
>>>>>>>>>>> is intended to close the inbound as well, or close the 
>>>>>>>>>>> connection completely.  It works for TLS 1.2 and prior 
>>>>>>>>>>> versions.  But no more for TLS 1.3 because of the 
>>>>>>>>>>> close_notify behavior change in the TLS 1.3 specification.  
>>>>>>>>>>> The application may be hung and dead-waiting for read/close.  
>>>>>>>>>>> It could be solved by closing the inbound explicitly. In 
>>>>>>>>>>> order to mitigate the impact, a new System Property is 
>>>>>>>>>>> introduced, "jdk.tls.acknowledgeCloseNotify" if source code 
>>>>>>>>>>> update is not available.   If the System Property is set to 
>>>>>>>>>>> "true", if receiving the close_notify, a close_notify alert 
>>>>>>>>>>> will be responded.  It is a countermeasure of the TLS 1.3 
>>>>>>>>>>> half-close issues.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Xuelei
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>
>>>>
>>



More information about the security-dev mailing list