WCF开发框架的证书加密操作,前面在框架之旅做了一篇介绍,本文主要是将各种相关知识点综合起来进行介绍,以期达到系统化介绍在我的WCF开发框架(也可以应用于您的WCF框架)中使用证书加密的常规操作和步骤。在WCF应用日益广泛的环境下,注意数据的安全性以及系统稳定性的问题,是我们设计初期必须考虑的重要举措之一,特别对一些行业比较敏感的数据或者重要机关的数据,这个是一个硬性规定的前提条件之一。在WCF开发框架中,应用X.509证书加密可以解决这个问题,但是要使用这个东西,我们必须对相关的知识点有所了解,然后对相关的配置进行设置,才能正常进行使用。
1、 证书加密应用背景
在网络化的环境中,特别是基于互联网发布的WCF分布式应用程序,数据的加密传输就显得非常重要,通过对网络数据的加密可以有效保障系统的安全可靠性、私密性。
默认情况下,WCF调用是不经过数据加密的。通过默认操作实现的服务以及客户端调用,数据传输情况是如何的。我这里通过HTTP网络包分析工具Http Analyzer来对数据进行监控看看,如下所示。
可以看到,输入及输出的结果全部是明文,数据传输没任何秘密可言。当然,你也可以对这些数据自己加密后发送出去,但是每个接口,大量信息也要这样自己手工加密吗,难道微软的WCF那么弱智?
当然不是,这些操作交给WCF处理会便捷很多,传说中有一个X509的证书加密,不过如果是第一次搞这个,要完全调通要走不少弯路,我就是参考了很多文章(很多文章都介绍了一部分内容,很少能系统性的给你提出完全的解决方法),遇鬼杀鬼,遇佛拜佛,逐步排除各种险阻,这样慢慢才有一个清晰的思路,逐步解决问题,最终才有心思来写这篇文章,后面的随笔我会介绍完整的解决思路来处理X509加密的操作。
WCF常用的就是使用X509证书来实现加密,通过X509加密处理后,我们看到下面的效果。
里面的内容,包括输入及获取到的输出内容,均被加密的乱七八糟,一塌糊涂,即使是在公网中,看到也是白搭,不知是美女还是野兽。实现以上的加密操作,在调用上,完全不会受影响,还是和原来的调用一样,不过需要在WCF的服务以及调用的客户端进行一些文件配置等操作即可。
综上所述,本文介绍的WCF框架的证书加密操作,具有下面几个特点:
1)不需增加额外的代码,通过外置配置即可实现对应的加解密操作。
2)数据传输字段及内容均已进行加密,加密是通过证书对(服务器客户端各一个)进行处理。
3)高配置型、灵活性的实现方式。
2、WCF框架中使用证书加密注意事项
1) 我们一般通过Windows内置工具或者命令行创建的证书,其实是临时用的测试证书,如果在配置文件的Certificate ValidationMode属性中使用除了“None”属性外的值,就不能顺利运行调用服务。这个问题其实可以通过在Windows2003中部署证书服务来创建合格的证书,不过需要先搭建好证书服务平台(或者花钱购买)。
2) 开发机器上部署服务,如果操作系统是XP系统的话,不用考虑给IIS授权的问题。如果是在Windows2003等服务器机器上,要给IIS授权才能访问证书,需要使用WinHttpCertCfg.exe或者CertMgr.exe来实现证书的授权等操作。
3、证书加密的开发步骤
综上所述,要成功部署基于X509证书加密的操作,需要这几方面的知识和操作步骤。
1) 创建WCF服务应用以及调用客户端。
2) 创建客户证书和服务端的X509证书
3) 配置服务端的配置文件,使之使用X509证书服务。
4) 授权IIS访问服务器证书
5) 在服务器证书管理中导入服务器端证书
在客户端导入客户端证书,完成X509证书配置并调用服务。
3.1 创建WCF服务应用以及调用客户端
这个是基本的操作,客户可以创建适合自己的WCF开发框架,这里介绍的WCF开发框架,时基于我的Winform开发框架扩展而成的WCF框架,是一种比较完善、高效、弹性化的开发框架,详细步骤及说明请参考随笔《基于我的Winform开发框架扩展而成的WCF开发框架》,使用这种方式构造的开发框架,各层职责比较分明,而且方便管理。
架构视图如下所示:
项目工程截图如下所示(参考视图):
调用客户端需要添加WCF服务的引用,操作如下所,注意一般约定的命名规则为ABCServiceReference:
框架大量使用了基于泛型的数据传输接口,因此创建服务调用的客户端,需要在【高级】窗口设置中,添加泛型的转换接口设置(在集合类型中选择System.Collections.Generic.List,其他默认),如下图所示。
3.2 创建客户证书和服务端的X509证书
在VS2008 的DOS命令提示中,输入下面的指令即可创建相关的服务器和客户端证书。
makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=ParkingServer -sky exchange –pe
makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=ParkingClient -sky exchange -pe
下面是各种参数的介绍
属性 | 解析 |
-sr | 指定的证书存储区中的注册表位置。 |
-ss | 指定证书存储的位置。 |
-a | 指定相关的算法,可以选择 MD5 算法或者 SHA1算法 |
-n | 指定证书的名称。该名称遵循X.500命名标准。简单例子如 "CN=MyName" 格式,如果没有指定/n开关,证书默认的名称是"Joe's Software Emporium"。 |
-sky | 证书键类型。可以设置为 exchange 或者 signature。 |
-pe | 证书可导出 |
创建证书成功后,我们在开发的机器上就可以看到两个不同的证书了。
要看这两个证书,需要执行下面操作, 开始-》运行-》mmc.exe=》在控制台中选择文件=》添加/删除管理单元=》添加=》选择证书=》弹出证书管理单元选择计算机账户,默认下一步确定回来,就看到下面的界面。
在上面我们可以看到创建在LocalMachine账户下的证书,我们双击查看证书可以看到这个证书是一个不受信任的证书,但是我们还是可以使用的,只是需要在Web.Config配置信息中,certificateValidationMode 属性指定为None,而不能指定其他信任值。
3.3 配置服务端的配置文件,使之使用X509证书服务
根据创建的证书信息,我们修改Web.Config文件,使之应用X509证书加密,如下所示。关键的地方是设置验证方式使用证书。
<security mode="Message"> <message clientCredentialType="Certificate"/> </security>
而证书的相关信息指定如下。
<serviceCertificate findValue="ParkingServer" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/>
上面标示证书名称是ParkingServer ,通过查找名字方式对应,并且存储在本地计算机账户、个人证书目录下的位置。
Web.Config 部分内容如下所示。
3.4 授权IIS访问服务器证书
完成以上操作后,如果你的开发机器是XP,那么应该服务端是可以运行正常了,如果你的开发机器是Window2003,那么,恭喜你中奖了,运行服务后会出现下面的错误信息的:[ArgumentException: 证书“CN=ParkingServer”必须具有能够进行密钥交换的私钥。该进程必须具有访问私钥的权限。如下图所示。
要解决上面的错误, 只需要给相应的账号分配权限即可,这里IIS访问证书密钥的权限可以通过WinHttpCertCfg.exe来处理,只需要通过命令行执行该程序即可,如下所示。
winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
运行命令后,在运行WCF服务,一切OK了
这里另外也介绍下WinHttpCertCfg.exe来进行处理的几个命令。
winhttpcertcfg -l -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
给IIS的NETWORKSERVICE账户以基于证书名称模式授权
winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
给IIS的NETWORKSERVICE账户以基于证书文件模式授权
winhttpcertcfg -g -i "ParkingServer.pfx" -c LOCAL_MACHINE\My -a "NETWORKSERVICE" -p
移除账号对于证书的授权
winhttpcertcfg -r -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
3.5 在服务器证书管理中导入服务器端证书
完成以上步骤,如果服务配置文件正确,基本上在开发机器上不会有什么问题了,但是如果把服务部署到另外一台服务器机器上,那么就会可能出现找不到证书的错误。因为服务还没有导入创建好的证书呢。首先我们在开发机器上,在证书的控制台中选定服务端证书并导出即可把服务端证书导出到文件中,如下图所示。
记得在导出的时候选择带私钥的选项即可,导出的文件保存为ParkingServer.pfx。然后我们在服务器中,在相同的控制台中把服务端的证书导入即可使得WCF服务在服务器中也可以正常访问了。
3.6 在客户端导入客户端证书,完成X509证书配置并调用服务
如果客户端需要部署很多个,那么每个客户端需要把第二步创建的客户端证书导入,才能正常方便服务器的WCF服务,否则会出现证书的各种提示错误,导入操作如下所示。
如果这些操作完成,那么真诚恭喜你,真的可以使用WCF服务了,而且是使用了X509证书加密的WCF服务。
另外,为了使用X.509证书服务,客户端的配置文件确保如下所示,注意证书部分的设置即可。
关于我的Winform开发框架和WCF开发框架的特点,可以访问网站介绍地址(http://www.iqidi.com/Framework/info.html?flag=3)进行了解.