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 >>>