tls在android中使用会话票证

tls在android中使用会话票证,android,ssl,Android,Ssl,首先,, 我想在android中使用会话票证,我的代码如下: 字符串keyStoreType=KeyStore.getDefaultType(); KeyStore KeyStore=KeyStore.getInstance(keyStoreType); load(null,null) 我通过tcpdump捕获数据blcok,代码可以 TLSv1.2 224新会话票证,更改密码规范,Hello请求,Hello请求“ ,所以我想我得到了会话票证,但是当我重新连接到服务器时,客户端hello的“会话

首先,, 我想在android中使用会话票证,我的代码如下: 字符串keyStoreType=KeyStore.getDefaultType(); KeyStore KeyStore=KeyStore.getInstance(keyStoreType); load(null,null)

我通过tcpdump捕获数据blcok,代码可以 TLSv1.2 224新会话票证,更改密码规范,Hello请求,Hello请求“ ,所以我想我得到了会话票证,但是当我重新连接到服务器时,客户端hello的“会话票证”内容如下: “扩展名:sessionTicket TLS 类型:SessionTicket TLS(0x0023) 长度:0 数据:(0字节)” 它没有执行resume

然后我使用SSLCertificateSocketFactory创建SSLSocket:

private Socket createSocketOnLine(final String ip, final int port) throws UnknownHostException, IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, KeyManagementException {
    SSLCertificateSocketFactory sf = (SSLCertificateSocketFactory) SSLCertificateSocketFactory
            .getDefault(30 * 1000);
    SSLSocket socket = (SSLSocket) sf.createSocket(ip, port);
    socket.setEnabledProtocols(socket.getEnabledProtocols());
    socket.setEnabledCipherSuites(socket.getEnabledCipherSuites());
    enableSessionTicket(sf, socket);
    SSLSession session = socket.getSession();
    return socket;
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public void enableSessionTicket(SSLCertificateSocketFactory sf, Socket socket) {
    if (VERSION.SDK_INT > 17) {
        sf.setUseSessionTickets(socket, true);
    }
}
这段代码甚至不启用会话,tls的版本始终是TLSv1.0,谁能告诉我如何启用它并将tls的版本设置为TLSv1.2?
PS:我在android 4.4和L上测试了它,android的SSLCertificateSocketFactory在一些/许多设备上都被破坏了。它不提供用于指定已启用协议的接口/方法。相反,它只是使用EnabledProtocol的系统默认值。在早期的Android设备上,这将是TLS和SSL3,而不是TLSv1.2

由于它的实现方式,您不能将其子类化并尝试重写其行为。您无法设置所需的TLS协议,更不用说设置可能需要控制的密码套件了

不幸的是,SSLCertificateSocketFactory的一些其他功能也丢失了。例如,没有SNI,您无法启用SNI或“正式”设置alpns协议


因此,您的解决方案需要子类SSLSocketFactory来提供您自己的socketfactory来控制您需要的设置,就像您在第一个代码示例中所做的那样。您可以使用上面的反射技巧在您自己的createSocket()方法实现中启用会话票证。

Android的SSLCertificateSocketFactory在某些/许多设备上为您提供了中断。它不提供用于指定已启用协议的接口/方法。相反,它只是使用EnabledProtocol的系统默认值。在早期的Android设备上,这将是TLS和SSL3,而不是TLSv1.2

由于它的实现方式,您不能将其子类化并尝试重写其行为。您无法设置所需的TLS协议,更不用说设置可能需要控制的密码套件了

不幸的是,SSLCertificateSocketFactory的一些其他功能也丢失了。例如,没有SNI,您无法启用SNI或“正式”设置alpns协议

因此,您的解决方案需要子类SSLSocketFactory来提供您自己的socketfactory来控制您需要的设置,就像您在第一个代码示例中所做的那样。您可以使用上面的反射技巧在自己的createSocket()方法实现中启用会话票证

private Socket createSocketOnLine(final String ip, final int port) throws UnknownHostException, IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, KeyManagementException {
    SSLCertificateSocketFactory sf = (SSLCertificateSocketFactory) SSLCertificateSocketFactory
            .getDefault(30 * 1000);
    SSLSocket socket = (SSLSocket) sf.createSocket(ip, port);
    socket.setEnabledProtocols(socket.getEnabledProtocols());
    socket.setEnabledCipherSuites(socket.getEnabledCipherSuites());
    enableSessionTicket(sf, socket);
    SSLSession session = socket.getSession();
    return socket;
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public void enableSessionTicket(SSLCertificateSocketFactory sf, Socket socket) {
    if (VERSION.SDK_INT > 17) {
        sf.setUseSessionTickets(socket, true);
    }
}