利用WSE 加密SOAP报文(3)

** WSE ** ** 对加密的支持 ** ** **

** ** WSE 支持对 SOAP 报文的部分加密 . 对称加密使用一个共享的密钥 , 不对称加密支持使用 x.509 证书 . 当使用 WSE 来加密 SOAP 报文时 , 整个 body 节点的内容被加密 , 除非明确指定不要加密 . 下面举了 2 个例子 , 一个加密这个主体部分 , 一个加密部分 .

WSE 运行时库实现了所有的 WS-security. 在 SecurityInputFilter 和 SecurityOutputFilter 类中 SecurityOutputFilter 类中 . 前者通过查找 Security 节点在一个

进入的 SOAP 报文中 , 如果该节点存在 . 它创建了一个代表任意安全标记和加密密钥 , 解密节点 , 验证任何数字签名的对象 . 对于一个进入的报文 , 任何任何安全的节点都剋通过报文产生的 SOAPcontext 对象的安全属性进行访问 . 相反的 , SecurityOutputFilter 为进出报文实施加密和签名的操作 , 附带任何特定的安全标记或者加密密钥 . 安全措施 , 比如添加标记 , 加密 , 或者签署进出报文利用报文的 SOAPContext.Security 和 SOAPContext.ExtendedSecurity 属性 , ExtendedSecurity 只在需要创建安全报头时候使用 Security 属性只在为包含最终目的地时使用

** 配置 ** ** WSE **

尽管在安装时 ,WSE 已经被安装到 asp.net Web 服务器上 , 但是还需要一些额外的配置 , 如果需要那些 asp.net 应用使用安全支持的话 . 当创建完毕 asp.net Web 服务后工程后 ,visual studio.net, 引用 Microsoft.Web.Services.dll 程序集需要加载到该项目中 . 你也需要对 SOAPExtensionTypes 节点添加一个新的 SOAP 扩展 . 这可在 Web.config 文件中创建一个新的 add 节点 . 如下所示

 1<configuration>
 2<system.web>
 3
 4... 
 5
 6<webservices>
 7<soapextensiontypes>
 8<add group="0" priority="1" type="Microsoft.Web.Services.WebServicesExtension, 
 9
10Microsoft.Web.Services, 
11
12Version=1.0.0.0, 
13
14Culture=neutral, 
15
16PublicKeyToken=31bf3856ad364e35"></add>
17</soapextensiontypes>
18</webservices>
19</system.web>
20</configuration>

type 属性的值必须不能包含任何间断或者额外的空格 . 这个例子为了可读性有额外的换行 . 如果 ** WebServices ** 和 ** SOAPExtensionTypes ** 节点不存在 , 它们必须加到 Web.config 文件里面 . 一种更容易的方法是完全 WSE 配置工具 . 一种 visual studio 的插件 , 使用它您可以非常容易的配置使用 WSE 的 Web service 项目 . 当然还有一下其他相关的配置必须手工配置 .

当使用 WSE 进行编程时 , 你需要添加一个 Microsoft.Web.Services 和一个 System.security 名字空间的引用 . 在客户端和服务器端的工程中 , 如果既在客户请求和服务器回应中加密了 . 在客户部分你应该使用添加 Web 引用工具为基于 WSE 的 Web service 工程产生 Web service 代理 .

** 给 ** ** SOAP ** ** 报文进行对称加密 **

接下来, 让我们再来看看如何用 WSE来给SOAP报文使用对称密钥加密 。下面的例子是基于一个启用 WSE 的 Web 服务的,这个 Web 服务将返回一个 SOAP 回应报文,在该报文正文内包含了一些敏感数据。这么说,客户端给服务发送一个简单的 Web 服务请求,该请求将返回一个由三元 DES 对称加密算法(使用了一个共享密钥和一个初始向量, IV )加密过的 XML 文档,当客户端收到了加密后的回应信息后, ** SecurityInputFilter ** 将调用一个在客户端的解密密钥提供程序,来访问客户端上相同的共享密钥,以此来对报文体进行解密,这个解密密钥提供程序必须由你来编写,并且提供一个用于同步共享密钥的方法。这些例子假设双方都知道密钥,并且我们所要做的,仅仅是提供密钥的名字,以此作为一个暗示,给对方知道我们用的是哪个密钥加密的信息。

双方之间管理、同步和和对密钥保密的时候一定要多加小心。有个解决方案使用了一个 分布式密钥机制 ,例如 Kerberos 。但从 WSE 的 1.0 版本开始, WSE 就不再继续支持 Kerberos 了。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus