我已经通过使用ApacheCXF(v3.0.4)实现了一个JAX-WS客户端,并且一切正常工作,但是当我想要使用安全连接(SSL / TLS)与 java 8(jdk1.8.0_25)时出现问题.

我在日志中看到以下异常(-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

经过depeer分析后,我观察到问题是由于使用Java 8而不是发送服务器名称(SNI),而是使用Java 7发送该问题,并且Web服务调用成功工作.

Java 8 log(-Djavax.net.debug = all):缺少“Extension server_name”

[...]
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 log(-Djavax.net.debug = all)(works):“扩展名server_name”被设置

[...]
Compression Methods:  { 0 }
Extension elliptic_curves,MD5withRSA
Extension server_name,server_name: [host_name: testeo.hostname.es]
***
[...]

观察到使用Java 7,扩展名server_name,server_name:[host_name:testeo.hostname.es]被设置,然后Web服务调用成功工作.

Java 7为什么没有将server_name设置为Java 7?是Java配置问题吗?

解决方法

如上所述,原因与使用setHostnameVerifier()的JDK错误与SNI(Extension server_name)相关.
https://bugs.openjdk.java.net/browse/JDK-8144566

我们的解决方法:
测试后,我们发现将连接的SSLSocketFactory设置为与默认值相似的任何内容似乎可以解决问题.

这不行:
HttpsURLConnection.setSSLSocketFactory((SSLSocketFactory)SSLSocketFactory.getDefault());

这样做有效:
HttpsURLConnection.setSSLSocketFactory(new SSLSocketFactoryFacade());

所以,要修复一个JAX-WS客户端,你可以这样做:
bindProvider.getRequestContext().put(“com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory”,新的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,InetAddress inetAddress,int i1) throws IOException,inetAddress,i1);
    }

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

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

java – 扩展server_name(SNI扩展名)不是用jdk1.8.0发送的,而是用jdk1.7.0发送的的更多相关文章

  1. ios – 使用UIActivityViewController发送UIImage的控制文件名

    我与UIActivityViewController共享一个图像,以及一个url和一些文本.一切都很好,除了图像文件名永远是“Image-1”,没有扩展名.在某些情况下,这将导致一个大问题,例如在邮件应用程序中,根本不会打开没有扩展名的图像.图像正由应用程序生成,并以UIImage的形式存在.有没有方法来控制文件名,并为图像添加正确的扩展名?解决方法如果其应用程序生成图像(UIImage参考),那

  2. ios – 如何在不使用故事板的情况下创建通知内容扩展

    我想创建一个NotificationContentExtension来利用新的iOS10丰富通知.但是,在主应用程序中,我们不使用接口构建器.如何创建不使用故事板的内容扩展?解决方法>像往常一样创建通知内容扩展目标.>从项目中删除storyboard文件>从扩展的Info.plist中删除NSExtensionMainStoryboard条目.>将NSExtensionPrincipalClass

  3. Swift:遍历文件夹及其子文件夹中的文件

    我很新的编程一个Swift,我试图迭代文件夹中的文件。我看了一下答案here,并试图将其翻译成Swift语法,但没有成功。我得到的错误是:我的目标是查看包含在主文件夹中的所有子文件夹和文件,找到所有具有特定扩展名的文件,然后与他们做一些事情。任何帮助是非常感谢!使用枚举器的nextObject()方法:

  4. swift – iOS 10 iMessage应用程序扩展名:我如何计算超高导航栏的高度

    我下载了Xcode8测试版,并试图玩iMessages应用程序扩展程序sdk,但遇到了一个问题,他们看似非标准的导航栏高度当我转换到应用程序的扩展视图时,我的图像包含以下框架CGRect最终部分隐藏在导航栏的后面。我希望它出现在导航栏下方。.navigationBar.isTranslucent=false,但它没有工作,我猜是有道理的,因为它不在我的应用程序的范围控制。我想避免2件事情。只需猜测相应的高度并远离编程解决方案。谢谢您的帮助这可能有助于使顶部布局指南的约束如下:

  5. Swift并使用类扩展

    我不明白为什么程序员在他们的类实现中使用extension关键字.您可以阅读其他主题,然后代码更加语义上分离等.但是当我使用自己的代码时,我觉得使用//MARK–Something更清楚.然后在Xcode中使用方法列表(ctrl6)时,首先看到一切.在Apple文档中,您可以阅读:“Extensionsaddnewfunctionalitytoanexistingclass,structure,o

  6. swift – 将NSCoding添加为扩展名

    正确初始化类型是不可能的.您可以在扩展程序中添加方便的初始化程序,因为它们的性质必须调用指定的初始化程序.此外,init被指定为指定的初始化程序,因为它是创建实例的完全不同的路由.以UIViewController为例,它可以使用简单的代码创建,也可以从XIB文件创建.最后,不可能添加实现NSCoding的扩展.也许你可以创建一个包含这个类的包装类,并实现NSCoding.

  7. swift – 如何编写处理可选值的字典扩展名

    ]字典上使用我的方法,它无法选择绑定该值.如何编写一个适合处理可选值的字典的扩展名?

  8. AppDelegate.swift如何在Xcode 6.3中替换AppDelegate.h和AppDelegate.m

    根据iOSDeveloperLibraryTheappdelegateiswhereyouwriteyourcustomapp-levelcode.Likeallclasses,theAppDelegateclassisdefinedintwosourcecodefilesinyourapp:intheinterfacefile,AppDelegate.h,andintheimplementati

  9. 如何在Android上查找具有特定扩展名的所有文件?

    我正在使用filebrowser来查找手机上的文件,但我想显示我的应用程序可以向用户打开的所有文件,然后用户选择一个.与音乐播放器一样,它显示电话,SD卡和内部存储器中的所有歌曲,而不仅仅是用户所在文件夹中的歌曲.解决方法列出文件时使用文件名过滤器.下面的示例列出了给定根目录中的所有mp3文件–

  10. php自定义扩展名获取函数示例

    这篇文章主要介绍了php自定义扩展名获取函数,结合实例形式分析了php针对文件扩展名的截取操作实现技巧,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部