`

cxf之https双向认证之二

    博客分类:
  • cxf
阅读更多

相关证书制作已经在http://liuwuhen.iteye.com/admin/blogs/1661493中详细的介

绍了,接下来我们需要配置https双向认证的服务端和客户端

服务端

服务端我们需要在服务器中的server.xml文件中添加keystore和truststoreFile文件信息,具体如下:

<Connector port="8443"  address="0.0.0.0" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"  keystoreFile="conf/temip-id.p12"
      keystoreType="PKCS12" keystorePass="changeit" truststoreFile="conf/eomsca-id.p12" truststoreType="PKCS12" truststorePass="changeit"/>

其中clientAuth为true代表双向认证,false表示单向认证,want表示服务端可以验证客户端,也可以不需要验证客户端。


服务端的配置基本完成,启动服务器,这里通过浏览器访问https://localhost:8443/cxf-test/services 应该是不能看到
正确的信息的,因为我们需要在浏览器器中导入客户端证书即(hw_shangcao-id.p12) 即可看到相关正确的wsdl文件。


客户端

关于cxf的https认证方式可以分为编程式和文件式实现。

编程式

1.采用代码的方式实现,编写webserviceUtils工具类,其代码如下:
package com.liuwuhen.cxf;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;

import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public  class WebServiceUtils {
 
public static KeyManager[] getKeyManagers() {
  InputStream is = null;
  try {
   // 获取默认的 X509算法
   String alg = KeyManagerFactory.getDefaultAlgorithm();
   // 创建密钥管理工厂
   KeyManagerFactory factory = KeyManagerFactory.getInstance(alg);
   File certFile = new File("F:\\root\\client\\hw_shancao-id.p12");
   if (!certFile.exists() || !certFile.isFile()) {
    return null;
   }
   is = new FileInputStream(certFile);
   // 构建以证书相应格式的证书仓库
   KeyStore ks = KeyStore.getInstance("pkcs12");
   // 加载证书
   ks.load(is, "123456".toCharArray());
   factory.init(ks, "123456".toCharArray());
   KeyManager[] keyms = factory.getKeyManagers();
   return keyms;
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (is != null) {
    try {
     is.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }

  }
  return null;
}

public static TrustManager[] getTrustManagers() {
  // 读取证书仓库输入流
  InputStream is = null;
  try {
   // 信任仓库的默认算法X509
   String alg = TrustManagerFactory.getDefaultAlgorithm();
   // 获取信任仓库工厂
   TrustManagerFactory factory = TrustManagerFactory.getInstance(alg);
   // 读取信任仓库
   is = new FileInputStream(new File("F:\\root\\server\\temip-id.jks"));
   // 密钥类型
   KeyStore ks = KeyStore.getInstance("JKS");
   // 加载密钥
   ks.load(is, "changeit".toCharArray());
   factory.init(ks);
   TrustManager[] tms = factory.getTrustManagers();
   return tms;
  } catch (Exception e) {
   e.printStackTrace();

  } finally {
   if (is != null) {
    try {
     is.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return null;
}
}

2.编写测试代码,分别设置TrustManagers和KeyManagers其详细代码如下:
public static void main(String[] args) {
  List list = new ArrayList();
  SoapInterceptor saopInterceptor = new SoapInterceptor();
  Map<String, Object> properties = new HashMap<String, Object>();
  properties.put(WSHandlerConstants.ACTION,
    WSHandlerConstants.USERNAME_TOKEN);
  properties.put(WSHandlerConstants.USER, "cxfClient");
  properties.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText");
  properties.put(WSHandlerConstants.PW_CALLBACK_CLASS,
    ClientCallback.class.getName());
  WSS4JOutInterceptor wss4jOutInterceptor = new WSS4JOutInterceptor(
    properties);
  LoggingOutInterceptor loggingOutInterceptor = new LoggingOutInterceptor();
  SAAJOutInterceptor saajOutInterceptor = new SAAJOutInterceptor();
  list.add(saopInterceptor);
  list.add(wss4jOutInterceptor);
  list.add(saajOutInterceptor);
  list.add(loggingOutInterceptor);
  JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  // 注册WebService接口
  factory.setServiceClass(IHelloWorld.class);
  // webservice请求地址
  String wsdlAdder = "https://localhost:8443/cxf-test/services/sayHello";
  // 发布接口
  factory.setAddress(wsdlAdder);
  factory.setOutInterceptors(list);
  IHelloWorld helloWorld = (IHelloWorld) factory.create();
  Client proxy = ClientProxy.getClient(helloWorld);
  HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
  TLSClientParameters tlsParams = conduit.getTlsClientParameters();
  if (tlsParams == null) {
   tlsParams = new TLSClientParameters();
  }
  tlsParams.setSecureSocketProtocol("SSL");
  //设置keystore
  tlsParams.setKeyManagers(WebServiceUtils.getKeyManagers());
  // 设置信任证书
  tlsParams.setTrustManagers(WebServiceUtils.getTrustManagers());
  conduit.setTlsClientParameters(tlsParams);
  helloWorld.sayHello("cxf hello");
}

运行其客户端代码即可输出 say hello 。


声明式


由于cxf与spring能很好的结合,所以可以通过spring配置文件的方式进行客户端配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:context="http://www.springframework.org/schema/context"
xmlns:sec="http://cxf.apache.org/configuration/security" xmlns:http="http://cxf.apache.org/transports/http/configuration"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap
http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/configuration/security
http://cxf.apache.org/schemas/configuration/security.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:client id="test"
  serviceClass="com.shanchao.test"
  address="https://localhost:8443/cxf-test/services/sayHello" />

    <!-- *代码所的客户端可以访问 -->
<http:conduit name="*.http-conduit">
  <http:tlsClientParameters disableCNCheck="true">
   <sec:trustManagers>
    <sec:keyStore type="JKS" password="changeit" file="F:/root/server/temip-id.jks" />
   </sec:trustManagers>
   <!--双向认证 -->
   <sec:keyManagers keyPassword="changeit">
    <sec:keyStore type="PKCS12" password="changeit" file="F:/root/client/hw_shancao-id.p12" />
   </sec:keyManagers>

   <sec:cipherSuitesFilter>
    <!-- these filters ensure that a ciphersuite with export-suitable or
     null encryption is used, but exclude anonymous Diffie-Hellman key change
     as this is vulnerable to man-in-the-middle attacks -->
    <sec:include>.*_EXPORT_.*</sec:include>
    <sec:include>.*_EXPORT1024_.*</sec:include>
    <sec:include>.*_WITH_DES_.*</sec:include>
    <sec:include>.*_WITH_NULL_.*</sec:include>
    <sec:exclude>.*_DH_anon_.*</sec:exclude>
   </sec:cipherSuitesFilter>
  </http:tlsClientParameters>
</http:conduit>
</beans>


特别说明:<http:conduit name="*.http-conduit"> name为*配置的是代表客户端能够访问服务端发布的所有服

务。如果在一个系统中既包含http与https的webservice服务,那么配置为*,则会出现错误。因为*代表的是所有的

webservice服务都进行了上面的配置。 那么我们可以采用https://ip:port/.* 的方式进行过滤,或者采用

{WSDL_Namespace}portName.http-conduit 方式进行过滤。

<wsdl:service name="HelloWorldImplService">

     <wsdl:port binding="tns:HelloWorldImplServiceSoapBinding" name="HelloWorldImplPort">
             <soap:address location="https://localhost:8443/cxf-test/services/sayHello" />
     </wsdl:port>
</wsdl:service>

例如本例中生成的WSDL中portaName为HelloWorldImplPort ,那么可以采用{http://cxf.liuwuhen.com/}

HelloWorldImplPort.http-conduit即可。

这两种方式的优点和缺点是:声明式所采用的代码比较简洁,代码式虽然代码比较的复杂,但是灵活性比较的强,如果我

们所产生的地址为动态的,例如是通过页面配置,存入到数据库中的这种方式,那么只能采用编程式。

关于cxf的相关认证已经介绍完成,由于时间冲忙,如有不对地方,请多多指正,谢谢!

分享到:
评论

相关推荐

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

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

    Apache Cxf 安全认证

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

    cxf https webservice

    【描述】"cxf 调用https webservice接口 ,此工程jar包齐全可直接导入eclipse进行二次开发"指出,这个压缩包可能包含了一个完整的项目示例,该示例演示了如何使用CXF调用HTTPS Web服务接口。用户可以直接将这些资源...

    CXF实现SSL安全验证

    ### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...

    cxf入门例子(安全认证)

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

    spring+CXF实现WebService(http+https)

    2. **创建WebService**: 使用CXF,首先需要定义服务接口,通常是一个Java接口,然后提供其实现。Spring会自动扫描并注册这些服务。在Spring配置文件中,可以通过`&lt;jaxws:endpoint&gt;`标签来声明一个CXF Web服务,...

    cxf-https spring5.0

    2. **配置Spring**:创建Spring配置文件,如`applicationContext.xml`,配置CXF beans并启用HTTPS。这可能包括定义一个`jaxws:endpoint` bean,设置服务器端口和SSL配置。例如: ```xml &lt;bean id="cxf" class="org...

    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例子,认证,登录,客户端

    2. **身份验证**:CXF支持多种身份验证机制,如基本认证、digest认证、表单认证以及OAuth等。在服务端,可以通过在Spring配置文件中定义拦截器或安全策略来实现这些机制。 3. **登录流程**:登录通常涉及用户输入...

    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 通过用户名和密码进行验证"涉及...

    cxf与axis2区别

    CXF与Axis2框架区别详解 CXF和Axis2是两个流行的Webservice框架,都是由现有的项目逐渐演化而来的。Axis2是由Axis1.x系列演化而来,而Apache CXF则是由Celtix和XFire项目整合而生。在本文中,我们将探讨CXF和Axis2...

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

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

    cxf 安全验证例子

    CXF的安全功能主要由WS-Security(Web Services Security)规范支持,包括身份认证、消息完整性、消息机密性等。 在CXF中,安全验证通常通过以下几种方式实现: 1. **基本认证**:基于HTTP的基本认证,需要提供...

    cxf 3.1.1 jar包

    2. **cxf-rt-frontend-jaxws.jar**: 提供了JAX-WS(Java API for XML Web Services)的支持,用于创建和处理基于SOAP的Web服务。 3. **cxf-rt-frontend-jaxrs.jar**: 支持JAX-RS(Java API for RESTful Web Services...

    cxf配置swagger2

    总的来说,"cxf配置swagger2"涉及到的步骤包括:添加依赖、创建Swagger配置类、配置Spring Boot应用扫描、以及在CXF服务中注册Swagger2 Feature。通过这些步骤,我们可以为CXF RESTful服务生成漂亮的文档并提供交互...

Global site tag (gtag.js) - Google Analytics