我美麗又賢惠的老婆大人做大骨頭湯去了,今天是六一兒童節,明天是端午節,在這大好的節日,我們也難得的度假一把,大吃大喝一番,感謝我的老婆有這么好的手藝。
今天心情不錯,要知道我們在平時的工作日沒這么長時間膩歪在一起。
現在我把在前段日子做的項目里,遇到的一個小問題來好好的總結一下。因為我們這個項目是用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連接是否成功,能正確訪問服務,並進行調用便說明一切配置成功。這時,若將證書刪除,或更改步驟六中的配置,訪問服務便不會成功。
大功告成!飯也好啦,開飯嘍!
補充:
2015-6-5 以上證書生成方式生成的證書為“自簽名證書”,其缺點為,如果頒發第二個客戶端證書,則需要往tomcat.keystore import新的證書,並且還要重啟服務器才行。使用OpenSSL可以生成簽名證書,客戶端證書帶有簽名,服務端可不需import便可以認證此新證書。