如何在 Java 中启用客户端 TLS 会话重用 [重复]

2024-02-11

我有一个 Java 客户端,它可能会创建到同一服务器的多个会话。 TLS 协议具有缓存会话密钥的功能,从而避免对每个连接进行昂贵的 PKI 处理。但我无法让它真正发挥作用。

openssl s_client -reconnect -state -prexit -connect localhost:1234 报告服务器具有“重用,TLSv1/SSLv3,密码是 ECDHE-RSA-AES256-SHA384”,以及相同的主密钥。

数据流是二进制的,不是HTTP封装的。

我使用的代码(大约)如下。它有效,但没有会话重用。

    initSSLContext(keyStore, "password", trustStore, "PKIX", "TLSv1");

While (true) {

    connect(); 

    byte[] encode1 = { 0x42, 0, 0, 0, 0, 0, 0, 0, 0, };
    outs.write(encode1);
    byte[] ttlbuf = new byte[10000];
    int len = ins.read(ttlbuf, 0, ttlbuf.length);
    StringBuilder sb = new StringBuilder();
    socket.close();
}

private void initSSLContext(KeyStore keyStore, String keyStorePwd, KeyStore trustStore,
        String sslTrustManagerAlg, String sslProtocol) throws Exception {
    KeyManager[] keyManagers = null;

    if ( keyStore != null && keyStorePwd != null ) {
        KeyManagerFactory kmf = 
           KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, keyStorePwd.toCharArray());
        keyManagers = kmf.getKeyManagers();
    }

    TrustManager[] trustManagers = null;
    if ( trustStore != null ) {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(sslTrustManagerAlg);
        tmf.init(trustStore);
        trustManagers = tmf.getTrustManagers();
    }

    ctx = SSLContext.getInstance(sslProtocol);
    ctx.init(keyManagers, trustManagers, null);

    factory = ctx.getSocketFactory();
}

private void connect() throws IOException {
    socket = (SSLSocket) factory.createSocket(host, port);
    socket.setSoTimeout(30000);
    // ensure first ClientHello is TLSv1 rather than SSLv2
    socket.setEnabledProtocols(new String[] { "TLSv1" });
    socket.setEnabledCipherSuites(DEFAULT_SSL_CIPHER_SUITES);
    localHost = socket.getLocalAddress().getHostAddress();
    localPort = socket.getLocalPort();
    ins = socket.getInputStream();
    outs = socket.getOutputStream();
 }

问题是任何致命警报都会终止会话恢复。因此,读取超过一个流的末尾会杀死后续的重用。这里还有更多

关闭连接后 Java TLS 会话重用 https://stackoverflow.com/questions/37425891/java-tls-session-reuse-after-closed-connection

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java 中启用客户端 TLS 会话重用 [重复] 的相关文章

随机推荐

  • Java 中的时间对象是什么?

    我在探索TemporalQuery http docs oracle com javase 8 docs api java time temporal TemporalQuery html and TemporalAccessor http
  • 如何在 Eclipse 中运行 Java 9 主类而不编辑启动配置?

    我在 Eclipse Oxygen 1a Release 4 7 1a 的 Maven 项目中创建了一个简单的 Hello World 主类和一个 module info java 文件 运行在 Java 9 0 1 上 当我尝试右键单击启
  • 如何将mysql数据库中的表导出到excel?

    我在 mysql 中有一个表 该表非常大 有超过 100k 行 我想将其导出到 Excel 但是 我尝试了 phpmyadmin 上的导出到 excel 功能 但转储 excel 文件需要很长时间 这甚至不是倾销 错误始终是 连接已重置 有
  • 是否有基于终端及其祖先映射递归数据类型的名称?

    假设我有一个如下所示的类型 data Term a Terminal a Application Term a Term a Abstraction String Term a 现在 我想绘制地图Term a to Term b 理想情况下
  • 如何在 Emacs 中检查 Python 代码的语法而不实际执行它?

    Python 的 IDLE 有 检查模块 Alt X 来检查语法 无需运行代码即可调用该语法 在 Emacs 中是否有等效的方法来执行此操作 而不是运行和执行代码 python m py compile script py
  • Java N/IO 中的行分隔符?

    使用以下命令写入 txt 文件时如何插入新行java nio file 以下代码生成一个只有一行的txt文件ABCDEF 而不是两条单独的线ABC and DEF public static void main String args th
  • Python Spark从数据框中提取字符

    我在 Spark 中有一个数据框 如下所示 ID Column 1 STRINGOFLETTERS 2 SOMEOTHERCHARACTERS 3 ANOTHERSTRING 4 EXAMPLEEXAMPLE 我想做的是从列中提取前 5 个
  • 通过虚拟盒提供的 ember-cli 违反了内容安全策略

    我有一个新鲜的ember cli v 0 1 2应用 我在虚拟框中提供 ember 并通过仅主机配置的网络适配器从主机访问网页 地址为192 168 56 102 当我跑步时ember serve从虚拟盒子中访问192 168 56 102
  • Grabwidget 即使放大也能获取完整视图

    我在用QPixmap QPixmap grabWidget QWidget widget int x 0 int y 0 int width 1 int height 1 抓住视口QPixmap object 在某些情况下 即使屏幕放大到一
  • 为什么如果类的成员是引用,则复制对象是非法的?

    我遇到一个测验 指出下面第 18 行中的代码格式不正确 因为 当需要复制的成员之一是引用时 使用隐式定义的赋值运算符是格式不正确的 我无法理解这一点 为什么无法复制引用 为什么16号线是合法的 第 16 行与第 18 行非常相似 复制构造函
  • Socket.io 中的身份验证

    我将尝试验证 socket io 上的连接 目前 用户首先通过 REST API 进行身份验证 然后 我向用户发送JsonWebToken与经过身份验证的用户的用户名 打开客户端和服务器之间的连接后 我的计划是暂时从已连接套接字列表中删除该
  • GEKKO:不响应约束也不求解 obj 函数

    以下是与这个问题相关的内容 使用 Gekko 的 MPC 和 ARX 模型 https stackoverflow com questions 63727310 mpc with arx model using gekko 63731362
  • WPF 中的多行组合框

    我试图找到 WPF 的多行用户可编辑组合框的示例 我们已经使用自定义模板尝试了各种方法 但无法使其工作 我们试图解决的具体问题是在下拉列表中显示地址列表 用户可以同时输入新地址 在组合框中输入内容没有问题 但多行却让我们丧命 如果我们想在
  • 如何绘制不在道路上的路线,MKMapView

    所以我一直在尝试使用 MKMapView 和叠加层来创建 不在道路上的道路 这可能听起来很奇怪 但我想做的是 在我的 iOS 应用程序中 我想绘制特定酒店提供的短途旅行路线 但是到目前为止我发现的所有帖子都集中在现有道路上 因为短途旅行会经
  • “外部 IP 地址”和“公共 IP 地址”这两个术语是同义词吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 外部IP地址与公共IP地址以及内部I
  • 使用 for in 循环使类可迭代?

    我有一个自定义类 class MyArrayClass 该类是一个自定义列表实现 我想做以下事情 var arr MyArrayClass MyArrayClass arr append first arr append second ar
  • 解释图像的`srcset`中的`w`

    据我了解 srcset用于根据以下内容确定要加载的图像dpi设备的 我在 Google Web Fundamentals 上看到了这个例子 它似乎使用了w单位连同vw单位恰好是视口宽度的 1 img src lighthouse 200 j
  • Eclipse IDE 中的 C++ 错误“nullptr 未在此范围内声明”

    我正在运行 Eclipse Helios 并且安装了 g 4 6 希望我没有错 g 4 6 实现了 C 11 功能 我创建了一个使用 nullptr 和 auto 关键字的 C 项目 构建出现以下错误 filename cpp 13 13
  • 如何在 Brackets 中设置 jslint ES6 指令?

    我收到此错误 需要一个标识符 但看到的是 const 我正在使用括号文本编辑器 我找到了这个答案 您需要指定 es6 指令 请参阅 JSLint 帮助 但我不知道如何在括号中指定 es6 指令 这是我的代码 const singleQuot
  • 如何在 Java 中启用客户端 TLS 会话重用 [重复]

    这个问题在这里已经有答案了 我有一个 Java 客户端 它可能会创建到同一服务器的多个会话 TLS 协议具有缓存会话密钥的功能 从而避免对每个连接进行昂贵的 PKI 处理 但我无法让它真正发挥作用 openssl s client reco