Webservice 和 SSL 問(wèn)題故障排除(傳輸級安全性)
問(wèn)題描述
利用傳輸級安全性,可通過(guò)使用“安全套接字層”(Secure Sockets Layer,SSL)來(lái)保護客戶(hù)端應用程序與 WebLogic 服務(wù)器之間的連接。SSL 通過(guò)允許兩個(gè)通過(guò)網(wǎng)絡(luò )連接的應用程序驗證對方的身份以及對應用程序間交換的數據進(jìn)行加密,來(lái)提供安全的連接。身份驗證允許服務(wù)器和客戶(hù)端(可選)驗證網(wǎng)絡(luò )連接另一端的應用程序的身份。加密使通過(guò)網(wǎng)絡(luò )傳輸的數據只能被目標接收者理解。
編寫(xiě)本文檔的目的是為了探討客戶(hù)在使用 WebService 和 SSL 時(shí)引發(fā)的大部分問(wèn)題。如果尚未閱讀支持模式“
理解和探查 SSL 問(wèn)題”,請閱讀它
本文將討論單向 SSL 和雙向 SSL 中的多數常見(jiàn)問(wèn)題。并將說(shuō)明如何完成測試。使用的代碼示例來(lái)自:
WEBLOGIC_HOME\\samples\server\examples\src\examples\webservices\basic\javaclass。
快速鏈接
適宜的文檔
http://e-docs.bea.com/wls/docs81/webserv/securitytml此文檔中的鏈接
通過(guò)單向 SSL 調用 Webservice準備工作如何進(jìn)行?如何調試?客戶(hù)端出現了哪些問(wèn)題?通過(guò)雙向 SSL 調用 Webservice準備工作如何進(jìn)行?如何調試?客戶(hù)端出現了哪些問(wèn)題?特定版本已知問(wèn)題一般的已知問(wèn)題通過(guò)單向 SSL 調用 Webservice
準備工作
您需要確保服務(wù)器在監聽(tīng) SSL 端口。
現在,我們將假定服務(wù)器有下列密鑰庫 (keystore):
java utils.ImportPrivateKey serverks weblogic keyserver weblogic publicem SMALBOIS02-keyer
受信任 CA 密鑰庫 (keystore) 定義如下:
keytool -import -trustcacerts -alias CA -file caem -keystore trustks -storepass weblogic
啟動(dòng) WebLogic 服務(wù)器并單擊鎖之后,您將獲得:
現在,我們將使用的文件是 ca.pem 和 public.pem。
CA.PEM 包含的證書(shū)顯示為“For VeriSign authorized testing only.No assurances (C)VS1997»
PUBLIC.PEM 包含 CA.PEM + SMALBOIS02-keyer(服務(wù)器證書(shū))的公鑰-兩個(gè)連接在一起。
返回頁(yè)首。如何進(jìn)行?
設置起來(lái)很簡(jiǎn)單。只需要指定一個(gè) https url 來(lái)訪(fǎng)問(wèn) WSDL。還需要為 servicegen 定義“protocol="https”。例如:
<target name="ear">
<servicegen
destEar="D:/_wk/SupportPatterns/WLS/SSLWebServices/mydomain/applications/${ear_file}"
warName="${war_file}">
<service
javaClassComponents="examplesebservicesasicavaclass.HelloWorld"
targetNamespace="${namespace}"
serviceName="HelloWorld"
serviceURI="/HelloWorld"
generateTypes="True"
protocol="https"
expandMethods="True">
<client
packageName="examplesebservicesasicavaclass"
clientJarName="${client_jar_file}"
/>
</service>
然后,以下列方式訪(fǎng)問(wèn) WDSL:
<arg value="https://localhost:${port}/basic_javaclass/HelloWorld?WSDL"/>
如何調試?
需要將服務(wù)器配置為允許單向通訊。如果要確保情況正是如此,請使用 Web 瀏覽器,并通過(guò) https 請求 WSDL。如果您可訪(fǎng)問(wèn)該鏈接,而瀏覽器上卻未安裝客戶(hù)端證書(shū),則您應該能夠通過(guò)單向 SSL 訪(fǎng)問(wèn) Webservice 而不會(huì )出現任何問(wèn)題。
如果 WebLogic 上正在運行 Web Service,您可先確保 SSL 端口已打開(kāi)。然后,打開(kāi) WebLogic 控制臺,并檢查 SSL 設置:
轉到服務(wù)器的密鑰庫 (keystore) 和 SSL 選項卡
向下滾動(dòng)該頁(yè)并顯示高級選項
Two Way Client Cert Behavior:Client Certs Not Requested 或 Client Certs Requested but not Enforced
上述這些設置將確保能夠在不提供客戶(hù)端證書(shū)的情況下建立 SSL 連接(在此種情況下,SSL 連接將是雙向 SSL 連接)。
如果想調試 SSL 層 (layer),則可在客戶(hù)端和服務(wù)器(如果也是在 WebLogic 上運行)上添加下列內容:
java -Dweblogi.security.SSL.verbose=true
調用客戶(hù)端 Webservice 時(shí),可定義下列內容:
1. 客戶(hù)端無(wú)信任 CA:在此種情況下,即使客戶(hù)端沒(méi)有信任密鑰庫 (keystore),也仍然會(huì )受到信任
通過(guò)使用 -Dweblogic.webservice.client.ssl.strictcertchecking=false
可實(shí)現這一點(diǎn)。此標志將指示您是否要對客戶(hù)端強制信任(即,它禁用嚴格的證書(shū)檢查)。
例如:
>java -Dweblogic.security.SSL.verbose=true
-Dweblogic.webservic.celient.ssl.strictcertchecking=false examples.webservices.basic.javaclass.SSLClient
該標志將起作用,并且Dweblogic.security.SSL.verbose 將顯示:
<23 mars 2005 16 h 56 TU>
<Debug>
<TLS>
<000000>
<Cannot complete the certificate chain: No trusted cert found>
2. 客戶(hù)端的受信任 CA
要為客戶(hù)端指定受信任 CA,必須同時(shí)指定命令行參數
-Dweblogic.webservic.celient.ssl.strictcertchecking=true 和 -Dweblogic.webservice.client.ssl.trustedcertfile,后者將指定受信任的 CA。
例如:
>java
-Dweblogic.security.SSL.verbose=true
-Dweblogic.webservice.client.ssl.trustedcertfile=
D:\_wk\SupportPatterns\WLS\SSLWebServices\mydomain\caem -Dweblogic.webservice.client.ssl.strictcertchecking=
true examples.webservices.basic.javaclass.SSLClient
該參數將如期指定客戶(hù)端受信任的 CA。
返回頁(yè)首。客戶(hù)端出現了哪些問(wèn)題?
如果您在嘗試通過(guò)單向 SSL 與客戶(hù)端連接時(shí)遇到一些問(wèn)題,請打開(kāi)
weblogic.security.SSL.verbose,然后您可能會(huì )注意到下列內容:
問(wèn)題 1:javax.net.ssl.SSLKeyException:FATAL Alert:BAD_CERTIFICATE
<23 mars 2005 17 h 00 TU>
<Debug>
<TLS>
<000000>
<Cannot complete the certificate chain:No trusted cert found>
<23 mars 2005 17 h 00 TU> <Debug>
<TLS>
<000000>
<NEW ALERT with Severity:FATAL, Type:42
解決辦法:
您可能有一個(gè)不指定任何信任 CA 的 Webservice 客戶(hù)端。您可使用
-Dweblogic.webservice.client.tslrustedcertfile 指定一個(gè)信任 CA,也可使用 -Dweblogic.webservice.client.ssl.ttrictcertchecking=false 對客戶(hù)端禁用信任
問(wèn)題 2: validationCallback:validateErr = 16
<29 mars 2005 11 h 56 BST>
<Debug> <TLS> <000000> <HANDSHAKEMESSAGE:Certificate>
<29 mars 2005 11 h 56 BST>
<Debug> <TLS> <000000> <validationCallback:validateErr = 16>
<29 mars 2005 11 h 56 BST>
<Debug> <TLS> <000000>
<Required peer certificates not supplied by peer>
解決辦法:服務(wù)器請求客戶(hù)端證書(shū),而您尚未按客戶(hù)端提供證書(shū)。如果您試圖只建立單向 SSL 連接,則請確保將服務(wù)器配置為執行此項操作(不強制您提供證書(shū))
返回頁(yè)首。通過(guò)雙向 SSL 調用 Webservices
我們將在此處預演雙向 SSL 配置。
準備工作
為了準備雙向 SSL,請使用下列客戶(hù)端證書(shū):
在瀏覽器中將私鑰從 pfx 文件中導出并將其轉換成帶有 openssl 的 pem 文件(例如 openssl pkcs12 -in smalbois.pfx -nodes -nocerts -out private.key)。
公鑰 (pub.pem) 和 2 個(gè) CA(ca_int.pem/ca_root.pem)也是用瀏覽器導出的。
返回頁(yè)首。如何進(jìn)行?
以下是我們一直在使用的示例。
import weblogic.webservice.client.SSLAdapterFactory;
import weblogic.webservice.client.WLSSLAdapter;
import javao.*;
public static void main(String[] argv)
throws Exception
{
SSLAdapterFactory factory = SSLAdapterFactoryetDefaultFactory();
WLSSLAdapter adapter = (WLSSLAdapter) factoryetSSLAdapter();
System.out.println("Loading client certs from "+argv[0]);
// clientCredentialFile stores in PEM format the public key and
// all the CAs associated with it + then the private key. All this in // a concatenated manner
FileInputStream clientCredentialFile = new FileInputStream ("D:/_wk/SupportPatterns/WLS/SSLWebServices/mydomain/publicCAprivkeyem");
// private key password
String pwd = "canpass";
adapteroadLocalIdentity(clientCredentialFile, pwdoCharArray());
adapter.setVerbose(true);
adapter.setTrustedCertificatesFile("D:/_wk/SupportPatterns/WLS/SSLWebServices/mydomain/caem");
adapter.setStrictChecking(false);
factory.setDefaultAdapter(adapter);
factory.setUseDefaultAdapter(true);
HelloWorld_Impl ws = new HelloWorld_Impl(argv[0]);
HelloWorldPort port = wsetHelloWorldPort();
String returnVal = portayHello(4, "Sebastien");
Systemutrintln("The client passed the Values 4 and A to the
webservice, and got back this result:");
System.outrintln(returnVal);
}
文件 publicCAprivkey.pem 包含 public.pem + ca_int.pem + ca_root.pem 和 private.pem 文件(所有文件都首尾相連)。為 setTrustedCertificatesFile 指定的 pem 文件是服務(wù)器的 CA(請參閱上文中有關(guān)該文件的解釋?zhuān)?div style="height:15px;">
返回頁(yè)首。如何調試?
需要將服務(wù)器配置為允許雙向通訊。如果要確保情況正是如此,請使用 Web 瀏覽器,并通過(guò) https 請求 WSDL。請求頁(yè)面,并查看是否可以建立 SSL 連接(如果它顯示 WSDL)。如果可以建立 SSL 連接并且您的瀏覽器中有客戶(hù)端證書(shū),請詢(xún)問(wèn)服務(wù)器管理員是否還要將 SSL 配置設為要求客戶(hù)端證書(shū)。
要確保在 WebLogic 上進(jìn)行此項設置,請轉到控制臺:
轉到服務(wù)器的密鑰庫 (keystore) 和 SSL 選項卡
向下滾動(dòng)該頁(yè)并顯示高級選項
Two Way Client Cert Behavior:Client Certs Requested and Enforced 或 Client Certs Requested and not Enforced
“Client Certs Requested and Enforced”將確保在提供“客戶(hù)端證書(shū)”的情況下可以建立 SSL 連接(雙向 SSL 連接)。
“Client Certs Requested and not Enforced”讓您在不使用客戶(hù)端證書(shū)的情況下仍然可以建立單向 SSL 連接。
如果想調試 SSL 層 (layer),則可在客戶(hù)端和服務(wù)器(如果也是在 WebLogic 上運行)上添加下列內容:
java -Dweblogic.security.SSL.verbose=truesetrue
返回頁(yè)首。客戶(hù)端出現了哪些問(wèn)題?
客戶(hù)運行與上面示例類(lèi)似的示例時(shí),可能會(huì )遇到以下問(wèn)題:
問(wèn)題 1:CERT_CHAIN_INCOMPLETE
<25 mars 2005 10 h 38 TU> <Debug> <TLS> <000000> <Trust failure (68): CERT_CHAIN_INCOMPLETE>
<25 mars 2005 10 h 38 TU> <Debug> <TLS> <000000> <NEW ALERT with Severity:FATAL, Type:40
java.lang.Exception:New alert stack
解決辦法:
包含證書(shū)的文件 clientCredentialFile 沒(méi)有所需的所有鏈路。請確保公鑰首先位于該文件中,而且確保具有私鑰的 CA 跟在后面。
問(wèn)題 2:Identity Assertion Failed, Unsupported Token Type:X09
[java] java.rmi.RemoteException:SOAP Fault:javax.xml.rpc.soap.SOAPFaultException:[Security:090380]Identity Assertion Failed, Unsupported Token Type:X09
解決辦法:
需要對身份聲明進(jìn)行配置。
執行方法如下:
打開(kāi) WebLogic 控制臺
- Security
- Realms
- Providers
- Authentication
- Select DefaultIdentityAsserter
- Select X509 for the types
然后轉到詳細信息(列表)
- Select Use Default User Name Mapper
- Default User Name Mapper Attribute Type:例如 CN
- Default User Name Mapper Attribute Delimiter:“”
然后應用配置?,F在,重新啟動(dòng)服務(wù)器。
問(wèn)題 3:Use Default User Name Mapper
[java] Caused by: javax.xml.rpc.soap.SOAPFaultException: [Security:090377]Identity Assertion Failed, weblogic.security.spi.IdentityAssertionException: [Security:090243]user Name Mapper class not configured - cannot assert identity
解決辦法:
這是未在控制臺中選擇的 Use Default User Name Mapper 的問(wèn)題。
要對其進(jìn)行配置,請檢查如下內容:
打開(kāi) WebLogic 控制臺
Security
Realms
Providers
Authentication
Select DefaultIdentityAsserter
Select X509 for the types
然后轉到詳細信息(列表)
Select Use Default User Name Mapper
Default User Name Mapper Attribute Type:例如 CN
Default User Name Mapper Attribute Delimiter:“”
然后應用配置?,F在,重新啟動(dòng)服務(wù)器。
問(wèn)題 4:Authentication Failed:User SMALBOIS02 javax.security.auth.login.LoginException
[java] javax.rmi.RemoteException: SOAP Fault:javax.xml.rpc.soap.SOAPFaultException: [Security:090304]Authentication Failed: User SMALBOIS02 javax.security.auth.login.LoginException: [Security:090300]Identity Assertion Failed: User SMALBOIS02 does not exist
解決辦法:
您使用的是雙向 SSL,服務(wù)器已識別您的客戶(hù)端證書(shū)、使用了身份聲明,只是無(wú)法識別 Realm 中的用戶(hù)。檢查用戶(hù)是否存在于您使用的 Realm 中(例如,內嵌 LDAP 或任何外部用戶(hù)儲存庫 ldap 等…)
問(wèn)題 5:BAD_CERTIFICATE
客戶(hù)端顯示:
[java] <25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <NEW ALERT: comerticomlsecordlert.Alert@1cf7491 Severity: 2 Type: 42
[java] <25 mars 2005 14 h 58 TU> <Warning> <Security> <BEA-090482> <BAD_CERTIFICATE alert was received from localhost - 127. Check the peer to determine why it rejected the certificate chain (trusted CA configuration, hostname verification). SSL debug tracing may be required to determine the exact reason the certificate was rejected.>
[java] <25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <close(): 24374386>
服務(wù)器端顯示:
<25 mars 2005 14 h 58 TU> <Warning> <Security> <BEA-090478> <Certificate chain received from localhost - 127 was not signed properly causing SSL handshake failure.>
<25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <Validation error = 1>
<25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <Certificate chain is invalid>
<25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <User defined JSSE trustmanagers not allowed to override>
<25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <SSLTrustValidator returns: 65>
<25 mars 2005 14 h 58 TU> <Debug> <TLS> <000000> <Trust failure (65): CERT_CHAIN_INVALID>
解決辦法:
clientCredentialFile 中證書(shū) CA 的順序錯誤。如果將中間 CA 放置在根 CA 之后,則可能出現這種情況。
問(wèn)題 6: CERT_CHAIN_INCOMPLETE CERT_CHAIN_UNTRUSTED
<25 mars 2005 15 h 10 TU> <Debug> <TLS> <000000> <SSLTrustValidator returns: 84>
<25 mars 2005 15 h 10 TU> <Debug> <TLS> <000000> <Trust failure (84): CERT_CHAIN_INCOMPLETE CERT_CHAIN_UNTRUSTED>
解決辦法:
受信任的存儲可能不正確。請使用諸如 openSSL 之類(lèi)的工具來(lái)驗證鏈路。
返回頁(yè)首。特定版本已知問(wèn)題
WLS 8 SP3 上的一些已知問(wèn)題:
[java] java.net.UnknownHostException: null
[java] at java.net.PlainSocketImplonnect(PlainSocketImplava:153)
[java] at java.net.Socketonnect(Socketava:452)
[java] at java.net.Socketonnect(Socketava:402)
[java] at java.net.Socket.<init>(Socketava:309)
[java] java.rmi.RemoteException: SOAP
Fault:javax.xml.rpc.soap.SOAPFaultException: Failed to send request
[java] Detail:
[java] <detail>
[java] at java.net.Socket.<init>(Socketava:124)
[java] at java.netsl.SSLSocket.<init>(DashoA6275)
[java] <bea_fault:stacktrace
xmlns:bea_fault="http://wwweaom/servers/wls70/webservice/fault/1">
javaet.UnknownHostException: null
解決辦法:
應用修補程序 CR197698_810sp3ar-這只是一個(gè)客戶(hù)端修補程序
WLS8SP2/SP3/SP4 上的已知問(wèn)題-SSL CLOSE_WAIT socket 上的 WebService,socket 泄露和明顯的內存泄露
服務(wù)器讓 SOAP 通過(guò) HTTPS 調用 Sun One Identity Server 時(shí)的 socket 泄露。Netstat 輸出在每次調用后顯示“空閑”socket 增加。每次調用后,下列警報都被記錄到 WLS 日志中:
<Debug> <TLS> <000000> <NEW ALERT:
comerticomlsecordlert.Alert@2b7bd9 Severity: 1 Type: 0
java.lang.Throwable: Stack trace
at weblogic.security.utils.SSLSetupebug(SSLSetupava:265)
at com.certicom.tls.record.alert.Alert.<init>(Unknown Source)
at com.certicom.tls.record.alert.
AlertHandlerandleAlertMessages(Unknown Source)
at com.certicom.tls.record.ReadHandlernterpretContent(Unknown Source)
at com.certicom.tls.record.ReadHandlereadRecord(Unknown Source)
at com.certicom.tls.record.ReadHandleread(Unknown Source)
at java.io.BufferedInputStream.fill(BufferedInputStreamava:183)
at java.io.BufferedInputStream.read1(BufferedInputStreamava:222)
at java.io.BufferedInputStream.read(BufferedInputStreamava:280)
at java.io.FilterInputStream.read(FilterInputStreamava:111)
at java.io.FilterInputStream.read(FilterInputStreamava:90)
at com.sun.xml.messaging.saaj.client.p2p.
HttpSOAPConnection.readFully(HttpSOAPConnectionava:604)
解決辦法:
該問(wèn)題稱(chēng)為 CR211853 - WLS 8 SP3-服務(wù)器讓 soap 通過(guò) https 調用 Sun One Identity Server 時(shí)的 socket 泄露。
可使用 8SP2/8SP3/81SP4 修補程序-請與 BEA 支持部門(mén)聯(lián)系
8SP3 上可導致“內存”泄露的已知問(wèn)題
WLS 8 SP3-HTTPSClient 內存泄露
解決辦法:
CR214423-可使用 8SP3 修補程序,請與 BEA 支持部門(mén)聯(lián)系
一般的已知問(wèn)題
您可定期查看您的 WLS 版本的“發(fā)行說(shuō)明”以獲得 Service Pack 中的“已知問(wèn)題”或“已解決的問(wèn)題”的詳細信息,而且還可瀏覽與 Webservice 有關(guān)的問(wèn)題。方便起見(jiàn),下面提供了這些發(fā)行說(shuō)明的鏈接:
WLS 8 Release Notes (English)WLS 7 Release Notes (English)WLS 6 Release Notes (English)搜索還將返回“發(fā)行說(shuō)明”,以及其它“支持解決方法”和與 CR 相關(guān)的信息(在
需要更多幫助?中說(shuō)明)。如果客戶(hù)簽訂了技術(shù)支持合同,則可以登錄
http://support.bea.com/,登錄后會(huì )看到為 Solutions 和 Bug Central 提供的 Browse portlet,可在其中按產(chǎn)品版本瀏覽最新提供的 CR。
需要更多幫助?
如果您已經(jīng)理解這個(gè)模式,但仍需要其它幫助,您可以: 在
http://support.bea.com/上查詢(xún) AskBEA(例如,使用“webservices and SSL”),以發(fā)現其它已發(fā)布的解決辦法。技術(shù)支持合同客戶(hù):確保已經(jīng)登錄,可以訪(fǎng)問(wèn)提供的與 CR 有關(guān)的信息。 在
http://newsgroups.bea.com/ 上,向 BEA 的某個(gè)新聞組提出更詳細具體的問(wèn)題。
如果這還不能解決您的問(wèn)題,并且您擁有有效的技術(shù)支持合同,您可以通過(guò)登錄以下網(wǎng)站來(lái)打開(kāi)支持案例:
http://support.bea.com/。