应用WSDK - 实践Web Services的数字签名(上)

原创 2002年12月10日 09:07:00

应用WSDK 实践Web Services的数字签名<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

小气的神

2002-12-05

 

Article Type: In-Depth 

难度等级:8.2/9       

版本:1.36

 

       老实说有关Security(安全)的话题,从来不是我的强项,如果可以我宁愿多说一些有关企业级应用开发、有关组件、COM+的话题。不过Web Services是我喜欢的、Internet是我喜欢的,所以有关Web Services的安全话题是不能逃避的,无论我对这方面多么的贫乏,尝试还是愿意的。世界上的许多事情就是这么奇妙的:我的老哥一心向往天空,不想毕业后却去了海运局工作了很久;我的好友立志30岁才结婚,没想到居然网恋成功,娶得一个貌美贤惠的网友,加上结婚生子现在也还是30未到;而我一直很喜欢广州这座城市的氛围,没想到会迷上广州的饮食,有好吃的城市才是美丽的城市:)

 

       Microsoft XML Web Services 的第一个版本,也就是我们现在用的最多的版本,没有提供对SOAP消息进行安全方面处理的支持,也可以说那时WS-Security 还没完成。WSDK则增加了WS-Security的支持和处理。

 

       最简单的说WS-Security主要提供了三个方面的机制来保护我们年轻的Web Services

1.      Security token propagation (解决Security Credentials可以被在网络间进行传播)

2.      Message integrity (对消息是否在中间点是否被修改进行验证[Verify]

3.      Message Confidentiality ( 保证消息在未解密前依然是机密有效的)

生活最通俗的解释是通过戏剧来表现,比如《哈姆雷特》。哈姆雷特,这个在城堡中游荡的著名黑客,与丹麦国王克劳底斯对决,扬言要杀害许多城堡中居民,克劳底斯则决定干掉哈姆雷特而一劳永逸;于是他派了亲信罗森克劳茨和古登斯坦送哈姆雷特去英格兰。他俩携带一封密信,信上要求一到英格兰就立即将哈姆雷特处死,和哈姆雷特一起的旅途是漫长和极具挑战性的,但是国王、罗森克劳茨和古登斯坦都忘了采取措施来保证:

1.      哈姆雷特不能阅读这封信

2.      哈姆雷特到达英格兰前不能修改这封信

最后这个著名的丹麦黑客,在另外两人熟睡的时候,偷看了信的内容,轻易地将要处死的人改为熟睡的两个国王亲信,并且在信封上盖上他父亲前丹麦国王的印章。作为国王的两个亲信从未想过要看这份信的内容,而且也从未想到自己一到英格兰就被处死。

 

那么我们看到有关安全最基本的三个问题:

1.      丹麦国王克劳底斯要有办法将信安全的送到英格兰国王的手上。

2.      英格兰国王如何验证信的内容是否为原始信件。

3.      在英格兰国王没有打开信件之前,信中的内容依然是高度机密的。

 

而当这些问题发生在InternetWeb Services就更有趣了,WS-Security就是完成这个功能的。(如果你哈姆雷特的故事感兴趣,除了看这篇文档最早我是在Java安全性编程指南[Professional Java security]上看到的) 这篇文章也同样是Web Services有关安全的开始,下面我们要做的就是上面将的第一个问题,解决Security Credentials在网络间进行传递的问题。

 

       我将利用WSDK来实践一个Web Services的客户端使用UsernameToken数字签名一个SOAP 消息,同时Web Services又是如何处理这个被UsernameToken签名的消息。我尽量简化了有关加密的处理和流程,试图说明整个的过程,从后面附带的源代码中你可以看到这一点。

 

       整个过程我们会生产一个Web Services和一个Web Services的客户端,同时最多的还是进行一些配置。运行通过的环境Windows XP SP2 / VS.NET 1.0 / WSDK 5217+

 

生成服务器端部分:

 

1.      建立一个Web Services 项目 SignSOAPusingName

 

2.      加入 Microsoft.Web.Services.DLL 引用。

 

3.      点击SignSOAPUsingName.asmx.cs 加入下面的代码:

 

using System.Web.Services.Protocols ;

using Microsoft.Web.Services.Security ;

 

using Microsoft.Web.Services;

using System.Security.Cryptography ;

 

4.      去到HelloWorld 的注释代码并加入下面的代码:

 

[WebMethod]

public string HelloWorld()

{

     SoapContext requestContext = HttpSoapContext.RequestContext ;

     string retval = "User unknown" ;

     if ( requestContext == null )

                   throw new ApplicationException( " Non-SOAP request" ) ;

     if ( !IsValid( requestContext ) )

              {

                   throw new SoapException( "The security infomation Supplied was not valid .", new System.Xml.XmlQualifiedName("Bad Tokens", "http://www.dotnetTools.org/SignSOAPUsingName" ) ) ;

              }

     UsernameToken theToken = GetUsernameToken( requestContext.Security  ) ;

     if ( theToken != null )

     {

         return "Hello " + theToken.Username   ;

     }

     return retval ;

}

 

5.      web.config中配置WSDKMicrosoft.Web.WebServices

 

<webServices>

    <soapExtensionTypes> <!-- type= 其内容必须保证在一行不能回车 -->

    <add type="Microsoft.Web.Services.WebServicesExtension,Microsoft.Web.Services,Version=1.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>

    </soapExtensionTypes>

</webServices>

 

6.      加一个新的类实现 IPasswordProvider

 

using System;

 

using System.Security.Permissions ;

using System.Security.Cryptography ;

using Microsoft.Web.Services.Security ;

 

namespace SignSOAPUsingName

{

     [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.UnmanagedCode)]

     public class PasswordProvider : IPasswordProvider

     {

         HashAlgorithm hash ;

         public PasswordProvider()

         {

              hash = new SHA1CryptoServiceProvider() ;

          }

 

         public string GetPassword( string userName )

         {

              byte[] encodedUsername = System.Text.Encoding.UTF8.GetBytes( userName ) ;

              Array.Reverse(encodedUsername); //这里我简化了处理,先不考虑那些加密函数

              return Convert.ToBase64String(encodedUsername);

         }

     }

}

 

 

7.      web.config中配置PasswordProvider

 

<microsoft.web.services>

<security> <!-- type=命名空间.类名,程序集名 -->

     <passwordProvider type="SignSOAPUsingName.PasswordProvider, SignSOAPUsingName" />

</security>

</microsoft.web.services>

 

8.      运行和Build应用程序,F5运行看Web Services是否正常运行

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

特别:

本文原创,CSDN署名首发,所有文字和图片版权所有。未经授权请勿传播、转载或改编。

如果有问题或建议,请发电子邮件给new2001@msn.com

欢迎访问我的WebSitewww.dotNETTools.org

 

应用WSDK - 实践Web Services的数字签名(下)

应用WSDK - 实践Web Services的数字签名  小气的神2002-12-05 Article Type: In-Depth  难度等级:8.2/9        版本:1.36  生成客户...
  • ccBoy
  • ccBoy
  • 2002年12月10日 09:07
  • 1706

应用WSDK - 实践Web Services的X.509证书签名(序)

应用WSDK - 实践Web Services的X.509证书签名 小气的神 2002-12-18 Article Type: OverView  难度等级:2/9        版本:1.18   ...
  • ccBoy
  • ccBoy
  • 2002年12月18日 08:45
  • 2468

数字签名的应用

1. 鉴权 a) 公钥加密系统允许任何人在分送信息的时候使用公钥进行加密,数字签名能够让信息接受者确认信息发送者的身份,接受者只能在密码系统尚未破译的情况下才有理由确信发送者的真实身份 b) 鉴权...
  • ShaoqunLiu
  • ShaoqunLiu
  • 2016年07月31日 21:54
  • 414

应用WSDK - 实践WebServices的路由和路由选择(上)

应用WSDK - 实践WebServices的路由和路由选择小气的神2002-11-18 Article Type: In-Depth  难度等级:8/9        版本:3.46 不久之前,我想...
  • ccBoy
  • ccBoy
  • 2002年11月19日 08:54
  • 1404

数字签名原理及其应用

签名的作用无非就是证明某个文件上的内容确实是我写的/我认同的,别人不能冒充我的签名(不可伪造),我也不能否认上面的签名是我的(不可抵赖)。 我们知道,手写签名之所以不能伪造,是因为每一个人的笔迹都是...
  • qmickecs
  • qmickecs
  • 2017年06月25日 15:40
  • 1704

RESTful Web Service 架构剖析

如今微服务和分布式架构变的越来越流行,而简单,可靠,高效,跨平台和跨语言的 Web Service 则是这类系统架构的基石。 RESTful Web Service 恰好满足这些特点,被越来越多的系...
  • liuwenbiao1203
  • liuwenbiao1203
  • 2016年08月29日 10:06
  • 933

Eclipse中打开Web Services Explorer

选择window->Open perspective->Java EE 找到下图中红线圈出的图标
  • zhangjianghao4
  • zhangjianghao4
  • 2015年03月26日 16:24
  • 508

数字签名的具体代码应用过程以及步骤

上期谈了关于数字签名的原理以及作用方式,接下来我们接聊一下数字签名在使用中的具体方式以及步骤和一些要关注的问题。        当然通过数字签名的第一步就是生成一对密钥对,包括一个公钥和一个私钥...
  • sunsun314
  • sunsun314
  • 2016年09月24日 20:52
  • 320

amazon web services的一些知识

amazon web services的网址。 可以免费注册试用一年。 https://aws.amazon.com/cn/?sc_channel=PS&sc_campaign=acquisitio...
  • u012834856
  • u012834856
  • 2017年01月17日 12:18
  • 408

使用JAX-WS构建Web Services

 使用JAX-WS构建Web ServicesJAX-WS简写为Java Api For Xml Web Service。JAX-WS是使用XML构建Web Service与Client进行交流通信的...
  • qiudawei115
  • qiudawei115
  • 2007年12月04日 20:40
  • 8521
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:应用WSDK - 实践Web Services的数字签名(上)
举报原因:
原因补充:

(最多只允许输入30个字)