`

cxf之https双向认证之三

    博客分类:
  • cxf
阅读更多
cxf中的https认证过程中常见的一些错误
Caused by: java.security.cert.CertificateException: No subject alternative names present
at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:142)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:75)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:264)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:250)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
... 47 more

错误分析:http://blog.csdn.net/fjfdszj/article/details/5965913。

修改方案: conn.setHostnameVerifier(new HostnameVerifier()
                {
                    public boolean verify(String hostname, SSLSession session)
                    {
                        return true;
                    }
                });

Caused by: java.security.cert.CertificateException: No name matching localhost found
at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:210)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:77)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:264)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:250)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
... 47 more

错误分析:该问题主要是没有找到匹配的主机,仔细检查webservice地址是否有误。


Caused by: java.net.s: cannot retry due to server authentication, in streaming mode
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1257)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1960)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1939)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1865)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:599)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
... 61 more

错误分析:该问题主要是当前为流模式,应为服务端验证不能重试,解决办法是客户端需要添加服务端的信任证书,该问题与通过httpUrlconnetion连接服务端访问401是同样的处理方式。


javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)

错误分析:该问题主要是由于客户端没有导入服务端证书,将服务端证书导入到客户端jdk中的证书库即可。导入命令如下:
keytool -import -v -trustcacerts -storepass changeit -alias 20 -file temip-id.cer -keystore ../jre/lib/security/cacerts。



Caused by: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: java.net.SocketException: Broken pipe
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1325) ~[na:1.6]
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) ~[na:1.6]
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) ~[na:1.6.0_29]
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) ~[na:1.6.0_29]
at java.io.BufferedInputStream.read(BufferedInputStream.java:317) ~[na:1.6.0_29]
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:695) ~[na:1.6.0_29]
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640) ~[na:1.6.0_29]
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195) ~[na:1.6.0_29]
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) ~[na:1.6.0_29]
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318) ~[na:1.6]
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1960) ~[cxf-2.0.13.jar:2.0.13]
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1939) ~[cxf-2.0.13.jar:2.0.13]
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1865) ~[cxf-2.0.13.jar:2.0.13]
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) ~[cxf-2.0.13.jar:2.0.13]
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:599) ~[cxf-2.0.13.jar:2.0.13]
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-2.0.13.jar:2.0.13]
... 83 common frames omitted

1.主要原因是由于双向认证证书配置的地址不正确,从而导致该错误。

2.可能的原因 :
 网上查了很多资料,都说这个错误是由于Linux/Unix的连接数限制,或者多个线程对同一Socket进行读写。
但是经过我反复调试的结果,这个异常顾名思义就是Socket通道坏掉了。可能是数据发送有延迟,对方没有检测到新数据,直接把通道关了,于是你再往里添加数据时就出现这个异常,通常往Socket里面写数据的Write函数只调用一遍时,是不会出现这个问题的,经常出现在循环中。解决方法是自己加入信息交换的协议,比如第一个数据报头标明数据长度;而接收端口在无法检测到新数据时不能立即退出,等接收的数据长度达到要求后,或者一定时间没有新数据再退出。
在Unix/Linux下的网络结构和windows略有不同,至少在java的网络编程上有一些差异(没有考证,只是自己曾经遇到相同的问题!) 引起java.net.SocketException:Broken pipe这个异常的原因是你使用了多个线程同时对一个Socket通道进行读/写(windows环境没有这个问题),简单的说就是Unix/Linux下不能同时对一个Socket通道进行读和写。并且我也尝试过使用同步控制来防止对同一个Socket通道进行读和写,不过只是降低了该异常的发生概率(绝对不是同步控制有问题),发送和接收加入一段延迟后不会发生该问题,当然应用是不能容忍这样的处理效率和性能的。 最后我把整个网络通信改成用new io的非阻塞模式,在单线程中处理多路通道,没有这个问题,而且似乎系统吞吐量比先前更高了,
3:
java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) 一般出现在linux服务器上,常常由于网络不稳定或者服务器负荷过大,管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。 以下是UNIX的信号解释: 11 / SIGSEGV: Unerlaubter Zugriff auf Hauptspeicher (Adressfehler). 12 / SIGUSER2: User-defined Signal 2 (POSIX). 把_JAVA_SR_SIGNUM改成12只是将信号至成user-defined,让它不报出来而已,不能解决问题。 建议采取的方式: 1. 资源没有完全释放,用完后要至NULL 值(JAVA的GC没那么完善) 2. 数据库连接顺序关闭!(RS,PS,CONN) 3. 优化JAVA虚拟机 加入相应的内存参数! 4. 不要在数据库中获取大段文本(即一个栏位的值不要太大) 5. JAVA 不推荐 用String 获取大量信息。(容易造成内存泄露,建议用StringBuffer) 6. 页面重复提交 7. 尽量将METHOD移到JAVA中,在JSP中所有的方法都看做全局变量,编译执行本身就有很多问题。 8. 如果是查询功能,尽可能的使用非XA(事务)。 9. 尽量用较新较稳定版本的JDK,低版本的JVM本身也有很多BUG,比如1。5的垃圾回收比起1。2,1。3一定是非常明显的进步。 10. LINUX系统本身没有这么稳定,有些问题无法避免的~~:)

主要原因是证书的制作有问题。
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:183)
at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:103)
at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:87)
at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:55)
... 19 more


java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation

设置证书的参数有问题。

关于cxf的https认证目前介绍为止,如果需要更深入了解可以查看http://cxf.apache.org/
分享到:
评论

相关推荐

    4.CXF安全访问之单向SSL或者双向SSL(三)

    **双向SSL**,也称为客户端和服务器之间的双向认证,比单向SSL更安全。在双向SSL中,不仅服务器验证客户端,客户端也要验证服务器的身份,同时服务器也会验证客户端的身份。这需要客户端和服务器各自拥有并提供有效...

    Apache Cxf 安全认证

    Apache CXF 安全认证主要涉及两种机制:基于密码的安全认证和基于CA证书的安全认证。 首先,基于密码的安全认证方法需要在客户端和服务端配置相应的拦截器以实现用户验证。客户端配置包括使用`WSS4JOutInterceptor`...

    cxf https webservice

    3. **调用HTTPS Web Service**:使用CXF调用HTTPS Web Service,首先需要配置CXF客户端来支持SSL。这包括设置信任商店(Truststore)和密钥商店(Keystore),并指定相应的密码。此外,可能还需要处理证书验证问题,...

    CXF实现SSL安全验证

    ### CXF实现SSL安全验证 ...通过以上三个步骤,我们成功地实现了 CXF 的 SSL 安全验证,并搭建了一个基于 HTTPS 的 Web Service。这种方式不仅确保了数据传输的安全性,还提高了系统的整体安全等级。

    cxf入门例子(安全认证)

    为了设置安全认证,我们需要配置 CXF 的 Spring 容器,添加相关的拦截器或过滤器,比如 `org.apache.cxf.security.authentication.BasicAuthenticationInInterceptor` 或 `org.apache.cxf.security.transport....

    spring+CXF实现WebService(http+https)

    3. **HTTPS支持**: HTTPS是一种安全的通信协议,它在HTTP基础上增加了SSL/TLS层,用于加密传输数据,防止中间人攻击。在Java中,HTTPS通常需要服务器证书和私钥,这些通常存储在JKS(Java Key Store)文件中。 4....

    cxf-https spring5.0

    在IT行业中,集成Spring 5.0、CXF 3.2和Maven构建Web服务是常见的实践。这里我们将深入探讨这些技术以及如何将它们整合在一起实现HTTPS支持。 首先,让我们了解一下每个组件: 1. **Spring 5.0**:Spring框架是...

    CXF V3.2.4 实现的WebService调用(带安全认证)

    在本文中,我们将深入探讨如何使用Apache CXF V3.2.4实现带有安全认证的Web服务调用。Apache CXF是一个开源框架,它允许开发者创建和消费各种Web服务,包括SOAP和RESTful API。CXF 3.2版本引入了许多增强功能,包括...

    Spring集成CXF实例(包含WSS4J安全认证)

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而CXF则是一个流行的Web服务实现框架。这两个框架的集成使得开发者能够轻松地创建和消费Web服务。本实例将详细介绍如何在Spring环境中集成CXF,并使用...

    使用cxf和spring开发基于https的webservice服务端以及客户端样例

    本示例将详细介绍如何使用Apache CXF和Spring框架来开发基于HTTPS的安全Web服务,包括服务端和客户端的实现。 Apache CXF是一个开源的Java框架,它支持创建和消费各种Web服务,包括SOAP和RESTful API。而Spring框架...

    2.CXF安全访问之Http Basic Auth(一)

    同时,`org.apache.cxf.interceptor.security.BasicAuthInterceptor`拦截器处理了实际的身份验证过程,它会检查收到的请求是否包含正确的认证信息。 工具方面,CXF提供了多种工具帮助开发者管理和调试服务,如CXF的...

    cxf例子,认证,登录,客户端

    【标签】:“cxf例子认证登录客户端,cxf学习,cxf实例,cxf” 这些标签突出了几个关键的学习点:首先,你需要熟悉CXF的基础知识,包括如何创建服务和客户端;其次,了解如何实现认证机制,这对于任何涉及用户访问...

    CXF WSSCEURITRY 身份认证demo

    【CXF WSSCEURITRY 身份认证demo】是一个关于在WEB服务中使用Apache CXF框架实现WS-Security(Web Services Security)标准的身份验证的示例项目。该示例着重展示了如何在CXF中配置和使用WS-SecureConversation(WS-...

    CXF 通过用户名和密码进行验证

    3. **证书认证**:除了用户名和密码,也可以使用X.509证书进行双向认证,提供更高级别的安全性。 4. **安全协议**:使用HTTPS等安全协议,确保数据在传输过程中的安全。 总结,"CXF 通过用户名和密码进行验证"涉及...

    WebService详细解析(axis,xfire,cxf,授权认证加密解密)

    本篇文章详细介绍了WebService的基本概念和AXIS、XFire、CXF这三个流行的Java WebService框架,以及授权认证和加密解密在WebService中的应用。这些内容对于理解和实践WebService开发具有重要价值,为开发者提供了...

    Cxf客户端及服务器端,实现客户端和服务器端的权限验证

    在CXF中,这可以通过实现不同级别的安全性来完成,如基本认证、OAuth、WS-Security等。我们将重点讨论基本认证和WS-Security这两种常见的实现方式。 1. **基本认证**: 基本认证是最简单的HTTP身份验证形式,它...

    cxf 安全验证例子

    3. **证书认证**:在客户端和服务端之间使用SSL/TLS协议进行身份验证,通过交换数字证书来确认对方的身份。 4. **WS-Security**:支持诸如WS-Trust、WS-SecureConversation等规范,可以实现更复杂的身份验证和会话...

    cxf 3.1.1 jar包

    3. **cxf-rt-frontend-jaxrs.jar**: 支持JAX-RS(Java API for RESTful Web Services),让你可以使用注解轻松地创建RESTful服务。 4. **cxf-rt-transports-http.jar**: 包含了HTTP传输层的实现,使得CXF服务可以...

    webservice=maven+spring+cxf

    这三者结合,可以高效地创建和消费 Web 服务。 【描述】"we服务端+java客户端代码" 表明该压缩包中包含了基于 Java 的 Web 服务服务器端和客户端的实现代码。这意味着我们可以从这个项目中学习到如何设置服务端接口...

Global site tag (gtag.js) - Google Analytics