当前位置: 首页 > 知识库问答 >
问题:

tls在android中使用会话票证

方河
2023-03-14

首先,我想在android中使用会话票证,我的代码如下:String keyStoreType=keystore.getDefaultType();KeyStore KeyStore=KeyStore.getinstance(keyStoreType);Load(null,null);

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    SSLContext cpmContext = SSLContext.getInstance("TLSv1.2");
    cpmContext.init(null, null, null);
    SSLSocket socket = (SSLSocket) cpmContext.getSocketFactory().createSocket(ip, port);
    socket.setEnabledProtocols(socket.getEnabledProtocols());
    socket.setEnabledCipherSuites(socket.getEnabledCipherSuites());
    Class c = socket.getClass();
    try {
        Method m = c.getMethod("setUseSessionTickets",boolean.class);
        m.invoke(socket,true);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    SSLSession session = socket.getSession();

我通过tcpdump捕获数据blcok,代码可以得到“TLSV1.2 224新会话票证,更改密码规范,你好请求,你好请求”,所以我想我得到了会话票证,但是当我重新连接到服务器时,客户端Hello的“会话票证”内容如下:“extension:SessionTicket TLS类型:SessionTicket TLS(0x0023)长度:0 data:(0 bytes)”它没有执行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);
    }
}

这段代码甚至不启用session,tls的版本总是TLSV1.0,谁能告诉我如何启用它并将tls的版本设置为TLSV1.2?PS:我在Android4.4和L上测试了它

共有1个答案

翟弘
2023-03-14

Android的SSLCertificateSocketFactory在一些/许多设备上已经被打破。它不提供接口/方法来指定启用的协议。相反,它只是使用EnabledProtocols的系统默认值。在早期的Android设备上,应该是TLS和SSL3,而不是TLSV1.2。

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

不幸的是,SSLCertificateSocketFactory的其他一些特性也丢失了。例如,如果没有它,就不能“正式”启用SNI或设置alpns协议。

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

 类似资料:
  • 问题内容: 我需要帮助来了解Web应用程序的会话概念。我正在使用Express 3.0运行Node.js服务器。 我的目标是: 为每个登录的用户创建一个会话 存储此会话,并将其用于验证用户是否已登录(防止同时使用同一用户的两个设备)并限制对某些页面的访问(通过将会话ID与其他数据匹配) 我将使用MemoryStore保存会话(似乎最简单)。如果上述目标有意义,您能否提供有关如何实现这些目标的详尽解

  • 但这不起作用,当我进入“loginriuscito.jsp”时,我只看到“welcome:”

  • 尝试实现TLS 1.2与TLS 1.3握手测量,重点是会话恢复。 TLS 1.2运行得非常好,ID和票证恢复,但当更改为TLS 1.3时,情况并非如此。 不幸的是,wireshark数据是加密的,但java声明如下: 我们并不试图实现0RTT恢复,而是使用SessionTickets。客户端不会向服务器发送PresharedKey。 代码(客户端): 服务器: 提前感谢:)

  • 我试图在我的自定义服务中使用会话变量。 我已经设置添加以下行services.yaml 我的会期考试是这样的 并收到此错误:函数App\Services\SessionTest的参数太少::_construct(),在第33行的/var/www/App.dev/src/Controller/OrdersController.php中传递了0,预期正好是1

  • 中描述的声明性基和ORM映射函数 映射器配置 是ORM的主要配置接口。配置映射后,持久性操作的主要使用接口是 Session . 会话基础 会议的作用是什么? 使用会话的基础知识 打开和关闭会话 构建begin/commit/rollback块 使用sessionmaker 查询(1.x样式) 查询(2.0样式) 添加新项目或现有项目 删除 冲洗 过期/刷新 使用任意WHERE子句更新和删除 自动

  • 问题内容: 我刚刚完成了在PHP中创建整个登录和注册systsem的操作,但是我的问题是我还没有使用任何会话。我是PHP的新手,以前从未使用过会话。我想做的是,在用户注册并填写登录表单后,他们仍将停留在同一页面上。因此,其中一部分将是会话已登录,另一部分将是其他(用户未登录,请显示登录表单)。谁能告诉我如何开始? 问题答案: 希望这可以帮助 :) 开始会话,您需要在页面顶部或在调用会话代码之前说出