On Wed, 28 Jan 2026 16:23:07 GMT, Sean Coffey <[email protected]> wrote:

>> The `javax.net.debug` TLS debug option is buggy since TLSv1.3 implementation 
>> was introduced many years ago.
>> 
>> Where "ssl" was previously a value to obtain all TLS debug traces (except 
>> network type dumps, verbose data), it now prints only a few lines for a 
>> standard client TLS connection. 
>> 
>> The property parsing was also lax and allowed users to declare verbose 
>> logging options by themselves where the documentation stated that such 
>> verbose options were only meant to be used in conjunction with other TLS 
>> options :
>> 
>> 
>>         System.err.println("help           print the help messages");
>>         System.err.println("expand         expand debugging information");
>>         System.err.println();
>>         System.err.println("all            turn on all debugging");
>>         System.err.println("ssl            turn on ssl debugging");
>>         System.err.println();
>>         System.err.println("The following can be used with ssl:");
>>         System.err.println("\trecord       enable per-record tracing");
>>         System.err.println("\thandshake    print each handshake message");
>>         System.err.println("\tkeygen       print key generation data");
>>         System.err.println("\tsession      print session activity");
>>         System.err.println("\tdefaultctx   print default SSL 
>> initialization");
>>         System.err.println("\tsslctx       print SSLContext tracing");
>>         System.err.println("\tsessioncache print session cache tracing");
>>         System.err.println("\tkeymanager   print key manager tracing");
>>         System.err.println("\ttrustmanager print trust manager tracing");
>>         System.err.println("\tpluggability print pluggability tracing");
>>         System.err.println();
>>         System.err.println("\thandshake debugging can be widened with:");
>>         System.err.println("\tdata         hex dump of each handshake 
>> message");
>>         System.err.println("\tverbose      verbose handshake message 
>> printing");
>>         System.err.println();
>>         System.err.println("\trecord debugging can be widened with:");
>>         System.err.println("\tplaintext    hex dump of record plaintext");
>>         System.err.println("\tpacket       print raw SSL/TLS packets");
>> 
>> 
>> as part of this patch, I've also moved the log call to the more performant 
>> friendly 
>> `System.Logger#log(java.lang.System.Logger.Level,java.util.function.Supplier)`
>>  method. 
>> 
>> the output has changed slightly with respect to that  - less verbose
>> 
>> e.g. old...
>
> Sean Coffey has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Review comments from Brad

As discussed, I've been looking mainly at the conversion in the call sites.  
We'll address the `Levels` and `SSLLogger.Opt.*` categories issues later.

- [JDK-8344158](https://bugs.openjdk.org/browse/JDK-8344158) category 
consistency, and
- [JDK-8338702](https://bugs.openjdk.org/browse/JDK-8338702) System.Logger 
doesn't output most JSSE debug messages

One mismerge, I think.  Please check carefully.

Just have the `DebugPropertyValuesTest.java` to review, otherwise, looks pretty 
good.

src/java.base/share/classes/sun/security/ssl/CertificateMessage.java line 1026:

> 1024:                             ka, hc.negotiatedProtocol) != null
> 1025:                             || 
> SSLLogger.logWarning(SSLLogger.Opt.HANDSHAKE,
> 1026:                                     "Unable to produce 
> CertificateVerify for key algorithm: " + ka))

Nitty nit nit:  might as well take care of the <80 here too.  Esp line1021.  ;) 
   

Had to vertically scroll just to see the line in side-by-side.  Thanks!

There were a few others where things got a bit long (e.g. 
`SessionTicketExtension`, `SSLCipher`), and noticed a couple really egregious 
existing ones.  I'll probably take care of them when I get to the category bug.

(P.S.  Thank you for doing that in `CertificateRequest.java`!)

src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java line 847:

> 845:                 if (fragmentData.remaining() < 32) {
> 846:                     if (SSLLogger.isOn() &&
> 847:                             SSLLogger.isOn(SSLLogger.Opt.RECORD)) {

I think this looks right.

The consistency followup will look at this closer.  There's several things I 
think may need changing.

src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java line 1648:

> 1646:             for (RecordFragment fragment : bufferedFragments) {
> 1647:                 if (fragment.contentType == 
> ContentType.CHANGE_CIPHER_SPEC.id) {
> 1648:                     if (hasFin) {

This appears to be another merge issue from a recent changeset (October).  
8367059 removed the `if (hasFin)` check.  

Please check this one closely.  Here's the changeset ID.
436dc687ba2ead1662a4e0125cea0966fac825e5

src/java.base/share/classes/sun/security/ssl/SSLLogger.java line 212:

> 210:         System.err.println();
> 211:         System.err.println("The following filters can be used with 
> ssl:");
> 212:         System.err.printf("    %-14s %s%n", "defaultctx",

Minor nit for visibility:  

Add an extra blank line between 211/212.    Between `can be used with ssl:` and 
`defaultctx...`

src/java.base/share/classes/sun/security/ssl/SSLLogger.java line 236:

> 234:         System.err.printf("    %-14s %s%n", "trustmanager",
> 235:                 "print trust manager tracing");
> 236:         System.err.printf("%nIf \"ssl\" is specified by itself," +

There's now an extra `%n` on this line.  Maybe move to the new last line?

src/java.base/share/classes/sun/security/ssl/SSLLogger.java line 239:

> 237:                 " all non-widening filters are enabled.%n%n");
> 238:         System.err.printf("%nAdding valid filter options to \"ssl\" will 
> log" +
> 239:                 " messages to include%njust those filtered 
> categories.%n");

So the intended behavior is the following:  

If we have code like this:

> if (SSLLogger.isOn() && SSLLogger.isOn(SSLLogger.Opt.SSL)) {

then setting `javax.net.debug=ssl` or `ssl,trustmanager`, it will always output 
this logging statement.  

But if we have code like this:

> if (SSLLogger.isOn() && SSLLogger.isOn(SSLLogger.Opt.TRUSTMANAGER)) {

then `javax.net.debug=ssl` will output this (because only `ssl` was enabled), 
but `javax.net.debug=ssl,keymanager` will not.  That's because `keymanager` is 
a valid name, thus only the `SSL` and `KEYMANAGER` options will print).  

So we need to make sure that everything `SSL` and non-`SSL` is categorized 
correctly, which will be the focus of 
[JDK-8344158](https://bugs.openjdk.org/browse/JDK-8344158).

The wording here needs a slight update, and I'm not quite sure how to word 
this.  Ideas?  :) 

    Adding valid filter options to ssl will output the high-level SSL/TLS debug 
    messages, plus only those messages in the specified categories.

test/jdk/sun/security/ssl/SSLEngineImpl/SSLEngineKeyLimit.java line 114:

> 112:                     " -Dtest.src=" + System.getProperty("test.src") +
> 113:                             " -Dtest.jdk=" + 
> System.getProperty("test.jdk") +
> 114:                             " -Djavax.net.debug=ssl" +

I'm assuming that changing from `ssl,handshake` to just `ssl` is ok?  I didn't 
actually check.  I notice this in several tests.

-------------

PR Review: https://git.openjdk.org/jdk/pull/18764#pullrequestreview-3719123589
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2748407425
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2748433796
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2748449980
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2747982555
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2738705046
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2738583278
PR Review Comment: https://git.openjdk.org/jdk/pull/18764#discussion_r2748660217

Reply via email to