扩展server_name(SNI扩展)不与jdk1.8.0一起发送,但与jdk1.7.0一起发送

2023-11-30

我已经使用 ApacheCXF (v3.0.4) 实现了 JAX-WS 客户端,一切正常,但当我想使用 java 8 (jdk1.8.0_25) 的安全连接 (SSL/TLS) 时,问题就出现了。

我在日志中看到以下异常(-Djavax.net.debug=all):

main, handling exception: java.net.SocketException: Connection reset
main, SEND TLSv1.2 ALERT:  fatal, description =    unexpected_message
main, WRITE: TLSv1.2 Alert, length = 2
main, Exception sending alert: java.net.SocketException: Connection reset by peer: socket write error

经过深度分析后,我发现问题是由于 Java 8 中未发送 server_name (SNI) 而引起的,但在 Java 7 中它已发送并且 Web 服务调用成功运行。

Java 8 日志(-Djavax.net.debug=all):缺少“扩展服务器名称”

[...]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA
***
[...]

Java 7 日志(-Djavax.net.debug=all)(有效):“扩展服务器名称”已设置

[...]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA
Extension server_name, server_name: [host_name: testeo.hostname.es]
***
[...]

据观察,在 Java 7 中扩展服务器名,服务器名:[主机名:testeo.hostname.es]设置后,Web 服务调用就会成功。

为什么 Java 8 没有像 Java 7 那样设置 server_name ?是Java配置问题吗?


如前所述,原因与 JDK 错误有关,其中使用 setHostnameVerifier() 会破坏 SNI(扩展服务器名称)。https://bugs.openjdk.java.net/browse/JDK-8144566

我们的解决方法: 经过测试,我们发现将连接的 SSLSocketFactory 设置为默认值中的任何值似乎可以解决该问题。

这不起作用:HttpsURLConnection.setSSLSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault());

这确实有效:HttpsURLConnection.setSSLSocketFactory(new SSLSocketFactoryFacade());

因此,要修复 JAX-WS 客户端的问题,您可以执行以下操作:bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", new SSLSocketFactoryFacade());

我们的 SSLSocketFactory 外观:(请注意,它实际上不执行任何操作)

public class SSLSocketFactoryFacade extends SSLSocketFactory {

    SSLSocketFactory sslsf;

    public SSLSocketFactoryFacade() {
        sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault();;
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return sslsf.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return sslsf.getSupportedCipherSuites();
    }

    @Override
    public Socket createSocket(Socket socket, String s, int i, boolean b) throws IOException {
        return sslsf.createSocket(socket, s, i, b);
    }

    @Override
    public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
        return sslsf.createSocket(s, i);
    }

    @Override
    public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
        return sslsf.createSocket(s, i, inetAddress, i1);
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
        return createSocket(inetAddress, i);
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
        return createSocket(inetAddress, i, inetAddress1, i1);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展server_name(SNI扩展)不与jdk1.8.0一起发送,但与jdk1.7.0一起发送 的相关文章

随机推荐

  • java 游戏定时器

    我已经用 java 创建了一个游戏 现在我只需要添加一个计时器 允许用户在 60 秒内玩 我在互联网上搜索并找到了 swing 和 util 包的计时器 你能给我一个在我的游戏中使用它的方法吗 如果你想要一些互动的东西 你可以使用Timer
  • 确定 GIF 动画状态?

    有没有办法通过javascript检测GIF图像的动画是否完成 不它不是 JavaScript 无法直接操作 GIF 但也许jsgif可以帮你
  • Python 3 中 execfile 的替代品? [复制]

    这个问题在这里已经有答案了 Python 2 有内置函数execfile 在 Python 3 0 中被删除 这个问题讨论了 Python 3 0 的替代方案 但有些相当大的变化已经做了从Python 3 0开始 最好的替代方案是什么exe
  • Azure DocumentDB - 源自脚本的请求无法引用除为其提交客户端请求的分区键之外的分区键

    使用 c Net 客户端 SDK 我调用 ExecuteStoredProcedureAsync 方法 如下所示 sproc response await client ExecuteStoredProcedureAsync
  • 在css中使用自定义字体时出错

    虽然我尝试通过 CSS 文件为我的网站使用自定义字体 但我没有获得所需的字体 并且仅显示默认字体 请检查 css 代码 如果需要任何更改 请告诉我 font face font family Myriad Pro src url Myria
  • 从与变量匹配的另一列查找值

    我有一个数据框 如下所示 animal id trait id sire id dam id 1 25 05 0 0 2 46 3 1 2 3 41 6 1 2 4 42 76 3 4 5 10 99 3 4 6 49 81 5 4 我想创
  • 从Google Apps脚本中的类似csv文件读取数据

    我有一个 Windows 脚本文件 尽管不是 Google Apps 脚本 它将数据输出到文本文件 该文件包含以逗号分隔的数字 类似于 CSV 文件 但以编程方式创建 我可以在 Excel 中将其作为 CSV 文件打开 该文件存储在我的 G
  • querySelectorAll - 我可以在选择器中添加“:after”吗?

    我可以在 JavaScript 中执行此操作吗 var Dim Back document querySelectorAll s1 after for var i 0 i lt Dim Back length i Dim Back i st
  • 使用 TPL 数据流的请求/响应模式

    我们遇到一个问题 在使用 TPL 数据流库时需要请求 响应模式 我们的问题是我们有一个调用依赖服务的 NET core API 依赖服务限制并发请求 我们的API不限制并发请求 因此 我们一次可以收到数千个请求 在这种情况下 依赖服务将在达
  • 如何编译wxsqlite3和sqlite以获得加密支持

    我正在开发一个基于 wxWidgets 的 C 项目 使用wxSqlite3访问sqlite数据库 并且工作正常 但我想为数据库添加一些加密 在这里我通过 wxSqlite3 访问加密数据库时遇到问题 据我所知 sqlite默认不支持加密
  • Ansible 使用了错误版本的 Python

    我已经处理这个问题几天了 我在树莓派上运行ansible 我已将Python3 7设为Python的默认版本 显然 Ansible 希望使用 Python 2 7 我已在 playbook 的 vars 中添加了版本 3 7 但这不会更改模
  • 在全屏 Win32 OpenGL 中处理最小化

    我正在尝试使用 Win32 和 OpenGL 创建一个全屏应用程序 我使用更改分辨率EnumDisplaySettings and ChangeDisplaySettings并且 OpenGL 功能运行良好 在其 WndProc 上 我处理
  • Swing 中的进度对话框

    我怎样才能制作模态JDialog没有按钮出现的持续时间需要Runnable实例完成并让该实例更新该对话框上的进度条 消息 显然意大利面条代码可能有效 但我正在寻找一种干净的设计 如果存在 您可能想调查一下进度监视器 如果操作时间较长 会自动
  • .Net 控制计算机之间大小的变化

    我有一个奇怪的问题 我需要弄清楚如何解决 过去几周我一直在我的笔记本电脑上开发一个项目 但是当我在其中一台工作电脑上打开程序时 很多控件的尺寸错误和重叠等 机器之间的差异是这样的 Laptop Windows 7 专业版 显示 1920 1
  • 在MySQL中,我们如何判断表的索引是否是聚集索引?

    在MySQL中 我们如何判断表的索引是否是聚集索引 我们可以用show index from table name获取有关表索引的信息 但我没有发现它显示每个索引是聚集的还是非聚集的 这样做的目的是MySQL中如果一个表有索引 那么该表就必
  • Django FormWizard 动态改变 form_list

    我在使用表单向导时遇到了一些问题 也许有人可以解释一下 根据 process step 方法中的文档字符串 我可以 动态更改 self form list 因此 根据我的项目需求 我将表单附加到 form list 中 我附加的表格包含问题
  • 在外发电子邮件 EWS 中设置回复地址

    运行交换 2013 我在 C 服务中使用 EWS 该服务从服务帐户发送电子邮件 我想让电子邮件有一个与发送帐户不同的回复地址 即通讯组列表地址 我怎样才能做到这一点 这EmailMessage ReplyTo字段是只读的 Code Exch
  • Django 快捷方式嵌套外键

    假设我的 models py 中有以下内容 class Book pass class Part book models ForeignKey Book class Chapter part models ForeignKey Part n
  • 它不会创建 Java VM (JNI)

    我的简单命令行应用程序 int tmain int argc TCHAR argv JavaVM jvm JNIEnv env JavaVMInitArgs vm args JavaVMOption options 1 options 0
  • 扩展server_name(SNI扩展)不与jdk1.8.0一起发送,但与jdk1.7.0一起发送

    我已经使用 ApacheCXF v3 0 4 实现了 JAX WS 客户端 一切正常 但当我想使用 java 8 jdk1 8 0 25 的安全连接 SSL TLS 时 问题就出现了 我在日志中看到以下异常 Djavax net debug