Java TLS v1.2上的Android客户端/服务器

Java TLS v1.2上的Android客户端/服务器,java,android,ssl,Java,Android,Ssl,我正在尝试在服务器和android客户端之间创建TLSV1.2通信。 我建立了一个TLS v1.0连接,但没有任何问题,但我无法获得v1.2。 这是服务器代码: char[] passphrase = "myComplexPass1".toCharArray(); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(new FileInputStream("cacerts"), pa

我正在尝试在服务器和android客户端之间创建TLSV1.2通信。 我建立了一个TLS v1.0连接,但没有任何问题,但我无法获得v1.2。 这是服务器代码:

char[] passphrase = "myComplexPass1".toCharArray();
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(new FileInputStream("cacerts"), passphrase);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keystore, passphrase);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
SSLContext sslContext.init(keyManagers, null, null);
SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
sslServerSocket.setEnabledProtocols(new String [] { "TLSv1", "TLSv1.1", "TLSv1.2" });
sslServerSocket.setUseClientMode(false);
sslServerSocket.setWantClientAuth(false);
sslServerSocket.setNeedClientAuth(false);
sslSocket = (SSLSocket)sslServerSocket.accept();
这是客户端代码:

char[] passphrase = "myComplexPass1".toCharArray();
KeyStore keystore = KeyStore.getInstance("BKS");
keystore.load(this.getApplicationContext().getResources().openRawResource(R.raw.jb), passphrase);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keystore, passphrase);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
Log.d("Context Protocol",sslContext.getProtocol());//this prints correctly TLS v1.2!
KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
TrustManager[] trustManagers = new TrustManager[]{
                    new X509TrustManager() {
                        public java.security.cert.X509Certificate[] getAcceptedIssuers()
                        {
                            return null;
                        }
                        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
                        {

                        }
                        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
                        {

                        }
                    }
            };
sslContext.init(keyManagers, trustManagers, new SecureRandom());
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) sslContext.getSocketFactory();
SSLSocket skt = (SSLSocket) sslSocketFactory.createSocket(HOST, PORT);
skt.setKeepAlive(true);
客户端代码是用运行在我的pc上的JRE7上的java客户端编写的,工作非常完美,我看到getProtocol(服务器端)TLSv1.2使用了正确的密码,并且得到了TLSv1.2的支持。 android上的相同代码创建tlsv1.0连接! 我真的不明白。 在Java客户端JRE7上工作,仅在android上使用tlsv1.0 有什么建议吗


这是我的第一个问题,我搜索了很多。可能我的格式不正确:(

回答这个有点晚,但可能其他人需要答案

我遇到了同样的问题。无论您是否为
SSLContext.init()
方法提供了TLSv1.2,我尝试过的一些Android版本都没有启用TLS 1.2。您必须使用
setEnabledProtocols()在客户端套接字上启用它
就像您对服务器套接字所做的那样。对我来说,我是在自定义的
SSLSocketFactory
中创建的:

public class MySSLSocketFactory extends SSLSocketFactory
                                throws NoSuchAlgorithmException {

    private SSLContext mSSLContext;

    public MySSLSocketFactory(KeyManager km) {
        ...
        mSSLContext = SSLContext.getInstance("TLSv1.2");
        ...
        mSSLContext.init(new KeyManager[] {km}, null, null);
        ...
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
                    throws IOException {
        SSLSocket s = (SSLSocket)mSSLContext.getSocketFactory().createSocket(socket, host, port, autoClose);
        s.setEnabledProtocols(new String[] {"TLSv1.2"} );
        return s;
    }

    ...
}

TLS 1.2在安卓4.1上可用。有关更多详细信息,请参阅。谢谢,但根据这一点,它应该得到支持。我正在运行安卓4.2.2。如果您能告诉我它是否适用于从2.3到JellyBean的安卓版本,那就太好了。从,TLS 1.2只支持API版本16+。这节省了我的时间。安卓d的方式有时很奇怪我喜欢这种东西,但是非常感谢。