分享

Webservice 和 SSL 问题故障排除

 david.tao 2006-03-28

Webservice 和 SSL 问题故障排除(传输级安全性)


问题描述
利用传输级安全性,可通过使用“安全套接字层”(Secure Sockets Layer,SSL)来保护客户端应用程序与 WebLogic 服务器之间的连接。SSL 通过允许两个通过网络连接的应用程序验证对方的身份以及对应用程序间交换的数据进行加密,来提供安全的连接。身份验证允许服务器和客户端(可选)验证网络连接另一端的应用程序的身份。加密使通过网络传输的数据只能被目标接收者理解。

编写本文档的目的是为了探讨客户在使用 WebService 和 SSL 时引发的大部分问题。如果尚未阅读支持模式“理解和探查 SSL 问题”,请阅读它

本文将讨论单向 SSL 和双向 SSL 中的多数常见问题。并将说明如何完成测试。使用的代码示例来自:
WEBLOGIC_HOME\\samples\server\examples\src\examples\webservices\basic\javaclass

快速链接
适宜的文档
此文档中的链接

通过单向 SSL 调用 Webservice
准备工作
您需要确保服务器在监听 SSL 端口。

现在,我们将假定服务器有下列密钥库 (keystore):

java utils.ImportPrivateKey serverks weblogic keyserver weblogic  publicem  SMALBOIS02-keyer

受信任 CA 密钥库 (keystore) 定义如下:
keytool -import -trustcacerts -alias CA -file caem -keystore trustks -storepass weblogic

启动 WebLogic 服务器并单击锁之后,您将获得:

证书服务器

现在,我们将使用的文件是 ca.pempublic.pem
CA.PEM 包含的证书显示为“For VeriSign authorized testing only.No assurances (C)VS1997»
PUBLIC.PEM 包含 CA.PEM + SMALBOIS02-keyer(服务器证书)的公钥-两个连接在一起。

返回页首。

如何进行?
设置起来很简单。只需要指定一个 https url 来访问 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>


然后,以下列方式访问 WDSL:
<arg value="https://localhost:${port}/basic_javaclass/HelloWorld?WSDL"/>

如何调试?
需要将服务器配置为允许单向通讯。如果要确保情况正是如此,请使用 Web 浏览器,并通过 https 请求 WSDL。如果您可访问该链接,而浏览器上却未安装客户端证书,则您应该能够通过单向 SSL 访问 Webservice 而不会出现任何问题。

如果 WebLogic 上正在运行 Web Service,您可先确保 SSL 端口已打开。然后,打开 WebLogic 控制台,并检查 SSL 设置:
    转到服务器的密钥库 (keystore) 和 SSL 选项卡
    向下滚动该页并显示高级选项
       Two Way Client Cert Behavior:Client Certs Not Requested 或 Client Certs Requested but not Enforced

上述这些设置将确保能够在不提供客户端证书的情况下建立 SSL 连接(在此种情况下,SSL 连接将是双向 SSL 连接)。

如果想调试 SSL 层 (layer),则可在客户端和服务器(如果也是在 WebLogic 上运行)上添加下列内容:
    java  -Dweblogi.security.SSL.verbose=true

调用客户端 Webservice 时,可定义下列内容:

1. 客户端无信任 CA:在此种情况下,即使客户端没有信任密钥库 (keystore),也仍然会受到信任

通过使用 -Dweblogic.webservice.client.ssl.strictcertchecking=false
可实现这一点。
此标志将指示您是否要对客户端强制信任(即,它禁用严格的证书检查)。

例如:
>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. 客户端的受信任 CA

要为客户端指定受信任 CA,必须同时指定命令行参数
-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


该参数将如期指定客户端受信任的 CA。

返回页首。

客户端出现了哪些问题?
如果您在尝试通过单向 SSL 与客户端连接时遇到一些问题,请打开
weblogic.security.SSL.verbose,然后您可能会注意到下列内容:

问题 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


解决办法:
您可能有一个不指定任何信任 CA 的 Webservice 客户端。您可使用
-Dweblogic.webservice.client.tslrustedcertfile 指定一个信任 CA,也可使用 -Dweblogic.webservice.client.ssl.ttrictcertchecking=false 对客户端禁用信任

问题 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>

解决办法:服务器请求客户端证书,而您尚未按客户端提供证书。如果您试图只建立单向 SSL 连接,则请确保将服务器配置为执行此项操作(不强制您提供证书)

返回页首。

通过双向 SSL 调用 Webservices
我们将在此处预演双向 SSL 配置。

准备工作
为了准备双向 SSL,请使用下列客户端证书:

证书客户端

在浏览器中将私钥从 pfx 文件中导出并将其转换成带有 openssl 的 pem 文件(例如 openssl pkcs12 -in smalbois.pfx -nodes -nocerts -out private.key)。
公钥 (pub.pem) 和 2 个 CA(ca_int.pem/ca_root.pem)也是用浏览器导出的。

返回页首。

如何进行?
以下是我们一直在使用的示例。

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 文件是服务器的 CA(请参阅上文中有关该文件的解释)。

返回页首。


如何调试?
需要将服务器配置为允许双向通讯。如果要确保情况正是如此,请使用 Web 浏览器,并通过 https 请求 WSDL。请求页面,并查看是否可以建立 SSL 连接(如果它显示 WSDL)。如果可以建立 SSL 连接并且您的浏览器中有客户端证书,请询问服务器管理员是否还要将 SSL 配置设为要求客户端证书。

要确保在 WebLogic 上进行此项设置,请转到控制台:
    转到服务器的密钥库 (keystore) 和 SSL 选项卡
    向下滚动该页并显示高级选项
       Two Way Client Cert Behavior:Client Certs Requested and Enforced 或 Client Certs Requested and not Enforced

Client Certs Requested and Enforced”将确保在提供“客户端证书”的情况下可以建立 SSL 连接(双向 SSL 连接)。
“Client Certs Requested and not Enforced”让您在不使用客户端证书的情况下仍然可以建立单向 SSL 连接。

如果想调试 SSL 层 (layer),则可在客户端和服务器(如果也是在 WebLogic 上运行)上添加下列内容:
    java  -Dweblogic.security.SSL.verbose=truesetrue

返回页首。

客户端出现了哪些问题?
客户运行与上面示例类似的示例时,可能会遇到以下问题:

问题 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

解决办法:
包含证书的文件 clientCredentialFile 没有所需的所有链路。请确保公钥首先位于该文件中,而且确保具有私钥的 CA 跟在后面。

问题 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

解决办法:
需要对身份声明进行配置。

执行方法如下:

打开 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:“”

然后应用配置。现在,重新启动服务器。

问题 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 的问题。

要对其进行配置,请检查如下内容:

打开 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:“”

然后应用配置。现在,重新启动服务器。

问题 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,服务器已识别您的客户端证书、使用了身份声明,只是无法识别 Realm 中的用户。检查用户是否存在于您使用的 Realm 中(例如,内嵌 LDAP 或任何外部用户储存库 ldap 等…)

问题 5:BAD_CERTIFICATE

客户端显示:

     [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>

服务器端显示:

<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 中证书 CA 的顺序错误。如果将中间 CA 放置在根 CA 之后,则可能出现这种情况。

问题 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 之类的工具来验证链路。

返回页首。

特定版本已知问题
WLS 8 SP3 上的一些已知问题:
     [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-这只是一个客户端修补程序

WLS8SP2/SP3/SP4 上的已知问题-SSL CLOSE_WAIT socket 上的 WebService,socket 泄露和明显的内存泄露

服务器让 SOAP 通过 HTTPS 调用 Sun One Identity Server 时的 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)


解决办法:
该问题称为 CR211853 - WLS 8 SP3-服务器让 soap 通过 https 调用 Sun One Identity Server 时的 socket 泄露。 
可使用 8SP2/8SP3/81SP4 修补程序-请与 BEA 支持部门联系

8SP3 上可导致“内存”泄露的已知问题
    WLS 8 SP3-HTTPSClient 内存泄露

解决办法:
CR214423-可使用 8SP3 修补程序,请与 BEA 支持部门联系

一般的已知问题
您可定期查看您的 WLS 版本的“发行说明”以获得 Service Pack 中的“已知问题”或“已解决的问题”的详细信息,而且还可浏览与 Webservice 有关的问题。方便起见,下面提供了这些发行说明的链接:
搜索还将返回“发行说明”,以及其它“支持解决方法”和与 CR 相关的信息(在需要更多帮助?中说明)。如果客户签订了技术支持合同,则可以登录 http://support./,登录后会看到为 Solutions 和 Bug Central 提供的 Browse portlet,可在其中按产品版本浏览最新提供的 CR。

需要更多帮助?
如果您已经理解这个模式,但仍需要其它帮助,您可以:
  1. http://support./上查询 AskBEA(例如,使用“webservices and SSL”),以发现其它已发布的解决办法。技术支持合同客户:确保已经登录,可以访问提供的与 CR 有关的信息。
  2. http://newsgroups./ 上,向 BEA 的某个新闻组提出更详细具体的问题。
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support./

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多