摘要
消息级安全性是企业级SOA的基础。通过使用SOAP加密和SOAP签名,机密性和完整性由于独立于传输协议而能够“始终保持”。因为安全性现在内置于SOAP消息内,所以Web服务使用者、生产者或中间人之间的传输管道(HTTP、FTP、JMS)是否支持SSL无关紧要。
本教程将介绍如何设置SOAP消息级加密。从支持选择的关键存储、启用消息级加密以及在SOAP头中发送X.509
证书开始,您将学习如何支持消息级机密性。您将看到如何诊断安全策略,从而通过从基于.NET的客户端发送SOAP消息来实现功能完整性、性能和互操作性。沿此方法您会发现BEA
WebLogic Server 9.2 (WLS)提供了一个成熟的平台,此平台具有面向高级SOA部署的强大的消息级安全功能。
简介
Web services(现代面向服务的架构(SOA)的公共基础)使企业内的网络设备、应用程序、ESB、应用服务器、数据库和其他IT资产之间的界线变得模糊了。现在几乎每个IT资产都将其接口宣传为为SOAP/XML消息传递准备的Web
Services Definition Language (WSDL)接口。Web服务接口在跨内部和外部企业领域集成IT资产方面提供了前所未有的灵活性。然而,正是这种灵活性反过来跨这些领域要求更大的安全控制。为了确保消息在跨领域传递时的安全性,基于协议和消息的安全技术被广泛部署。
WebLogic Server 9.2提供了多种协议级和消息级机制,来保障跨IT资产的SOAP/XML消息交换。通过提供具有以下额外优势的消息级安全供应,WebLogic
Server扩展了经典SSL传输级安全性:
- 粒度安全性 ——对SOAP消息的任意选择部分进行消息级加密。
- 始终保持的安全性 ——SSL会话建立后,SSL安全特性会始终保持。使用消息级安全性,SOAP消息甚至在SSL连接中止后依然能够被加密。现在安全性内置于消息且独立于传输。
WebLogic Server通过其对WS-Security 1.0规范(此规范于2004年3月由OASIS批准为正式标准)的广泛支持,提供了消息级安全性。此规范涉及SOAP消息级加密、解密和多种用于交换身份令牌(例如用户名令牌、X.509证书、SAML断言和嵌入在SOAP头中的Kerberos票证)的令牌配置文件。
要开始在WebLogic Server中使用消息级加密,理解公钥和私钥使用的基础是至关重要的。Entrust撰写的"What
is PKI?"提供了对重要PKI概念的实用描述。以下是一些概念摘要:
- 公钥和私钥 ——公钥和私钥是互补的:公钥用于加密,私钥用于消息解密。公钥贯穿供应过程且作为X.509证书提供给“公众”。X.509证书携带关于证书拥有者的详细信息(例如姓名和电子邮件地址)和关于认证授权(CA)的额外信息(此信息用于证明X.509证书中包含的公钥的有效性和完整性)。私钥不能离开企业,它是安全基础设施的“王冠”。
- 信任X.509证书 ——无论X.509证书何时出现,接受者必须验证此X.509是可信的。这种信任由证书链遍历建立,证书链遍历是X.509接受者验证发证机关(认证授权)确实发布了当前X.509证书的一种机制。接受者要求的额外检查是检查此X.509证书是否被撤消。此项检查是通过在证书吊销列表(CRL)中存储的撤消的证书列表中查询此X.509的序列号来实现的。您可以选择不使用发布的认证授权(CA),而使用自我签署的证书。此类证书必须在接受者处注册为可信、无需证书链验证的证书。
- JKS(Java Key Store)是X.509证书和私钥的便携存储库,基于Java的应用程序使用它实现加密操作。
让我们看看如何使用这些加密组件来在WebLogic Server中进行消息级加密。
需要的软件
为了说明消息级加密,我们使用Workshop for WebLogic Platform创建了一个具有简单操作getCreditScore(int
ssn) 的示例Web服务。此操作随后用于设置消息级加密。
需要以下组件来说明消息级加密:
- BEA WebLogic Portal 9.2:此安装程序包括WebLogic
Server和Workshop for WebLogic Platform (IDE),将用于加载、发布、运行简单的Web服务以及设置消息级加密。
- Crosscheck Networks SOAPSonar Enterprise
Edition:基于.NET的SOAP客户端,用于实现与基于Java的WebLogic
Server的WS-Security 1.0互操作性测试。
- keys.zip:包含Java Key Stores (JKS) DemoTrust.jks和几个X.509证书的压缩文件。DemoTrust.jks用于注册可信的X.509证书,客户会将这些证书发送到WebLogic
Server来加密SOAP应答。
设置
如图1所示,SOAPSonar和WebLogic Server安装在不同的机器上。此配置是推荐配置但不是必须配置——两个产品可以安装在一台资源丰富的机器上。
图1. WebLogic Server消息级加密起步设置
在以下步骤中,我们将设置一个简单的Web服务 getCreditScore(int ssn)
,此服务是从基本WebLogic Server安装提供的示例中加载的。调用package services
中的CreditScoreSerivce.java的Java类包含一个单一操作(WebMethod),如下所示:
package services;
import javax.jws.*;
@WebService
public class CreditScoreService {
static final long serialVersionUID = 1L;
/**
* Returns the credit score for a given SSN.
* Returns -1 if an invalid SSN is entered.
*/
@WebMethod
public int getCreditScore(int ssn) {
if (ssn > 0 && ssn < 300000000)
return 500;
if (ssn >= 300000000 && ssn < 600000000)
return 600;
else if (ssn >= 600000000 && ssn <= 999999999)
return 700;
else
return -1;
}
}
在WebLogic Server Workshop中加载CreditScoreService.java之后,我们将为此类发布一个WSDL。在设计时,此WSDL可被Java或.NET客户端方便地使用来支持客户端和WebLogic
Server之间的SOAP消息传递。然后我们将支持一个消息级安全策略来加密来自操作 getCreditScore(int
ssn)的SOAP应答。为了实现此操作,我们还将加载具有可信X.509证书的Java Key Store,并将X.509证书注入到SOAP请求头中。
第1步:通过Workshop支持示例Web服务
- 安装WebLogic Server。也要安装Workshop。使用默认设置启动服务器。
- File > Import > Existing Projects into
Workspace > Select archive file > ?Browse
to the ZIP fileBEA_HOME/workshop92/workshop4WP/samples/workspaces/AdvancedWSTutorial/AdvancedWSTutorial.zip
然后单击Open > 单击 Finish。
- 双击CreditScoreWS>src>services.>CreditScoreService.java。此Java文件包含一个具有单一操作
getCreditScore(int ssn)的Web服务。操作代码如图2所示。
图2. 在Workshopfor WebLogic Platform中加载示例Web服务
- 在Package Explorer中,右击CreditScoreService.java
并选择Run As>Run on Server。选择默认运行时服务器BEA WebLogic
v9.2 Server。
- 打开一个具有测试客户端的窗口,如图3所示。现在您可以发送SOAP请求了,其方法是为getCreditScore操作输入ssn输入值。
图3. Workshop for WebLogic提供的内置Web services测试客户端
- 作为可选项,您可以通过以下URL在浏览器中调用getCreditScore 操作:http://wlshost:7001/CreditScoreWS/CreditScoreService
(其中 wlshost 是您的WebLogic Server的主机名或IP地址)。
瞧!第1步结束了,现在您能够轻松地发布Web服务,并从Workshop的内置测试客户端中或通过使用Web浏览器来调用它。
第2步:安装和配置SOAPSonar
上面图3中显示的Workshop for WebLogic Platform包括一个方便的嵌入式SOAP客户端,用于发送SOAP请求和检查来自WebLogic
Server的SOAP应答。然而,它不能在SOAP头中加载X.509证书。为了支持SOAP请求头中的X.509证书装载,我们使用来自Crosscheck
Networks的一个简单的.NET客户端SOAPSonar
Enterprise Edition。可从Crosscheck
Networks下载SOAPSonar Enterprise Edition试用版。
下载和安装了SOAPSonar之后,运行产品并加载Web Services Endpoint
http://wlshost:7001/CreditScoreWS/CreditScoreService?WSDL
(其中 wlshost 是您的WebLogic Server的主机名或IP地址)。SOAPSonar解析WebLogic
WSDL,并在左导航面板中呈现操作。用户能够填充操作请求字段、按下提交箭头,并在应答面板中检查SOAP应答。
图4. 在SOAPSonar Diagnostic Tool中加载WebLogic
Server WSDL
在随后的步骤中,SOAPSonar将用于把X.509证书注入到SOAP请求头中,以便WebLogic
Server能够使用注入的X.509证书加密SOAP应答。
第3步:下载和安装Java Key Store
下载keys.zip。它包括:
- 一个Java Key Store (JKS) DemoTrust.jks。此Java Key
Store作为“可信的存储库”充当X.509证书,因此当外部SOAP客户端将这些X.509证书提交给WebLogic
Server时,它们被WebLogic Server接受和信任,以实现加密操作。如果X.509客户端未出现在DemoTrust.jks,那么会出现一个异常,指示此客户端提交的X.509不可信。
- 两个X.509v3公共证书:cert1024.cer 和 cert2048.cer。X.509证书用于加密SOAP消息,我们将在第4步在SOAPSonar中加载它们。
- 两个密钥对:keypair1024.pfx 和 keypair2048.pfx。这些密钥对包括私钥,而且并不要求设置SOAP加密。它们被添加到keys.zip文件用于参考。
注意:JKS DemoTrust.jks密码是:DemoTrustKeyStorePassPhrase。keys.zip中提供的所有密钥对有相同的密码:password。您无需使用此密钥对密码,因为此密码是用于访问本文中的私钥的。我们关注需要嵌入在X.509证书中的公钥的加密。
加载 DemoTrust.jks:
- 备份位于BEA_HOME/weblogic92/server/lib/ 的原始DemoTrust.jks,并用keys.zip中提供的DemoTrust.jks
替换它。
- 从Workshop for WebLogic Platform重启WebLogic Sever。
注意:如果对JKS进行了更改,那么就应该重启WebLogic Sever。
第4步:在WebLogic Server中配置SOAP加密
WebLogic Server提供粒度级消息级加密。SOAP体的任意部分均可加密。如图1所示,一个SOAP
请求(X.509证书嵌入在SOAP头中)被发送到WebLogic Server。SOAP应答体(Response
Body)会以加密的形式返回。
为了支持图1中显示的SOAP应答加密,管理员只需支持基于WS-Policy的配置,此配置告诉WebLogic
Server为选择的Web服务加密SOAP应答。使用以下简单几步即可完成此配置:
- 启动管理控制台:登录到WebLogic管理控制台 http://localhost:7001/console。默认id和密码均设为:weblogic。
- 导航到 WS-Policy:在主页Lock & Edit上。然后在左导航面板的Domain
Structure下,导航到Deployments > CreditScoreEAR
> CreditScoreServiceService > Configuration
> WS-Policy。
- 配置WS-Policy:展开CreditScoreServiceSoapPort
并单击getCreditScore。单击Next移动到Outbound SOAP Message,然后选择Encrypt.xml
策略并将其移动到右边已选的策略面板(如图5所示)。单击Finish。选择并保存Deployment
Plan Meta-INF ,然后Activate(激活)。
图5. 为发出的消息配置加密策略
- 更新:在主页Lock & Edit上。然后在左导航面板中的Domain
Structure下,导航到Deployments。选择CreditScoreEAR 并单击Update。激活更改。
第4步结束后,您的WebLogic Server就准备好为getCreditScore操作加密SOAP应答了。如图3所示尝试使用Workshop来发送SOAP请求。WebLogic
Server将会提示出错。它现在要求SOAP请求包含可信的X.509证书来加密SOAP应答。
除了Encrypt.xml策略,WebLogic
Server还包括预打包的策略,例如用于指定客户端身份验证策略的Auth.xml,用于设置SOAP消息签名策略的Sign.xml,以及用于配置可靠消息属性(例如重发间隔)的DefaultReliability.xml。
第5步:配置SOAPSonar
本步骤支持SOAPSonar发送SOAP头中含有X509令牌的SOAP请求。任务描述如下:
- 将X.509加载到SOAPSonar。将keys.zip文件移动到运行SOAPSonar的客户端机器。将X509证书提取到一个文件夹。单击
Tools > PKI Management。右击 MY 并选择 Load Certificate。加载证书
cert1024.cer 和 cert2048.cer。
- 将X.509 注入到SOAP头中:在SOAPSonar Request
Panel中,选择Tasks Tab。选择 WS-Tokens 下拉菜单和 Add WSS
X509 Tokens。单击WSS X509 Token Task。会出现如图6所示的面板,此面板允许用户选择X.509证书。选择在之前步骤中加载的cert1024
证书。
图6. 在SOAPSonar中配置注入到SOAP头的X.509
功能测试
为了确保我们为SOAP加密正确配置了WebLogic Server,我们现在将运行几个简单的功能测试。在第一个测试中,我们使用SOAPSonar提交未嵌入X.509证书的SOAP请求。您可以通过在SOAPSonar中关闭WS
X509 Token Task来实现此操作。正如所料,我们得到一个SOAP错误,指示端点(WebLogic
Server)需要X.509令牌:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Failed to get token for tokenType:
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3</faultstring>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
在第二个功能测试中,我们打开SOAPSonar中的WS X509 Token Task,并发送一个具有X.509证书cert1024
(此证书在DemoTrust.jks中注册)的SOAP请求。图7显示了具有SOAP体的请求消息(SOAP头中嵌入了X.509)。
图7. 头中嵌入X.509的SOAP请求
当SOAPSonar进行嵌入X.509的SOAP请求时,WebLogic Server会分析此SOAP请求,从SOAP头提取X.509令牌,并检查信任密钥存储库(DemoTrust.jks)以确认提交的X.509是否注册为可信的X.509证书。由于X.509证书cert1024
已被注册为可信的证书,所以WebLogic Server继续应用第4步中配置的SOAP体加密策略。此加密策略的结果如图8所示。
图8. 具有加密的SOAP体内容的消息应答
图8中的SOAP应答显示了SOAP体使用位于EncryptedData 元素中的内容被加密。X.509令牌数据显示cert1024
证书用于加密。SOAP体应答中的内容现在是保密的,且只能由拥有私钥的人解密为原始数据格式。在SOA中,SOAP解密操作可能由使用者、生产者或中间网关(例如AquaLogic
Service Bus)进行。
针对第三个也是最后一个功能测试,在SOAPSonar中选择cert2048以将其注入到SOAP请求头中,如图6所示。提交了嵌入cert2048
的请求之后,您会得到:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
<soapenv:Body>
<soapenv:Fault xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<faultcode>wsse:InvalidSecurityToken</faultcode>
<faultstring>Security token failed to validate.
weblogic.xml.crypto.wss.SecurityTokenValidateResult@314c3b[status: false][msg [
[
Version: V1
Subject: CN=cert2048, OU=development, O="software, inc.", L=waltham, ST=ma, C=us
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
此应答是SOAP错误,指示当前安全令牌是无效的。出现这种情况是因为cert2048 未在DemoTrust.jks
中注册为可信的证书。为了将证书添加到Java Key Store,请下载keytool,它是Sun
Microsystems提供的命令行工具。记住重启WebLogic Server,以使对Java
Key Store的更改生效。
性能特性
通过使用公钥和私钥,WebLogic Server平台提供消息级加密和签名。用户可根据企业安全策略挑选密钥对。小的密钥量效率高但是不太安全。大的密钥量更安全,但是会消耗可观的计算资源。图9显示了SOAP加密的标准化图表,x轴上标出了不同的密钥量。全部观察值均以512位密钥量为标准,因为512位密钥是测试的最小密钥量,因此它具有最高的性能(和最低的安全性)。从512对应100%开始,增加用于加密SOAP消息的密钥量会导致性能降低,因为需要更高的加密操作开销。
图9. WebLogic Server中消息级加密的相关密钥量描述
密钥量建议
大的密钥量操作,尤其是签名(和解密)所需的私钥操作,从计算角度来说是很昂贵的。相对其对应的私钥操作来说,加密和签名验证所需的公钥操作不是计算密集型的。除非有非常特殊的原因,否则在实践中很少使用超出2048位的密钥量。可使用1024或2048位来实现签名和加密操作。BEA推荐1024或更大的密钥量。
当必须使用1024位以上的密钥量时,请考虑使用加密加速器,例如nCipher Hardware。Securing
WebLogic Server中提供了配置nCipher JCE provider的指令。
互操作性评估
SOAPSonar是基于.NET的客户端,可与基于Java的WebLogic Server无缝交互。跨此Web
services交互的多个方面的无缝互操作性是明显的:
- WebLogic Server生成的WSDL很容易被基于.NET的客户端(例如SOAPSonar)使用和解析。
- 由WebLogic Server生成的WSDL传递由SOAPSonar执行的全部WS-I
Basic Profile Interoperability测试。
-
WS-Security 1.0 X.509 Token Profile用于使用SOAPSonar生成SOAP头中嵌入X.509证书的SOAP请求。此请求随后由WebLogic
Server无缝地处理。
结束语
本文介绍如何设置面向WebLogic Server的消息级加密,以及WebLogic Server如何提供加密SOAP消息所需的粒度。理解密钥管理和PKI基础对于设置消息级加密策略来说是至关重要的。使信任管理成为企业安全策略的有机组成部分同样是至关重要的。知道哪些X.509密钥是有效的和可信的对于建立信任来说是至关重要的,诸如传输级安全性和消息级安全性之类的系统的优劣取决于企业加密密钥的处理和管理。
.NET和Java平台之间的互操作性非常好。基于Java的WebLogic Server 9.2可以方便地处理由基于.NET的客户端SOAPSonar装配的SOAP消息。。使人印象更为深刻的是WebLogic
Server使用由基于.NET客户端生成的、SOAP请求中嵌入X.509的SOAP消息的能力。
现在提供可互操作的、粒度级的消息级加密的强大功能,以确保数据隐私在传输协议之外实现。在SOA内,与隐私相关的策略现在可在消息级测试和实现,从而确保了消息不被有意或无意地泄露,而无需考虑传输安全性。
参考资料