"I'm not sure how (or even if) you can have Java attempt to connect
with SSLv3 and then re-try with TLS."

I think it is possible, have a look on JSSE Reference Guide for
sun.security.ssl.allowUnsafeRenegotiation and
sun.security.ssl.allowLegacyHelloMessages, they're explaining how to
catch the SSLHandshakeException and launch one more startHandshake
method.
I admit I have not tried this, by the way..


"I don't believe Java 6 for example supports TLSv1.1 and TLSv1.2."

It doesn't, as said in the JSSE Reference Guide
(http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html)
=> " Provides API support for SSL versions 2.0 and 3.0, TLS 1.0 and
later; and an implementation of SSL 3.0 and TLS 1.0"

A.T.

2015-02-26 17:37 GMT+01:00 Christopher Schultz <ch...@christopherschultz.net>:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> Deepak,
>
> On 2/25/15 1:49 AM, dku...@ccilindia.co.in wrote:
>>> Perhaps you disabled SSLv3 and a client is trying to connect
>>> using SSLv3?
>>
>> We agree with your above statement. We have disabled SSLv3 on
>> Tomcat server and our client is an exe which sends request using
>> below code.
>
> (What's an "exe"?)
>
>> URL server = new URL(url); jprogress.setValue(11); final String
>> hostvar = ip; HttpsURLConnection.setDefaultHostnameVerifier(new
>> HostnameVerifier() { public boolean verify(String hostname,
>> SSLSession session) { if (hostname.equals(hostvar)) { return true;
>> } else { return false; } } });
>
> Note that the above is roughly equivalent to the default hostname
> verifier. Why are you bothering with that?
>
>> try{ HttpsURLConnection con = (HttpsURLConnection)
>> server.openConnection(); jprogress.setValue(14);
>> con.setConnectTimeout(90000000);
>
> That is a *very* long timeout. Why?
>
>> con.setDoOutput(true); con.setUseCaches(false);
>> con.setReadTimeout(60000);
>
> That's a pretty long timeout, too. Who wants to wait 60 seconds for a
> byte of data?
>
>> jprogress.setValue(16);
>>
>> We are unable to find at which point the client exe uses either TLS
>> or SSLv3 to send request to the server.
>
> It will depend upon the URL being passed-into the URL constructor:
> URL.openConnection will determine which protocol to use.
>
>> Also we find that client exe works fine in other machines. We want
>> to know if this is system specific or java specific.
>
> This is a combination of the two.
>
> If you want to force the client to use a different protocol (e.g.
> TLSv1 versus SSLv3), you need to tell HttpsURLConnection to use a
> different socket factory. Something like this:
>
> String protocol = ...; // "SSL" or "TLS"
> String[] sslEnabledProtocols = ...; // whatever specific protocols you
> want to support, like SSLv3, SSLv2hello, TLSv1.1, etc.
> String[] sslCipherSuites = ...; // Whatever SSL cipher suites you want
> to support
>
> TrustManager[] tms = ...; // Whatever trust managers you want to use
> Random random = new SecureRandom();
> SSLContext sc = SSLContext.getInstance(protocol);
>
> sc.init(null, tms, random);
>
> SSLSocketFactory sf = sc.getSocketFactory();
>
> if(null != sslEnabledProtocols
>            || null != sslCipherSuites)
>             sf = new CustomSSLSocketFactory(sf,
>                                             sslEnabledProtocols,
>                                             sslCipherSuites);
>
> HttpsURLConnection.setDefaultSSLSocketFactory(sf);
>
> You'll also need this:
>
>     public static class CustomSSLSocketFactory
>         extends javax.net.ssl.SSLSocketFactory
>     {
>         private final String[] _sslEnabledProtocols;
>         private final String[] _sslCipherSuites;
>         private final SSLSocketFactory _base;
>
>         public CustomSSLSocketFactory(SSLSocketFactory base,
>                                   String[] sslEnabledProtocols,
>                                   String[] sslCipherSuites)
>         {
>             _base = base;
>             if(null == sslEnabledProtocols)
>                 _sslEnabledProtocols = null;
>             else
>                 _sslEnabledProtocols = sslEnabledProtocols.clone();
>             if(null == sslCipherSuites || 0 == sslCipherSuites.length)
>                 _sslCipherSuites = getDefaultCipherSuites();
>             else if(1 == sslCipherSuites.length &&
> "ALL".equalsIgnoreCase(sslCipherSuites[0]))
>                 _sslCipherSuites = getSupportedCipherSuites();
>             else
>                 _sslCipherSuites = sslCipherSuites.clone();
>         }
>
>         public String[] getDefaultCipherSuites() {
>             return _base.getDefaultCipherSuites();
>         }
>         public String[] getSupportedCipherSuites() {
>             return _base.getSupportedCipherSuites();
>         }
>
>         private SSLSocket customize(Socket s)
>         {
>             SSLSocket socket = (SSLSocket)s;
>
>             if(null != _sslEnabledProtocols)
>                 socket.setEnabledProtocols(_sslEnabledProtocols);
>
>             socket.setEnabledCipherSuites(_sslCipherSuites);
>
>             return socket;
>         }
>
>         @Override
>         public Socket createSocket(Socket s,
>                                    String host,
>                                    int port,
>                                    boolean autoClose)
>             throws IOException
>         {
>             return customize(_base.createSocket(s, host, port,
> autoClose));
>         }
>         @Override
>         public Socket createSocket(String host, int port)
>             throws IOException, UnknownHostException
>         {
>             return customize(_base.createSocket(host, port));
>         }
>         @Override
>         public Socket createSocket(InetAddress host, int port)
>             throws IOException
>         {
>             return customize(_base.createSocket(host, port));
>         }
>         @Override
>         public Socket createSocket(String host, int port,
>                                    InetAddress localHost, int localPort)
>             throws IOException, UnknownHostException
>         {
>             return customize(_base.createSocket(host, port, localHost,
> localPort));
>         }
>         @Override
>         public Socket createSocket(InetAddress address, int port,
>                                    InetAddress localAddress, int
> localPort)
>             throws IOException
>         {
>             return customize(_base.createSocket(address, port,
> localAddress, localPort));
>         }
>     }
>
> I'm not sure how (or even if) you can have Java attempt to connect
> with SSLv3 and then re-try with TLS. I would imagine that's built-into
> the code. It would be foolish if it weren't available.
>
> But, it's possible that a handshake is not possible, especially if
> there is an old version of Java being used by the client. I don't
> believe Java 6 for example supports TLSv1.1 and TLSv1.2. So, if your
> server is configured to only allow those protocols, you will never be
> able to establish a handshake with a Java6-based client.
>
> Hope that helps,
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1
> Comment: GPGTools - http://gpgtools.org
>
> iQIcBAEBCAAGBQJU70uuAAoJEBzwKT+lPKRYP/wP/Ras88Af6qTYNK5VsB4bcdet
> vGjBr+fsbbD1HuG+VLSbX03xg7X5cW3JfZgjGOgevdjygmHS8LkyunFJnUe5x6xe
> GK97Lz4O7RUR26HwJnNwtAwYDaccln7o8xTg2aOa/z4j/7DuXACCgHckpGvyh4aT
> Yk016fQbGXRtK+fXKr0VvGRVkkL7OzIN83Kq2TtV7Je6aZE91s1PHchzNTtnnRvu
> yfrWRZmtCUQg/nCJ990l86DePvn7ewWoYwbDJ5rrtOi1MtND6m10pHBmDr6TLHfD
> R7h/bUFzDmoHF8YPVZR89K5G57mU9eIBB8WbgPXCnFNnZowUw+z+fg9DFXMyag5s
> yUBu9u5feGgOeE7BM+X162d0605uWuKy/HsJ/T7FuOwjiGcS2350c8FSfkZ9qCH8
> Eb9gHqZydku/3N9Fub2oWSrAMMKFVBBfnUr1L63mI7VMN24A+k27tXmjzR7QERr5
> Hu8HatEy1qW3D3sKD0gOWkGlO2TA3CdKHns1Ci8Ueu2U7DnxU3fGnXkVm/MYWpOR
> sPIZueio7pE0rPkXaMfY23K6qMGDMxJfBwDcZkACyfoxWSrfQ8UIRu+8Or5JWnHR
> XfXGXq1D8K6Fx1gx0ZSJnuO4wDE7oC1X1Irupzq2aqIT9WpuQDzx+hSNwcJ+0sB4
> Cbqx+Oh1YcsJHlinv032
> =canw
> -----END PGP SIGNATURE-----
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to