TLS 扩展“服务器名称指示”(SNI):值在服务器端不可用

2023-12-12

基于 JSSE 示例,我尝试在服务器端获取 TLS 参数“服务器名称指示”(SNI) 的值 - 但没有成功。我确信该值是由客户端发送的,因为我使用了显示该值的网络嗅探器(Wireshark)。

但是当我使用以下代码片段时,服务器名称参数列表为空(同时显示“协议”):

public void connectionAccepted(Socket socket) 
{ 
  System.out.println("Connection accepted!"); 
  try { 
    /* get SNI parameter */ 
    SSLSocket sslSocket = (SSLSocket)socket; 
    SSLParameters sslParams = sslSocket.getSSLParameters(); 

    List<SNIServerName> serverNames = sslParams.getServerNames(); 
    for(SNIServerName item : serverNames){ 
      System.out.println("SNI: " + item.toString()); 
    } 

    String[] protocols = sslParams.getProtocols(); 
    for(String item : protocols) { 
      System.out.println("Protocols: " + item.toString()); 
    } 
  } catch (Exception e) { 
    e.printStackTrace(); 
  } 
} 

无论出于何种原因,Java SNI 实现显然不提供服务器端的实际主机名。相反,文档 [1](在“基于 SSLSocket 的虚拟服务器调度程序”下)建议手动解析初始 SSL 数据包并从中提取服务器名称。

您还可以使用 SNIMatcher [2] 来要求客户端提供特定名称;如果匹配器不匹配,则客户端会在 SSL 层收到错误。

[1] http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExamples [2] http://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SNIMatcher.html

Update:我编写了一个自定义 SNI 解析器,它的工作原理如下:客户端将 SNI 作为 SSL ClientHello 消息的一部分发送,这是作为建立 SSL 连接的一部分发送的第一条消息。我的实现首先对其进行解析,然后使用与请求的主机名匹配的正确服务器端证书设置 SSLEngine。

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

TLS 扩展“服务器名称指示”(SNI):值在服务器端不可用 的相关文章

  • openssl ciphers 命令将密码显示为 SSL 而不是 TLS

    我的应用程序出现 SSL 握手错误的问题 开发人员认为这是因为我们的服务器上的密码错误 他们尝试使用名为 TLS RSA WITH AES 256 CBC SHA 的密码 据我所知 该密码的 openssl 名称是 AES256 SHA 当
  • 如何在 Java 中验证从 Azure AD B2C 生成的 JWT 令牌?

    我正在寻找 Java 代码示例来验证 Azure AD B2C 令牌 我们可以使用哪些依赖项 所有 JWT 令牌的 JWT 令牌验证步骤或代码是否相同还是会有所不同 我们的项目中没有使用 Spring Security 有大量的图书馆her
  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • 将倒计时器从 10 秒改为 1 秒

    我有一个倒计时器 它以 1 秒的增量从 10000 毫秒倒计时到 0 毫秒 以使按钮在 10 秒后可单击 尽管计时器是准确的并且按照代码的说明执行操作 但我想更改秒的表示方式 但我不知道如何更改 java void startTimer c
  • Guice:当 FactoryBuilder 中提供合适的构造函数时,“找不到合适的构造函数”

    我使用 Guice 进行依赖注入 但收到此错误 1 Could not find a suitable constructor in java lang Void Classes must have either one and only
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • android.os.FileUriExposedException 在 Oreo 中引起(仅!)[重复]

    这个问题在这里已经有答案了 从 Google Play Console 中 我可以看到此异常仅发生在 Android 8 0 的设备上 android os FileUriExposedException at android os Str
  • 从 java 类生成 xsd 的实用程序

    我想为以下类生成 xsd public class Node private String value private List
  • Logback 配置在单行上有异常吗?

    我的日志被提取 传输并合并到 elasticsearch 中 多行事件很难跟踪和诊断 有没有办法使用收集器和正则表达式将异常行分组到单个记录中登录配置 https logback qos ch manual layouts html xTh
  • Java J文件选择器

    我希望能够控制外观JFileChooser 我特别想保存如何JFileChooser上次显示时显示 我想保存它是否在详细信息 列表视图中使用以及列表被排序的列 例如 大小或修改日期 我知道有很多关于JFileChooser但我一直没能找到我
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 我有什么理由应该嘲笑?

    我也是 Mockito 和 PowerMockito 的新手 我发现我无法使用纯 Mockito 测试静态方法 因此我需要使用 PowerMockito 对吗 我有一个非常简单的类 名为 Validate 使用这个非常简单的方法 publi
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • 如何在 Spring GCP 中订阅多个 Google PubSub 项目?

    我想在 Spring Boot 应用程序中订阅多个 Google Cloud PubSub 项目 阅读完相关问题后如何使用 Spring Cloud 在一个 Spring Boot 应用程序中连接 配置两个 pubsub gcp 项目 ht
  • 如何管理一个 JInternalFrame 调用另一个 JInternalFrame?

    我有一个带有此代码的 JDesktopPane public class Menu extends JFrame implements ActionListener Creates new form Portada public stati
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • 每次修改代码时都必须 mvn clean install

    我不是来自 Java 世界 但我必须为我的一个项目深入研究它 我不明白为什么每次修改或更新代码时 都必须 mvn clean install 来调试代码的最新版本 你知道为什么吗 尝试按Ctrl Shift F9 热插拔 有时会有所帮助

随机推荐

  • 将 CopyToDataTable 与“new {..}”LINQ 查询一起使用时出现异常

    从这段代码中 我可以按照我的预期调用 bmwCars CopyToDataTable var bmwCars from car in dataTable AsEnumerable where car Field
  • 如何将 ClientScript.RegisterClientScriptBlock 与内联代码一起使用?

    我有 aspx 页面 其中没有隐藏代码 服务器端代码写在带有 runat 服务器属性的标签内 如果我使用 ClientScript RegisterClientScriptBlock this GetType Email GetEmail
  • SQLite游标中moveToFirst()的用途是什么

    我是一个编程新手 我在互联网上找到了这段代码 它运行得很好 Cursor c db query DataBase TB NAME new String DataBase KEY ROWID DataBase KEY RATE DataBas
  • 如何将不常见格式的字符串转换为日期时间

    我使用的是 NET 3 5 并且有一个日期 该日期以字符串形式出现 格式如下 2009 年 1 月 20 日星期二 20 47 43 GMT 第一个问题 该格式的名称是什么 第二个问题 将此字符串转换为日期时间的最简单 最清晰的方法是什么
  • 如何在 iPad 上的 UIWebView 中上传文件?

    我正在开发一个 iPad 应用程序 我的应用程序的一个组件有一个 UIWebView 其网页有一个浏览按钮来上传文件 在本例中为照片 我知道应用程序无法访问文件系统 但我在 App Store 上看到过可以通过照片实现此功能的应用程序 其中
  • 视图的边框纹理

    有没有办法设置边框纹理LinearLayout或任何其他View 由于屏幕尺寸不同 我不能只将图像设置为背景 这是我正在讨论的纹理示例 我尝试使用九片 但它拉伸了应该重复的白线 Draw 9 patch 工具的截图 您可以使用shape像这
  • PackageInfo LoadLabel 性能缓慢

    我正在为 Android 编写一个应用程序 其中获取应用程序的标签 实际名称 非常慢 特别是这段代码的性能非常糟糕 packageInfo loadLabel pm 只是为了给您一些指标 在安装了 400 个应用程序的 Android 设备
  • NES(6502组装)精灵动作

    我目前正在开发 NES 6502 组装游戏 但我不明白如何使精灵移动 我认为它应该是这样工作的 loop LDA 200 will load into the A register the content of address 200 wi
  • IntelliJ:使用 docker jvm 还是 docker maven?

    我有一个 docker jvm 实例 我从命令行使用它来编译和运行 java 代码 IntelliJ 的项目配置要求我指向文件系统上的 jvm 所以 我想知道 我可以配置intellij来使用这个docker容器吗 我想我可以配置一个 do
  • Socket.io 客户端:用一个处理程序响应所有事件?

    是否可以让 socket io 客户端响应所有事件 而无需单独指定每个事件 例如 像这样的东西 显然现在不起作用 var socket io connect http myserver socket on function listen t
  • 为什么 C++ 中析构函数运行两次?

    在做编程作业时 我似乎在基本的 C 概念上遇到了困难 我在程序中发现了该错误 这是由于我的析构函数运行次数超出了我的预期造成的 这是一个代码示例 演示了我做错了什么 直到最基本的部分 include
  • 添加/提交文件到所有分支

    假设我在一个分支上并且索引是脏的 我对文件 x 进行了更改 并且还进行了一些其他更改 有没有办法将文件 x 添加到所有现有分支 像这样的东西 usr bin env bash current branch git rev parse abb
  • 复杂的 git rebase 操作

    看着git rebase手册页 我没有看到任何看起来像我想要的图表 除了有些图表似乎做了与我想要的相反的事情 并且玩弄 onto也没有得到我想要的 让我看看是否可以画出像图中那样的图表git rebase手册页 左侧的竖线是为了使 Mark
  • 如何使用 python 访问 Azure AD 组和用户详细信息?

    params urllib urlencode Specify values for the following required parameters api version 1 5 tenant id vvvvvvvvXXXXXX he
  • Java 中的调度异常

    我正在开发一个任务 需要从给定的 URL 下载文件 其中一个要求是它可以处理网络故障和异常 在我的实现中 我有一个 DonwloadManager 为每个 URL 分配一个线程 以免阻塞 问题是我不确定如何通过代码模拟失败和异常 我尝试使用
  • 如何为 Cydia 和越狱的 iPhone 开发应用程序

    我开始为 iPhone 开发应用程序 我想开发一个特定的应用程序 但苹果肯定会拒绝它 所以我想为 Cydia 开发它 因为我认为它很有用 我试图弄清楚如何使用 Theos 和 XCode 来创建我的应用程序 但我什么都不懂 如果你们中的一些
  • Rails 基于对象的权限/授权引擎?

    我想在我的应用程序中添加 共享文档 功能 就像在谷歌文档服务中一样 据我所知 用户可以 可以列出 查看 创建 编辑 删除自己的文档 与所有人共享自己的文档 它是公共文档 将自己的文档共享给具有只读访问权限的其他用户 将自己的文档共享给具有读
  • 如何从 JSON 对象中删除包装器?

    我有一个带有包装器的 JSON 对象 其中包含有关它来自的服务的信息 在解析我真正关心的对象之前 我想去掉包装器 然后只解析该对象 我如何转换这个 JSON 对象 object id object 1 description Black o
  • 有没有API可以同时获取后置和前置摄像头视图? [复制]

    这个问题在这里已经有答案了 我需要在一个显示器上显示后置摄像头和前置摄像头 是否可以同时显示两者 有没有可以同时获取两个视图的API 与单相机相同 只是双相机 两个 SurfaceHolder 和两个 Camera 实例 http deve
  • TLS 扩展“服务器名称指示”(SNI):值在服务器端不可用

    基于 JSSE 示例 我尝试在服务器端获取 TLS 参数 服务器名称指示 SNI 的值 但没有成功 我确信该值是由客户端发送的 因为我使用了显示该值的网络嗅探器 Wireshark 但是当我使用以下代码片段时 服务器名称参数列表为空 同时显