I guess you didn't need to have me as reviewer before going final with
the CCC?

The CCC has been finalized. ;-) I though you have done with spec review.
  Anyway, we still can make updates on specification within new bugs.

That's fine, I just wasn't sure if you needed someone to "approve" the "final" version of the spec to move it to the next state.

Just a comment:

459/468:  Currently you have serverNames and sniMatchers as package
private variables, so the ClientHandshaker/ServerHandshaker *could*
inherit these variables rather than have a separate get methods.  Or you
could make them private and keep the get calls.

Good catch!

I can look at your latest if you like, but probably not necessary.

I'm just not seeing why this implies that it requires *EVERY* name must
match.  This just says we can do one of two things upon receipt of an
unrecognized hostname:  continue on, or alert/close.  We can be very
restrictive (ALL/AND) or less so (at least one/OR), and still be within
the RFC, I think.

I agree with your parser.

In our spec, it is required that once a SNIMatcher is defined, it
will be used to recognized the server name in the SNI extension.

Where?  We do say in SNIMatcher:

    Servers can use Server Name Indication (SNI) information to decide if
    specific {@link SSLSocket} or {@link SSLEngine} instances should
    accept a connection.

But I don't think we have ever said that it MUST match or must match all
or even what the implementation must do if there is a match failure. Nor
should we specify that in the API, IMHO.  That's implementation behavior.

I may have different options on this point. I think, it must be a
specified behavior in Java. Otherwise, it is very confusing about how to
use 1+ server names in server side.

I am going suggest we ask for guidance from IETF about this. It is not clear from RFC 6066 how to handle multiple SNI types, even reading very generously between the lines. See below.

Let's start from the logic of the design.  If the specification is not
clear, I will rewrite the spec according to our agreement.

Let's start from the requirement. I think once a SNIMatcher is defined
in SSL parameters, it MUST be used to perform the match operations if
the corresponding server name appears in the SNI extension.  Otherwise,
what will happens? See the example:
    1. SNI extension contains HostName, "www.example.com".
    2. Server side defines SNIMatcher for HostName, to accept
"www.example.org". Server does not accept "www.example.com".
    3. What's the result of the handshake? Is the SNI extension is accetable?

www.example.org != www.example.com. I would say fail handshake with unknown_hostname.

If we do not define the spec about how to use SNIMatcher. The answer to
#3 is unclear.  Because if a SNIMatcher may be used to perform match
operation, and may be not used to perform match operation, then the
server may accept the SNI extension, may ignore the SNI extension, may
reject the SNI extension.  It is useless to define SNIMatcher.

I think the requirement is clear that it is a must to use SNIMatcher to
perform the match operation if the corresponding server name appears in
the SNI extension. I think it is true for the case when there is only
one server name type, at least.

I completely agree.

Let's look more about what happens when there is 1+ server name types in
the SNI extension. Let's use the example in your previous mail.

    SNIHostname:         "example.com"
    SNINickName:         "www.example.com"

    SNIMatcher:          "example.com"
    SNINickNameMatcher:  "www1.example.com

Suppose that the server is able to understand both HostName and
NickName.  In the above example, server is able to recognize HostName,
but not NickName.  Then should the server includes an extension of type
"server_name" in the (extended) server hello?

If the server_name extension is included, it is unclear for client side
which one is accepted.

The presence of a server's server_name extension indicates that an SNI value was used to guide the selection of an appropriate cert. It seems ambiguous in RFC 6066 as to whether this extension indicated "ALL" or "AT LEAST ONE" SNI value guided the selection. I might lean towards ALL since RFC 6066 says "The 'extension_data' field of this extension SHALL be empty". If it AT LEAST ONE were meant, there is no way of indicating *which* extension was used, or if multiple ones were used.

As an aside, we have no API for the KeyManagers's to indicate whether they actually used a SNI extension, so I think you are currently sending a server server_name extension if any cert was selected. I don't think this is a major problem given our current APIs.

 Because the client side may need to use the
server_name to do endpoint identification, it is not safe to use
"www.example.com" to perform endpoint identification because the server
side does not accept it.

If the server_name extension is not included, it does not follow the
spec when server side is able to recognize the server name.

So, I will prefer that once a SNIMatcher is defined, it must be used to
perform match operation if the corresponding server name type appears in
the SNI extension.

I think we need to adjust the spec to make the behavior more clear.  I
will adjust the spec of SNIMatcher a little:
   * the exact server that the client wants to access.  Instances of this
- * class can be used by a server to verify the acceptable server names
+ * class is used by a server to verify the acceptable server names

I think I still prefer "can be used" because some servers won't accept SNI info, and this indicates to me that it absolutely will be used in all situations. Unless you said something like "are used by servers which recognize the extension..." But that gets wordy.

   * of a particular type, such as host names.

And SSLParameters.getSNIMatchers()
      * <P>
      * This method is only useful to {@link SSLSocket}s or
      * {@link SSLEngine}s operating in server mode.
+    * <P>
+    * Every {@code SNIMatcher} in the returned {@link Collection} must
+    * be used to perform match operation if the corresponding name
+    * type appears in the SNI extension.
      * <P>
      * For better interoperability, providers generally will not define
      * default matchers so that by default servers will ignore the SNI
      * extension and continue the handshake.

What do you think?

I think what you had is fine, and I suggest we go with it for now. I think we can and should ask for clarification at IETF as to the intent, and we add this new paragraph as an enhancement if they are in agreement. If there is no agreement there, then we could just call it a implementation detail and continue using AND.

I may not need a new bug or CCC request because the
update is minor.

Actually, I think this is a little more than a minor change.

Which reminds me, is your server code sending SNI extensions for anonymous suites?

2509:  Something to investigate: you are depending on SSLParameters
returning an unmodifiable list.  But a subclass might not do that.  Can
you think of any situations where this might be a bad idea?  If so, then
we might want to change the unmodifiable language in SSLParameters and
do regular cloning.  This will have repercussions in other areas, like
around 2527/2532, where you'll need to pass a copy to the Handshaker.

Well, I understand that something bad would happen if the subclass does
not follow the method spec while doing method implementation overriding.

Yes, it was just something to think about.  Of course, I'm trying to
think of exploit situations, since you're really just hurting yourself
if tweak this in the middle of a handshake.

If I see Joe Darcy around, I'll check in with him.

Thanks! I really think we need to think about it more and carefully. The
style (immutable returned value in none-final method) does impact the
reliability of the APIs.

I talked to Joe, and it's one of those grey areas. It's ultimately your own fault if you misuse the API like this. However, if there were potential vulnerability issues, that would be different. Given what this API does, I don't see anything like that here. But you're right, it's not reliable which is why I brought it up.

Brad



Let's have the spec and implementation as it is.  We can update the spec
and implementation if we have strong concerns or a common solution for
the issue before JDK 8 officially release.

I'm fine with this.

sun/security/ssl/X509TrustManagerImpl.java
==========================================
OK

All of other comments are accepted.

I think there is no major concerns so far.

None still outstanding.  I looked over the previous comments I've made
and what you've done to address them, and all looks good minus the
little points above.

Good! It seems that we only have one question, how to use SNIMatachers?
See above.

Thanks,
Xuelei


Thank you so much for the
detailed evaluation and comments on both spec and implementation.  TLS
and its implementation is very complicated, your support is the critical
success factor to deliver quality product.

Thanks, and be sure to give yourself a lot of that credit.  With all the
back/forth and development this feature has seen, I think you've done a
great job.

Brad


Reply via email to