项目里,遇到的一个小问题来好好的总结一下。因为我们这个项目是用Java写的服务端发布WebService,客户端呢使用C#来调用WebService(本人以前搞过一段时间C#客户端,还总结了一个MVP框架AngelFrame,发布在:http://www.cnblogs.com/wgp13x/p/99c2adc52d8f0dff30a038841ac32872.html),当然C#调用Java发布的WebService可以利用不少第三方项目,比如Axis2,我们就用的这个,网上也有很多介绍。不过我们项目要求,要使用证书,客户端需要安装证书才能正常使用WebService,这个网上很少有,下面就是我配置成功以后的总结啦,分享给大家。
 
摘要:本人找了好久也没在网上找到一份完整的讲Tomcat 7、Axic2发布带用户认证的WebService、C#客户端调用这个服务的配置步骤,一般都是讲java客户端调用。本文即是对这一过程完成后的一个总结,详细的一步步的教你怎么使用证书,在服务端发布带用户认证的服务,在C#客户端使用这一服务。
关键词:Tomcat,Axic2,WebServcie,Java,C#,服务,用户认证,证书 
前提:已经使用axic2在Tomcat上发布了一个不带用户认证的WebServcie,并且C#客户端可以正确调用它。
需求:使用证书,将服务配置成带用户认证的,并且C#客户端可以正确使用它。
说明:以下是在Tomcat下配置用户认证的具体步骤。

步骤一:

首先,你得有对证书,证书的生成办法网上都有,我再略讲一遍吧。
我们使用JDK自带的keytool工具来生成证书。命令行进入JDK下的bin目录,运行keytool命令。里面的各种参数,生成路径、有效时间、别名、“您的名字与姓氏是什么?”、“您所在的州或省份名称是什么?”、“密码”等都可以按照需要来填,这里略过哈。
1
keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500
1
keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\lpClient.p12 -validity 36500
1
keytool -export -alias mykey -keystore D:\lpClient.p12 -storetype PKCS12 -storepass password -rfc -file D:\lpClient.cer
1
keytool -import -v -file D:\lpClient.cer -keystore D:\tomcat.keystore
1
keytool -list -keystore D:\tomcat.keystore
1
keytool -keystore D:\lpServer.keystore -export -alias tomcat -file D:\lpServer.cer

这样就生成了我们需要的三个文件:tomcat.keystore、lpClinet.p12、lpServer.cer。

步骤二:
在Tomcat conf\server.xml文件中添加以下代码段。
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="D:\\tomcat.keystore" keystorePass="password"

truststoreFile="D:\\tomcat.keystore" truststorePass="password" />

注意:clientAuth="false",先不进行客户端认证,使C#客户端能够正常添加服务引用,否则C#客户端添加不上服务引用。
在D:\目录下放置tomcat.keystore,密码按实际情况而配。
           

步骤三:

在Tomcat conf\web.xml文件尾部添加以下代码段,使其默认使用Https协议,这样一来,所有的Http请求就会自动转变为Https请求啦。这步也可以略过,如果你的项目不强制使用Https协议的话。
<login-config> 
        <auth-method>CLIENT-CERT</auth-method> 
        <realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
        <web-resource-collection> 
            <web-resource-name>SSL</web-resource-name> 
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
            <user-data-constraint>
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
            </user-data-constraint>

</security-constraint>

 
 

步骤四:

在webapps\WebContent\WEB-INF\conf文件中添加以下代码段。
<transportReceiver name="http"
                       class="org.apache.axis2.transport.http.AxisServletListener">
        <parameter name="port">8080</parameter>
    </transportReceiver>
    <transportReceiver name="https"
                       class="org.apache.axis2.transport.http.AxisServletListener">
        <parameter name="port">8443</parameter>

</transportReceiver>

这一步是配置端口号。然后就是,启动Tomcat服务器,发布服务了,你可以使用浏览器查看服务是否发布成功,这就不必多说了吧。因为刚刚配置的clientAuth="false",先不进行客户端认证,所以不用安装证书就可以正常查看。

步骤五:

在Windows客户端正确安装证书,并配置好受信任的根证书颁发机构。证书的安装办法网上都有,在这里我再略述一遍吧,具体的过程如下:
双击lpClinet.p12,一直默认下一步,正确输入设置的密码,安装到“个人”下。双击lpServer.cer,安装到“受信任的根证书颁发机构”下。
 

步骤六:

在C#客户端添加相应的服务引用,注意使用的是Soap12。先不做以下配置,启动C#客户端,判断https连接是否成功。成功后可继续按照下面的代码进行配置,放在App.conf里。
<binding name="TaskServiceSoap12Binding">
          <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
            messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          </textMessageEncoding>
          <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
            maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
            bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
            keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
            realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
            useDefaultWebProxy="true" requireClientCertificate="true" />
</binding>
<client>
      <endpoint address="https://192.1.11.108:8443/WebContent/services/TaskService.TaskServiceHttpsSoap12Endpoint/"
        behaviorConfiguration="endpointBehavior1" binding="customBinding" bindingConfiguration="TaskServiceSoap12Binding"
        contract="TaskService.TaskServicePortType" name="TaskServiceHttpsSoap12Endpoint" />
</client>
<behaviors>
      <endpointBehaviors>
        <behavior name="endpointBehavior1">
          <dataContractSerializer maxItemsInObjectGraph="209715200"/>
          <clientCredentials>
            <clientCertificate findValue="pl" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="My"/>
            <serviceCertificate>
              <authentication certificateValidationMode="None"/>
              <defaultCertificate findValue="192.1.11.108" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="Root"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>

</behaviors>

注意:要在这里配置到客户端的证书,endpointBehaviors、clientCredentials...请按照实际的配置为准,请耐心阅读,小心配置。
 

步骤七:

正确添加服务引用后,便可以更改Tomcat conf\server.xml文件中的clientAuth="true",设置其进行客户端认证。这时再重启Tomcat服务器,在浏览器中输入服务地址,就会发现这时浏览器让你选择一个证书,然后选择lpClinet证书后即可正确的查看服务了,这样服务端就配置正确喽。
再次启动C#客户端,判断https连接是否成功,能正确访问服务,并进行调用便说明一切配置成功。这时,若将证书删除,或更改步骤六中的配置,访问服务便不会成功。

Tomcat 配置用户认证服务供C#客户端调用的更多相关文章

  1. 使用OAuth打造webapi认证服务供自己的客户端使用

    一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证). ...

  2. 使用OAuth打造webapi认证服务供自己的客户端使用(二)

    在上一篇”使用OAuth打造webapi认证服务供自己的客户端使用“的文章中我们实现了一个采用了OAuth流程3-密码模式(resource owner password credentials)的W ...

  3. OAuth2建立webapi认证服务供自己的客户端使用--密码模式

    场景:你自己实现了一套webApi,想供自己的客户端调用,又想做认证. 第一步:通过vs2015建立web api项目,Startup.cs,这个类将会作为Owin的启动类. 第二步:在webapi. ...

  4. 管理员技术(四): 配置NTP网络时间客户端、 创建一个备份包、 配置用户和组账号、配置一个cron任务

    一. 配置NTP网络时间客户端 目标: 本例要求配置虚拟机 server0,能够自动校对系统时间.相关信息如下: 1> NTP服务器位于 classroom.example.com        ...

  5. WebService--CXF与Spring的整合(jaxws:endpoint形式配置)以及客户端调用(spring配置文件形式,不需要生成客户端代码)

    一.CXF与Spring整合(jaxws:endpoint形式配置) 工具要点:idea.maven 1.新建一个maven项目 <?xml version="1.0" en ...

  6. Tomcat配置全攻略

    tomcat的的下载地址http://www.apache.org/dist/jakarta/tomcat-4/ 1.安装jdk,详细操作请参考本站windows 2k和redhat 8.0下java ...

  7. Tomcat配置技巧

    1. 配置系统管理(Admin Web Application) 大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面.Tomcat按照自己的方式,同样提供一个 ...

  8. Tomcat 配置必备的 10 个小技巧

    现在开发Java Web应用,建立和部署Web内容是一件很简单的工作.使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界.Tomcat具有免费.跨平台等诸多特性,并且更新 ...

  9. Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

随机推荐

  1. PAT 甲级 1008 Elevator (20)(20 分)模拟水题

    题目翻译: 1008.电梯 在我们的城市里,最高的建筑物里只有一部电梯.有一份由N个正数组成的请求列表.这些数表示电梯将会以规定的顺序在哪些楼层停下.电梯升高一层需要6秒,下降一层需要4秒.每次停下电 ...

  2. [转]FluentData

    本文来自:http://fluentdata.codeplex.com/wikipage?title=Fluency&referringTitle=Home Documentation  Fl ...

  3. Linux常用命令之-grep

    简介 grep全称Global Regular Expression Print是一种强大的文本搜索工具,它能使用给定的正则表达式按行搜索文本输出,文件,目录等,统计并输出匹配的信息,grep在文本查 ...

  4. AES 加密算法 跨语言

    aes加密算法 delphi .java.c# .网页在线工具 4个相同 AES/ECB/PKCS5Padding 与网页在线工具加密结果相同 http://tool.chacuo.net/crypt ...

  5. Maven配置本地仓库

    当我们在myeclipse中update maven时可能会报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml,以致于 ...

  6. pthread_create用法(转)

    在转载别人文章之前,说一下 pthread_create(); 创建线程返回值. 正常情况下,创建成功则返回 0 : 如果创建失败 通常返回常见的 错误返回代码为: EAGAIN #define   ...

  7. 6 MySQL--表--完整性约束

    参考:https://www.cnblogs.com/alice-bj/p/8824693.html 完整性约束: http://www.cnblogs.com/linhaifeng/articles ...

  8. fekit 搭建

    sudo apt-get install npmsudo apt-get install nodejs 保证npm配置正确 sudo  npm config set registry http://r ...

  9. ansible 使用

    批量添加ssh免密 ansible mhc -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_dsa. ...

  10. docker1.9 network跨主机安装

    背景:在跨host中,如果docker任何一个重启或者销毁,docker暴露的端口以及ip将可能重新配置,这个时候需要重新记录ip跟端口.在生产环境中往往需要一个固定的ip以及端口去跟容器通信.例如m ...