zoukankan      html  css  js  c++  java
  • Tomcat 配置用户认证服务供C#客户端调用

    我美丽又贤惠的老婆大人做大骨头汤去了,今天是六一儿童节,明天是端午节,在这大好的节日,我们也难得的度假一把,大吃大喝一番,感谢我的老婆有这么好的手艺。
    今天心情不错,要知道我们在平时的工作日没这么长时间腻歪在一起。现在我把在前段日子做的项目里,遇到的一个小问题来好好的总结一下。因为我们这个项目是用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 confserver.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 confweb.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>
     
     

    步骤

    在webappsWebContentWEB-INFconf文件中添加以下代码段。
    <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 confserver.xml文件中的clientAuth="true",设置其进行客户端认证。这时再重启Tomcat服务器,在浏览器中输入服务地址,就会发现这时浏览器让你选择一个证书,然后选择lpClinet证书后即可正确的查看服务了,这样服务端就配置正确喽。
    再次启动C#客户端,判断https连接是否成功,能正确访问服务,并进行调用便说明一切配置成功。这时,若将证书删除,或更改步骤六中的配置,访问服务便不会成功。
     
    大功告成!饭也好啦,开饭喽!
     

    补充:

    2015-6-5  以上证书生成方式生成的证书为“自签名证书”,其缺点为,如果颁发第二个客户端证书,则需要往tomcat.keystore import新的证书,并且还要重启服务器才行。使用OpenSSL可以生成签名证书,客户端证书带有签名,服务端可不需import便可以认证此新证书。



    作者:Angel 
    欢迎转载或分享,但请务必声明文章出处。
    如果文章对您有帮助,希望你能推荐关注

    王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。

    Email:aitanjupt@hotmail.com

    QQ:289770363 

  • 相关阅读:
    一年后重翻javascript
    针对thinkphp 5框架存储过程bug而重写的存储过程的扩展类
    移动应用端的支付宝支付php开发流程
    android studio 开发中启动android项目报错sdk版本不一致解决方案
    正则表达式(一)
    linux下memcached安装以及启动
    linux如何添加服务为系统服务快速启动或关闭
    js或者jquery直接下载网页上的图片代码
    onethink多图上传
    php+redis实现多台服务器内网存储session并读取
  • 原文地址:https://www.cnblogs.com/wgp13x/p/254bf58c45aa62ea1e032dd3a1d2fe57.html
Copyright © 2011-2022 走看看