Может ли java jdk 1.6.0_39 поддерживать TLSv1.2? [Дубликат]

Я исправил мою, обновив рельсы

bundle update rails
21
задан Zoran Regvart 4 November 2015 в 10:09
поделиться

4 ответа

Здесь фабрика TLSConnection:

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<Integer, byte[]> getClientExtensions() throws IOException {
                                Hashtable<Integer, byte[]> clientExtensions = super.getClientExtensions();
                                if (clientExtensions == null) {
                                    clientExtensions = new Hashtable<Integer, byte[]>();
                                }

                                //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<java.security.cert.Certificate> certs = new LinkedList<java.security.cert.Certificate>();
                                        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

    }
}

Помните, что для доказательства этого лучше всего протестировать сайт, который предоставляет ТОЛЬКО TLS 1.2. Если веб предоставляет TLS 1.0, TLS 1.1 в зависимости от реализации Java будет подключаться с использованием tls 1.0, tls 1.1. Протестируйте его на сайте, который предоставляет только TLS 1.2. Примером может служить безопасный сайт NIST https://www.nist.gov

8
ответ дан Azimuts 22 August 2018 в 07:45
поделиться
  • 1
    Если вы предпочитаете, вы можете использовать необработанные HTTP-команды таким образом stackoverflow.com/questions/8171802/… ..... Но это сырые команды http ... Я думаю, что лучше использовать HTTPSUrlconnection + настроенный SSLConnectionFactory: URL myurl = новый URL («http: // ... URL-адрес только работает в TLS 1.2); HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection (); con.setSSLSocketFactory (новый TSLSocketConnectionFactory ()); – Azimuts 3 November 2015 в 11:00
  • 2
    Я застрял в Java 5, и это, похоже, единственное решение. Я вижу, что многие из этих методов пустые, генерируют исключение или возвращают значения null. Какова цель этого? У вас есть работающая фабричная фабрика TLS? – Saky 13 June 2017 в 00:35
  • 3
    Это сработало, спасибо. Очень ценю ваш ответ, я уже сходил с ума, прежде чем нашел свое решение. – Dmytro Pastovenskyi 25 June 2018 в 13:08

Java 6, теперь поддерживаем TLS 1.2, посмотрите ниже

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

7
ответ дан David 22 August 2018 в 07:45
поделиться
  • 1
    Хотя это теоретически может ответить на вопрос, было бы предпочтительнее включить здесь основные части ответа и предоставить ссылку для справки. – Bhargav Rao♦ 10 October 2016 в 15:43
  • 2
    Похоже, эта версия доступна только тем, у кого есть контракт на поддержку. – user872858 7 September 2017 в 20:41

Вы должны создать свой собственный SSLSocketFactory на основе Bouncy Castle. После его использования перейдите к общему HttpsConnextion для использования этого настроенного SocketFactory.

1. Сначала: Создайте TLSConnectionFactory

Здесь приведены советы:

1.1 Расширить SSLConnectionFactory

1.2 Переопределить этот метод:

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

Этот метод вызовет следующий внутренний метод,

1.3 Внедрить внутренний метод _createSSLSocket (host, tlsClientProtocol);

Здесь вы должны создать Socket, используя TlsClientProtocol. Трюк переопределяется ... метод startHandshake (), вызывающий TlsClientProtocol

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

Важно: полный пример использования протокола TLS Client хорошо объясняется здесь: Использование BouncyCastle для простого запроса HTTPS

2. Второй: используйте этот настраиваемый SSLConnextionFactory для общего HTTPSConnection.

Это важно! В других образцах, которые вы можете увидеть в Интернете, вы видите жестко закодированные HTTP-команды .... так что с помощью настраиваемого SSLConnectionFactory вам больше ничего не нужно ...

  URL myurl = new URL( "http:// ...URL tha only Works in TLS 1.2);
  HttpsURLConnection  con = (HttpsURLConnection )myurl.openConnection();
  con.setSSLSocketFactory(new TSLSocketConnectionFactory());
4
ответ дан fmodos 22 August 2018 в 07:45
поделиться
  • 1
    Благодарю. Я использую bouncyCastle в tomcat. так что вы могли бы объяснить это решение в деталях? или есть ли образец или учебник по настройке BC для использования TLS1.2 (в java6)? – alex 3 November 2015 в 09:20
  • 2
    Полные образцы находятся в этом uri: stackoverflow.com/questions/8171802/… – Azimuts 3 November 2015 в 10:40
  • 3
    Но ... попробуйте реализовать настроенный SSLConnectionFactory (TLSConnectionFactory), как я объясню ... Просто начните создавать класс, который расширяет SSLConnectionFactory и переопределяет @Override общедоступный Socket createSocket (сокет Socket, конечный хост String, int port, boolean arg3) ... Просто вызовите TSLClientProtocol – Azimuts 3 November 2015 в 10:42
  • 4
    Я разделяю код TLSConnection Factory – Azimuts 3 November 2015 в 10:54
  • 5
    Я считаю, что есть опасения. я не хочу подключаться к серверу в качестве клиента. Я ищу способ, который позволяет мне реагировать на клиента (браузеры) с помощью tls1.2. Другими словами, у меня есть свой собственный webapp (развернутый в tomcat), который написан java6 и использует bouncycastle для защищенных соединений ответа. но я хочу обновить TLSv1 (который поддерживает) до TLSv1.2 без обновления java-версии. – alex 3 November 2015 в 13:24

Публичные выпуски Oracle Java 6 не поддерживают TLSv1.2. Платные версии Java 6 (после EOL) могут. (UPDATE - TLSv1.1 доступен для Java 1.6 начиная с обновления 111, source )

Обратитесь к продажам Oracle.

Другие альтернативы:


Однако я бы посоветовал перейти на Java 8. Java 6 была EOL'd в феврале 2013 года, и продолжать использовать ее потенциально рискованно. (Расскажите или напомните начальнику / клиенту. Они должны знать.)

15
ответ дан Stephen C 22 August 2018 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: