BTW, both 7068321 and 8000954 are in Open, should be "In Progress".

On 10/15/2012 6:27 PM, Xuelei Fan wrote:
On 10/16/2012 7:12 AM, Brad Wetmore wrote:
Looks good.

The main update is to add "final" keyword to the new methods in
SSLParamaters.  I prefer to use the final because I don't see a
requirement to override them.

Let me know when the new CCC is ready, I'll approve it.

The CCC for this fix, 7068321 has been finalized. I submitted a new CCC
to add the final keyword:
     https://jbs.oracle.com/bugs/browse/JDK-8000954

I will fill the new CCC after the push of 7068321.

Are you going to contact IETF?

Yes, I will.

Almost there.

I think we get all spec review, code review done.

I think so.

> I will push the
changeset after the CCC get approved, and pay more time on CPU bugs.

You could push both together and put everything in just one changeset, but of course up to you.

I don't think there's anything else for me to do, let me know if you're waiting on something.

Brad


Thanks,
Xuelei

Brad


On 10/13/2012 6:26 AM, Xuelei Fan wrote:
New webrev: http://cr.openjdk.java.net./~xuelei/7068321/webrev.14/

The main update is to add "final" keyword to the new methods in
SSLParamaters.  I prefer to use the final because I don't see a
requirement to override them.  But I can go with the version with or
without the "final" keyword.  I think you properly don't need to review
other parts of the webrev any more, no other major update.

Thanks,
Xuelei


On 10/13/2012 10:17 AM, Xuelei Fan wrote:
I have no access to office network, just a quick reply. I want add
final keyword for the new methods in SSLParameters. See below.

Sent from my iPad

On Oct 13, 2012, at 8:00 AM, Brad Wetmore
<bradford.wetm...@oracle.com> wrote:


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 will send the new webrev tonight my time.

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.

A server name indication extension will be sent whenever the name is
recognizable by the matches. I did not check for the types of cipher
suites.  I think it is the proper approach because although for
anonymous cipher cuties, there is not certificates, but the ssl
context may be different, so it is still can be regarded as the
server do something different related to the specified SNI.

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.

Ok. Let's go with the current spec.

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?

Yes. See above.

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.

According to effective java, I would prefer to use final keyword for
the new methods.  I did not see clear requirements that customers
need to override the methods. So I would like a stricter restriction
for the new methods in case of any mis-use. Does it make sense to you?

Xuelei

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