How to use TLS 1.2 in Java 6

匿名 (未验证) 提交于 2019-12-03 01:45:01

问题:

It seems that Java 6 supports TLS up to v1.0, is there any way to use TLS 1.2 in Java 6?

Maybe a patch or a particular update of Java 6 will have support for it?

回答1:

Public Oracle Java 6 releases do not support TLSv1.2. Paid-for releases of Java 6 (post-EOL) might. (UPDATE - TLSv1.1 is available for Java 1.6 from update 111 onwards; source)

Contact Oracle sales.

Other alternatives are:


However, I'd advise upgrading to a Java 8. Java 6 was EOL'd in Feb 2013, and continuing to use it is potentially risky. (Tell or remind the boss / the client. They need to know.)



回答2:

Java 6, now support TLS 1.2, check out below

http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_121



回答3:

Here a TLSConnection Factory:

package test.connection;  import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import java.security.Principal; import java.security.SecureRandom; import java.security.Security; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.util.Hashtable; import java.util.LinkedList; import java.util.List;  import javax.net.ssl.HandshakeCompletedEvent; import javax.net.ssl.HandshakeCompletedListener; import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSessionContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.security.cert.X509Certificate;  import org.bouncycastle.crypto.tls.Certificate; import org.bouncycastle.crypto.tls.CertificateRequest; import org.bouncycastle.crypto.tls.DefaultTlsClient; import org.bouncycastle.crypto.tls.ExtensionType; import org.bouncycastle.crypto.tls.TlsAuthentication; import org.bouncycastle.crypto.tls.TlsClientProtocol; import org.bouncycastle.crypto.tls.TlsCredentials; import org.bouncycastle.jce.provider.BouncyCastleProvider;  /**  * This Class enables TLS V1.2  connection based on BouncyCastle Providers.  * Just to use:   * URL myurl = new URL( "http:// ...URL tha only Works in TLS 1.2);    HttpsURLConnection  con = (HttpsURLConnection )myurl.openConnection();    con.setSSLSocketFactory(new TSLSocketConnectionFactory());    * @author AZIMUTS  *  */ public class TSLSocketConnectionFactory extends SSLSocketFactory {     ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Adding Custom BouncyCastleProvider ///////////////////////////////////////////////////////////////////////////////////////////////////////////////     static {     if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null)         Security.addProvider(new BouncyCastleProvider());     }    ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //HANDSHAKE LISTENER ///////////////////////////////////////////////////////////////////////////////////////////////////////////////      public class TLSHandshakeListener implements HandshakeCompletedListener {         @Override         public void handshakeCompleted(HandshakeCompletedEvent event) {           }     } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SECURE RANDOM ///////////////////////////////////////////////////////////////////////////////////////////////////////////////      private SecureRandom _secureRandom = new SecureRandom();  ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Adding Custom BouncyCastleProvider ///////////////////////////////////////////////////////////////////////////////////////////////////////////////      @Override     public Socket createSocket(Socket socket, final String host, int port, boolean arg3)             throws IOException {         if (socket == null) {             socket = new Socket();         }         if (!socket.isConnected()) {             socket.connect(new InetSocketAddress(host, port));         }          final TlsClientProtocol tlsClientProtocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(), _secureRandom);         return _createSSLSocket(host, tlsClientProtocol);         } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SOCKET FACTORY  METHODS   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     @Override     public String[] getDefaultCipherSuites() {               return null;     }      @Override     public String[] getSupportedCipherSuites(){          return null;     }      @Override     public Socket createSocket(String host, int port) throws IOException,UnknownHostException{           return null;     }      @Override     public Socket createSocket(InetAddress host, int port) throws IOException {          return null;     }      @Override     public Socket createSocket(String host, int port, InetAddress localHost,             int localPort) throws IOException, UnknownHostException {            return null;     }      @Override     public Socket createSocket(InetAddress address, int port,             InetAddress localAddress, int localPort) throws IOException{             return null;     }  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SOCKET CREATION //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////      private SSLSocket _createSSLSocket(final String host , final TlsClientProtocol tlsClientProtocol) {      return new SSLSocket() {                     private java.security.cert.Certificate[] peertCerts;           @Override           public InputStream getInputStream() throws IOException {               return tlsClientProtocol.getInputStream();           }            @Override           public OutputStream getOutputStream() throws IOException {               return tlsClientProtocol.getOutputStream();           }            @Override           public synchronized void close() throws IOException {                       tlsClientProtocol.close();           }             @Override            public void addHandshakeCompletedListener(HandshakeCompletedListener arg0) {                      }              @Override             public boolean getEnableSessionCreation() {                          return false;             }              @Override             public String[] getEnabledCipherSuites() {                           return null;             }              @Override             public String[] getEnabledProtocols() {                 // TODO Auto-generated method stub                 return null;             }              @Override             public boolean getNeedClientAuth(){                          return false;             }              @Override             public SSLSession getSession() {                    return new SSLSession() {                      @Override                     public int getApplicationBufferSize() {                                          return 0;                     }                      @Override                     public String getCipherSuite() {                          throw new UnsupportedOperationException();                     }                      @Override                     public long getCreationTime() {                          throw new UnsupportedOperationException();                     }                      @Override                     public byte[] getId() {                          throw new UnsupportedOperationException();                     }                      @Override                     public long getLastAccessedTime() {                          throw new UnsupportedOperationException();                     }                      @Override                     public java.security.cert.Certificate[] getLocalCertificates() {                          throw new UnsupportedOperationException();                     }                      @Override                     public Principal getLocalPrincipal() {                          throw new UnsupportedOperationException();                     }                      @Override                     public int getPacketBufferSize() {                          throw new UnsupportedOperationException();                     }                      @Override                     public X509Certificate[] getPeerCertificateChain()                             throws SSLPeerUnverifiedException {                         // TODO Auto-generated method stub                         return null;                     }                      @Override                     public java.security.cert.Certificate[] getPeerCertificates()throws SSLPeerUnverifiedException {                          return peertCerts;                     }                      @Override                     public String getPeerHost() {                          throw new UnsupportedOperationException();                     }                      @Override                     public int getPeerPort() {                                               return 0;                     }                      @Override                     public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {                       return null;                          //throw new UnsupportedOperationException();                      }                      @Override                     public String getProtocol() {                          throw new UnsupportedOperationException();                     }                      @Override                     public SSLSessionContext getSessionContext() {                          throw new UnsupportedOperationException();                     }                      @Override                     public Object getValue(String arg0) {                          throw new UnsupportedOperationException();                     }                      @Override                     public String[] getValueNames() {                          throw new UnsupportedOperationException();                     }                      @Override                     public void invalidate() {                          throw new UnsupportedOperationException();                      }                      @Override                     public boolean isValid() {                          throw new UnsupportedOperationException();                     }                      @Override                     public void putValue(String arg0, Object arg1) {                          throw new UnsupportedOperationException();                      }                      @Override                     public void removeValue(String arg0) {                          throw new UnsupportedOperationException();                      }                     };             }               @Override             public String[] getSupportedProtocols() {                        return null;             }              @Override             public boolean getUseClientMode() {                              return false;             }              @Override             public boolean getWantClientAuth() {                  return false;             }              @Override             public void removeHandshakeCompletedListener(HandshakeCompletedListener arg0) {                           }              @Override             public void setEnableSessionCreation(boolean arg0) {               }              @Override             public void setEnabledCipherSuites(String[] arg0) {                       }              @Override             public void setEnabledProtocols(String[] arg0) {               }              @Override             public void setNeedClientAuth(boolean arg0) {                         }              @Override             public void setUseClientMode(boolean arg0) {                          }              @Override             public void setWantClientAuth(boolean arg0) {                             }              @Override             public String[] getSupportedCipherSuites() {                             return null;             }             @Override             public void startHandshake() throws IOException {                   tlsClientProtocol.connect(new DefaultTlsClient() {                                                 @Override                           public Hashtable getClientExtensions() throws IOException {                                 Hashtable clientExtensions = super.getClientExtensions();                                 if (clientExtensions == null) {                                     clientExtensions = new Hashtable();                                 }                                  //Add host_name                                 byte[] host_name = host.getBytes();                                  final ByteArrayOutputStream baos = new ByteArrayOutputStream();                                 final DataOutputStream dos = new DataOutputStream(baos);                                 dos.writeShort(host_name.length + 3); // entry size                                 dos.writeByte(0); // name type = hostname                                 dos.writeShort(host_name.length);                                 dos.write(host_name);                                 dos.close();                                 clientExtensions.put(ExtensionType.server_name, baos.toByteArray());                                 return clientExtensions;                         }                          @Override                         public TlsAuthentication getAuthentication()                                 throws IOException {                             return new TlsAuthentication() {                                   @Override                                 public void notifyServerCertificate(Certificate serverCertificate) throws IOException {                                    try {                                         CertificateFactory cf = CertificateFactory.getInstance("X.509");                                         List certs = new LinkedList();                                         for ( org.bouncycastle.asn1.x509.Certificate c : serverCertificate.getCertificateList()) {                                                                                       certs.add(cf.generateCertificate(new ByteArrayInputStream(c.getEncoded())));                                         }                                         peertCerts = certs.toArray(new java.security.cert.Certificate[0]);                                     } catch (CertificateException e) {                                                                           System.out.println( "Failed to cache server certs"+ e);                                        throw new IOException(e);                                     }                                  }                                  @Override                                 public TlsCredentials getClientCredentials(CertificateRequest arg0)                                         throws IOException {                                                                         return null;                                 }                              };                          }                     });                }          };//Socket      } } 


回答4:

You must create your own SSLSocketFactory based on Bouncy Castle. After to use it, pass to the common HttpsConnextion for using this customized SocketFactory.

1. First : Create a TLSConnectionFactory

Here one tips:

1.1 Extend SSLConnectionFactory

1.2 Override this method :

@Override  public Socket createSocket(Socket socket, final String host, int port, boolean arg3) 

This method will call the next internal method,

1.3 Implement an internal method _createSSLSocket(host, tlsClientProtocol);

Here you must create a Socket using TlsClientProtocol . The trick is override ...startHandshake() method calling TlsClientProtocol

 private SSLSocket _createSSLSocket(final String host , final TlsClientProtocol tlsClientProtocol) {      return new SSLSocket() {            .... Override and implement SSLSocket methods,  particulary:              startHandshake() {              }          } 

Important : The full sample how to use TLS Client Protocol is well explained here: Using BouncyCastle for a simple HTTPS query

2. Second : Use this Customized SSLConnextionFactory on common HTTPSConnection.

This is important ! In other samples you can see into the web , u see hard-coded HTTP Commands....so with a customized SSLConnectionFactory u don't need nothing more...

  URL myurl = new URL( "http:// ...URL tha only Works in TLS 1.2);   HttpsURLConnection  con = (HttpsURLConnection )myurl.openConnection();   con.setSSLSocketFactory(new TSLSocketConnectionFactory()); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!