Peter Dettman created HTTPCLIENT-2151:
-----------------------------------------

             Summary: Optionally use JSSE inbuilt endpoint identification
                 Key: HTTPCLIENT-2151
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2151
             Project: HttpComponents HttpClient
          Issue Type: Wish
          Components: HttpClient (classic)
            Reporter: Peter Dettman


This issue brings to the fore that part of HTTPCLIENT-2134 which is actually 
within the scope of HttpClient: the possibility of using JSSE inbuilt endpoint 
identification ("HTTPS") instead of performing those checks externally 
(typically in _org.apache.hc.client5.http.ssl.DefaultHostnameVerifier_).

Java 1.7 added the method 
SSLParameters.setEndpointIdentificationAlgorithm(String). Calling this method 
with the argument "HTTPS" (case-insensitive) will result in the endpoint 
identification checks from RFC 2818 being automatically done by JSSE during the 
handshake (specifically when the X509TrustManager validates the server 
certificate). Note that the setting can also be interrogated via 
SSLParameters.getEndpointIdentificationAlgorithm.

This has some minor advantages relative to performing the checks externally:
* The check is done earlier in the handshake, reducing the cost of failed 
connections. (Technically this might still be achieved anyway by wrapping the 
X509TrustManager and applying a HostnameVerifier at that stage).
* Per my comments in HTTPCLIENT-2134, in some nuanced situations SunJSSE will 
be willing to resume a session only if it knows for sure that endpoint 
identification is being used (which it can't know for an arbitrary 
HostnameVerifier).
* SunJSSE's HTTPS endpoint identification has special (less-restrictive) rules 
for wildcard characters when the trust anchor is a certificate from the 
'cacerts' file (what it calls a "public root CA").

There may be other implications that I am unaware of, but I think this 
establishes that some users may prefer (or even need) to delegate endpoint 
identification to JSSE in this way. They presumably will not then want a 
duplicate check in DefaultHostnameVerifier.

I am not yet that familiar with HttpClient, but I assume a user could already 
provide a custom SSLSocketFactory which enables JSSE endpoint identification on 
sockets before returning them, and then separately configure a no-op 
HostnameVerifier. I consider that to be rather fragile and it's easy to see 
mistakes leading to no endpoint identification being performed.

I am proposing that HttpClient support this via a simpler configuration 
mechanism. To loosely outline some basic options:
IGNORE: don't even check whether JSSE endpoint identification was enabled (i.e. 
assume it wasn't).
AWARE: check at runtime whether JSSE endpoint identification was "HTTPS" for a 
given socket connection.
DISABLE: remove any existing setting for JSSE endpoint identification (set it 
to "").
FORCE: overwrite any existing setting for JSSE endpoint identification (set it 
to "HTTPS").

So we would consider some value that came to us via the SSLSocketFactory's 
default socket setup, and whether to ignore it, respect it, or force it on/off. 
DefaultHostnameVerifier can then be set to possibly skip its own endpoint 
checks when appropriate.




--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to