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

尽管Netty 4.1.36和jdk 11中的证书不正确,但握手成功

冉永宁
2023-03-14

我有客户端和服务器配置使用TLS和自签名证书。

客户端SSL引擎配置为使用虚拟信任管理器,该管理器从不抛出CertificateException和空KeyManager数组。

服务器SSL引擎使用由手动生成的密钥存储文件初始化的密钥存储。

当我用JDK 8运行它时,我得到以下握手结果:

  • 服务器无法验证证书

这是预期的行为。

当我使用JDK 11运行它时,我得到以下结果:

  • 服务器失败与相同的错误(空证书链),但在客户端线程我看到以下:
  • io.netty.handler.ssl.SslHandler#setHandshake成功被称为first
  • io.netty.handler.ssl.SslHandler#setHandshakeFailure
  • 之后调用

我是TLS 1.3的新手,可能会在配置中错过一些东西。同时留档说java TLS API客户端切换到TLS 1.3没有什么需要更新的。

这种行为令人困惑,它进一步破坏了基于握手协议的逻辑。

可以通过gist link获得重现该问题的完整代码:https://gist.github.com/kiturutin/ccb710f67ccfb0a7a7de1fb3b3099b60

这是一个很棒的脚本,它首先启动服务器,然后启动客户端。


共有1个答案

皇甫伟彦
2023-03-14

明确地说,您的服务器请求客户端认证,并且客户端证书的服务器验证失败,因为客户端配置没有密钥管理器,因此没有发送证书?(然而,服务器发送了自己的“手册”证书,客户端因为虚拟信任管理器而接受了它。)

如果是这样的话,这看起来像是码头的一个类似问题(?)请参阅中的第五篇文章https://github.com/eclipse/jetty.project/issues/2711--在我看来,这是因为TLS 1.3客户端在发送时认为握手已完成(因为1.3将服务器移到第一个航班),而这是在收到客户端身份验证失败的服务器警报之前。(而在1.2及更早版本中,服务器完成了,可能是票证基本上是第二次飞行,导致客户端第一个应用程序协议(如HTTP)的额外RTT。)

如果使用,它也是在接收服务器NewSessionTicket(针对1.3“恢复”进行了修改)之前;请参阅OpenJDK 11问题-客户端在上次展开之前完成握手。

我想对于1.3来说,您必须在“成功”之后接受“失败”,除非Java人员能够想出一些真正聪明的解决方案。

 类似资料:
  • 假设我有一个JAVA客户端应用程序,它试图通过https连接到服务器(example.com)。客户端应用程序有一个信任存储JKS,它有服务器的证书和其他一些证书。在服务器将其证书发送到此客户端应用程序的握手过程中,如何从信任存储jks中提取正确的证书。i、 基于什么参数,java将服务器发送的证书与存储在JKS中的证书相匹配。

  • 我被困在如何修复这个SSL错误上—— 我的SSL证书在Chrome上运行良好,但在Safari和Firefox上,如果我去www.domain.com而不是domain.com,就会出现主机名不匹配的错误 我已经使用Certbot为我的domain.com和www.domain.com域设置了SSL证书 当我在nginx上检查以确保证书存在时,我运行< code>sudo certbot - ng

  • 以下脚本适用于: 我从Dwolla的支付API得到了预期的响应。为了使脚本更具动态性,我尝试将其更改为引用托管我希望信任的证书的目录。因此,我将最后一个选项()更改为: 但是,这会中断脚本,并且不会建立连接;错误是: SSL证书问题:无法获取本地颁发者证书 我知道目录是正确的,证书文件是有效的,因为原始脚本引用了同一目录中的证书。我希望扫描目录中的文件并找到它需要的证书,但这没有发生。为什么会这样

  • 我的媒体对象不想实例化,我有所有正确导入的jar文件,包括JavaFX,这样我可以播放mp3文件。 我有导入的包: 但是它仍然不能运行。任何建议都将不胜感激,因为我已经谷歌了几天关于媒体和插件的一切:(

  • 我正在使用Python的套接字来响应Websocket请求,并且我面临着头的问题。以前可能有过类似的问题,但没有人为我工作 文档位于https://developer.mozilla.org声明对于要建立的连接: 服务器获取握手请求中发送的Sec-WebSocket-Key的值,追加258EAFA5-E914-47DA-95CA-C5AB0DC85B11,获取新值的SHA-1,然后对其进行Bas6

  • 问题内容: 我的任务是实现一个定制/独立的Java Web服务器,该服务器可以在同一端口上处理SSL和非SSL消息。 我已经实现了NIO服务器,并且对于非SSL请求,它可以很好地工作。我在SSL方面花了很长时间,可以真正使用一些指导。 到目前为止,这是我所做的。 为了区分SSL消息和非SSL消息,我检查了入站请求的第一个字节,看看它是否是SSL / TLS消息。例: 在parseTLS()方法中,