2015-10-27 85 views
17

Java 6はTLSをv1.0までサポートしているようですが、Java 6でTLS 1.2を使用する方法はありますか?Java 6でTLS 1.2を使用する方法

Java 6のパッチまたは特定のアップデートでサポートされるかもしれませんか?

+0

の下にチェックアウトしたJava 6はまた、1024ビットのDH弾性率で立ち往生していますIIRC。 [logjam](http://stackoverflow.com/a/30706878)の後は、適切に構成されたサーバーに接続できない可能性があります。可能であれば、おそらく別のクライアントプラットフォームに移動する必要があります。 – jww

+0

実際、Java 6および7は、JRE 6U105(aka1.6.0_105)および7u91(別名1.7.0_91)から始まるDHエフェメラルキー(最大2048ビット)をサポートします。 (出典:https://github.com/mozilla/server-side-tls/issues/107) –

答えて

14

公開Oracle Java 6リリースでは、TLSv1.2はサポートされません。有料版Java 6(EOL後)の可能性があります。 (UPDATE - TLSv1.1は、アップデート111以降のJava 1.6で利用可能です。source

Oracle販売代理店にお問い合わせください。

他の選択肢は以下のとおりです。


しかし、私は、Java 8のJava 6にアップグレードするお勧めする2013年2月にEOL'd、それを使い続けることは、潜在的に危険であるました。

+1

これについての一言。Bouncyを使用して見たすべてのサンプルは、生のHTTPコマンドを送信することに基づいています...それは少し難しいです作業/制作プログラムに統合する。明らかに最善の方法は、JVMをアップグレードすることです(アプリケーションサーバに応じて、IBM JVM、f.e、Oracle WLS環境では利用できません)。 Bellow私はBouncyに基づいてカスタマイズされたSSL SocketConnectionFactoryを使用して回避策を説明します。誰かが解決策を見つけた場合、生のHTTPコマンドをsendindだけでなく、procommons ..のために共有してください! .-) – Azimuts

3

Bouncy Castleに基づいて独自のSSLSocketFactoryを作成する必要があります。使用した後、このカスタマイズされたSocketFactoryを使用するための共通のHttpsConnextionに渡します。

:1.まずTLSConnectionFactoryを作成

ここに1つのヒント:

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

このメソッドは、次を呼び出します:

1.1はSSLConnectionFactory

1.2オーバーライドにこの方法を拡張内部方法、

1.3内部メソッド_createSSLSocket(host、tlsClientProtocol)を実装します。

TlsClientProtocolを使用してSocketを作成する必要があります。 TLSクライアントプロトコルを使用する方法の完全なサンプルはここにも説明されています:Using BouncyCastle for a simple HTTPS query

(2)第2:使用して、このカスタマイズSSLConnextionFactoryトリックはTlsClientProtocol

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

重要を呼び出すオーバーライド... startHandshake()メソッドであります一般的なHTTPSConnection。

これは重要です。他のサンプルでは、​​Webには、ハードコードされたHTTPコマンドが表示されます。そのため、カスタマイズされたSSLConnectionFactoryでは何も必要ありません。

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

ありがとうございます。私はtomcatでbouncyCastleを使用しています。ソリューションを詳しく説明できますか?またはTLS1.2を使用するようにBCをカスタマイズするためのサンプルまたはチュートリアルがありますか(java6の場合)? – alex

+0

完全なサンプルはこのuriにあります:http://stackoverflow.com/questions/8171802/using-bouncycastle-for-a-simple-https-query – Azimuts

+0

しかし、カスタマイズされたSSLConnectionFactory(TLSConnectionFactory)を実装しようとすると、 SSLConnectionFactoryを拡張して@Overrideをオーバーライドするクラスを作ることを開始するpublicソケットcreateSocket(ソケットソケット final String host、int port、boolean arg3)...ただTSLClientProtocolを呼び出す – Azimuts

5

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 

    } 
} 
+1

あなたが望むなら、この方法で生のHTTPコマンドを使うことができますhttp://stackoverflow.com/questions/8171802/using-bouncycastle-for-a-simple-https-query?lq=1 .....しかし、生httpコマンド....私はHTTPSUrlconnection +カスタマイズSSLConnectionFactoryを使用する方が良いと思います:URL myurl =新しいURL( "http:// ... URLはTLS 1.2でのみ動作します); HttpsURLConnection con =(HttpsURLConnection)myurl.openConnection (); con.setSSLSocketFactory(new TSLSocketConnectionFactory()); – Azimuts

+0

これは唯一の解決策であると思われます。これ?Do yo動作しているTLS接続ファクトリ実装がありますか? – Saky

7
+2

これは理論的に質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にすることが望ましいです(// meta.stackoverflow.com/q/8259)。 –

+2

このバージョンのように見えるのは、サポート契約を結んでいるユーザーだけです。 – user872858

関連する問題