使用 SSLEngine (JSSE) 与旧客户端进行 SSL 握手

2023-11-30

这是“的后续问题”使用自签名证书和 SSLEngine (JSSE) 进行 SSL 握手".

我已经实现了一个 NIO Web 服务器,可以在同一端口上处理 SSL 和非 SSL 消息。为了区分 SSL 和非 SSL 消息,我检查入站请求的第一个字节以查看它是否是 SSL/TLS 消息。例子:

byte a = read(buf);
if (totalBytesRead==1 && (a>19 && a<25)){
    parseTLS(buf);
}

在 parseTLS() 方法中,我实例化 SSLEngine、启动握手、包装/解开消息等。对于大多数现代 Web 浏览器(Firefox 10、IE 9、Safari 5 等)来说,一切似乎都工作正常。

问题是,像 IE 6 这样的旧版 Web 浏览器和像 Java 的 URLConnection 类这样的库似乎以不同的方式启动 SSL/TLS 握手。例如,IE 6 的前几个字节看起来像这样(十六进制值):

80 4F 01 03 00 ...

如果我将消息传递给 SSLEngine,它似乎无法识别该消息并引发异常。

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0

那么 IE 6 和 Java 的 URLConnection 类到底发送了什么?这是 JSSE SSLEngine 可以支持的有效 SSL/TLS 消息吗?我是否需要进行一些预处理或与客户端协商才能发送不同的消息?

提前致谢!

UPDATE

感谢 Bruno 和 EJP 以及一些进一步的调试,我对正在发生的事情有了更好的理解。正如 Bruno 正确指出的那样,IE6 和 Java 6 客户端通过 SSLv2 ClientHello 发送。与我之前的评论之一相反,Java 1.6 中的 SSLEngine 实际上可以解包 SSLv2 消息并生成有效的响应以发送回客户端。我之前报告的 SSLException 是我这边的一个错误,与 SSLEngine 无关(我错误地认为客户端已完成发送数据,当 SSLEngine 期望打开更多数据时,我最终得到了一个空的 ByteBuffer)。


这看起来像SSLv2 Client Hello(请参阅 TLS 规范):

支持 SSL 版本 2.0 服务器的 TLS 1.1 客户端必须发送 SSL 2.0 版客户端问候消息 [SSL2]。 TLS 服务器应该接受 如果他们希望支持 SSL 2.0 客户端,则可以使用客户端问候格式 相同的连接端口。与 2.0 版本唯一的差异 规范是指定版本的能力,其值为 三以及 CipherSpec 中对更多加密类型的支持。

  • 80 4F是长度,高位必须设置为 1(参见msg_length描述).
  • 01是消息类型(Client Hello)
  • 03 00是支持的最高版本(此处为 SSLv3)

从 Java 7 开始,现在默认禁用此功能.

EDIT:

澄清一下,这并不是真正的 SSLv2 Client Hello,这是 SSLv2 格式的 SSLv3 的 Client Hello。在这种情况下,服务器将回复(正确的)SSLv3 Server Hello(对应于03 00请求的版本号)。这同样适用于 TLS 1.0、1.1 和 1.2,尽管这种格式的使用已逐渐被弃用。

JSSE 7SSLServerSocket仍会理解此类客户端问候并使用 SSLv3/TLS1.x 服务器问候进行适当回复。

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

使用 SSLEngine (JSSE) 与旧客户端进行 SSL 握手 的相关文章

  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 我可以使用子接口重新编译公共 API 并保持二进制兼容性吗?

    我有一个公共 API 在多个项目中多次使用 public interface Process
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi

随机推荐

  • 受保护的静态方法可见性

    考虑这种情况 请注意 为了简洁起见 类型和方法体已被省略 当我需要这样做时 这可以让我连接到数据 public abstract class DatabaseAccessor protected static object GetDataF
  • Perl 代码分析工具

    我需要测试 Perl 应用程序 文件操作 数据库操作等 我正在寻找 Perl 代码的配置工具 Linux 中是否有类似 gprof 的 Perl 代码分析工具 有些人可能建议使用 Devel DProf 作为最标准的方法 但如果你仔细观察
  • 仅当用户不在另一个表中时才从一个表中选择用户

    我们有两张表 用户 id name borrower 1 Peter 1 2 John 1 3 Mark 1 4 David 0 贷款 id from to amount 1 1 2 100 我需要输出 Peter 没有借过任何钱并且借款人
  • 运行带有太多空格的程序

    我有一个在命令提示符下运行良好的命令 CMD C C Program Files x86 VideoLAN VLC VLC vvv http www foo com 8085 video mp4 playlist m3u8 wmsAuthS
  • 如何递归遍历目录树并仅查找文件?

    我正在研究一个scp调用以下载远程系统上存在的文件夹 下载的文件夹有子文件夹 在这些子文件夹中有一堆文件 我想将它们作为参数传递给 python 脚本 如下所示 scp r email protected SomeName SomeName
  • 如果有新版本可用,如何强制更新 Android 应用程序?

    我正在开发一个应用程序 如果游戏商店上有新版本 我想向应用程序用户强制更新 该应用程序应该向用户显示一条对话框消息 public class ForceUpdateAsync extends AsyncTask
  • 选择套接字输出接口:SO_BINDTODEVICE 与连接前绑定

    我正在尝试在具有两个接口的系统上设置套接字的输出接口 我用谷歌搜索了很多 发现了不同的答案 有人说我可以bind调用之前的套接字connect选择一个特定的接口 如套接字如何知道要使用哪个网络接口控制器 但其他人说这还不够 如http co
  • 如何使用弹性框重新排序 div?

    我试图为我的 DOM 保持 seo 友好和语义结构 而不重复整个元素以在不同位置显示它们 我的布局基于display flex项目 我尝试实现以下目标 需要了解的重要事项 我不想根据窗口宽度显示 隐藏 div 以避免不必要的重复 所有 di
  • 移动时修改 SKNode 的属性

    我有一个 SKNode 的子类 它充当我的 生物 它们使用 SKActions 自动在场景中移动 我有兴趣在生物移动时修改 减少 能量 属性 Int 不保证生物能够移动 SKAction 的整个长度 它可以被中断 因此计算总距离然后在它开始
  • NetBeans 的启动屏幕功能如何工作?

    NetBeans 新手 刚刚注意到文件 gt gt 项目属性 gt gt 应用程序对话框有一个标记为的文本字段启动画面它允许您指定程序启动时要显示的图像的路径 我想自定义启动屏幕的工作方式 添加进度条等 并且想从头开始编写代码 但不知道从哪
  • 如何更改闪亮的应用程序数据表输出字体颜色和辅助表元素颜色?

    我正在使用深色主题 闪亮主题中的石板 创建一个闪亮的应用程序 但是当我应用该主题时 我的 renderDataTable 输出存在两个问题 应用程序背景太暗 看不到表格外的元素 显示 XX 条目 底部页码等 表中的文字太浅 难以阅读 对于问
  • Django 使用 AJAX 在模板中渲染模板

    我的网站目前在自己的页面上呈现表单 我正在尝试让它们在我的主页上的侧边栏 div 标签内呈现 但是 我不知道如何塑造 JavaScript 和 或视图 因此我取回表单模板的 HTML 并将其插入到 div 标记中 UPDATE 我在控制台中
  • 如何使用 HSSF (Apache POI) 在现有 Excel 中的两行之间插入一行

    不知何故 我设法在现有 Excel 文件中的两行之间创建新行 问题是 一些格式没有包含在行的移动中 其中之一是隐藏的行在轮班期间没有相对地进行 我的意思是 例如 第 20 到 30 行被隐藏 但是当创建新行时 格式仍然存在 在插入 创建新行
  • Javascript 多个键具有相同的值 - 它们是否指向同一个地方?

    我有以下简化代码 var obj key1 aliases alias1 alias2 prop1 someVal prop2 someOtherVal var objHashMap for var key in obj objHashMa
  • 在 2D 列表中查找值的 Pythonic 方法? [复制]

    这个问题在这里已经有答案了 使用 numpy 数组 您可以使用切片检查特定列 即array 0 对于列表 检查 2D 元素是否在内部非常简单 one two in some list 然而 只是看看是否 one 存在需要迭代元素 即 one
  • pandas 基于独特的价值观和标准

    我有这个数据框 df in pd DataFrame id 123 123 123 123 123 456 ven group a a a b f f date 1 1 21 2 1 21 3 1 21 1 1 21 1 1 21 1 1
  • 输入数组而不知道其大小

    有没有一种方法可以在 Java 中创建一个数组 而无需先定义或询问其长度 又名用户输入一些数字作为参数 程序创建一个包含这么多参数的数组 有没有一种方法可以在java中创建一个数组 而无需先定义或询问它的长度 又名用户输入一些数字作为参数
  • 如何编写降序排序键函数?

    最近版本的 Python 中传递一个key功能为sort 从上一个cmp函数使我对某些对象执行复杂的排序变得更加困难 例如 我想使用一组字符串决胜字段对一组对象从最新到最旧进行排序 所以我希望日期按相反顺序排列 但字符串按自然顺序排列 使用
  • 如何在 symfony 4 中公开 LoggerInterface 服务

    我希望有Psr Log LoggerInterface在 symfony 中 public 以便能够直接从容器中获取它 container gt get Psr Log LoggerInterface 我尝试了以下方法services ya
  • 使用 SSLEngine (JSSE) 与旧客户端进行 SSL 握手

    这是 的后续问题 使用自签名证书和 SSLEngine JSSE 进行 SSL 握手 我已经实现了一个 NIO Web 服务器 可以在同一端口上处理 SSL 和非 SSL 消息 为了区分 SSL 和非 SSL 消息 我检查入站请求的第一个字