Tomcat 配置用戶認證服務供C#客戶端調用

項目裏,遇到的一個小問題來好好的總結一下。由於咱們這個項目是用Java寫的服務端發佈WebService,客戶端呢使用C#來調用WebService( 本人之前搞過一段時間C#客戶端,還總結了一個MVP框架AngelFrame,發佈在: http://www.cnblogs.com/wgp13x/p/99c2adc52d8f0dff30a038841ac32872.html ),固然C#調用Java發佈的 WebService能夠利用很多第三方項目,好比Axis2,咱們就用的這個,網上也有不少介紹。不過咱們項目要求,要使用證書,客戶端須要安裝證書才能正常使用 WebService,這個網上不多 有,下面就是我配置成功之後的總結啦,分享給你們
 
摘要:本人找了很久也沒在網上找到一份完整的講Tomcat 七、 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.cerhtml

 

步驟
在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",先不進行客戶端認證,因此不用安裝證書就能夠正常查看。java

 

步驟

在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鏈接是否成功,能正確訪問服務,並進行調用便說明一切配置成功。這時,若將證書刪除,或更改步驟六中的配置,訪問服務便不會成功。
相關文章
相關標籤/搜索