苏州定制网站建设,营口pc网站开发,wordpress附加字段,企业没有做网站有的坏处基于证书的WCF安全开发详解 前几天成功建立起了一套基于证书的安全的WCF服务#xff0c;很兴奋#xff0c;现在做一下总结#xff0c;希望大侠们指点#xff0c;也希望能帮助到一些菜鸟#xff0c;哈哈。 一、安全通信的基本过程 这里只做定性的理论上的分析#xff0c;因… 基于证书的WCF安全开发详解 前几天成功建立起了一套基于证书的安全的WCF服务很兴奋现在做一下总结希望大侠们指点也希望能帮助到一些菜鸟哈哈。 一、安全通信的基本过程 这里只做定性的理论上的分析因为再详细一点的我也不懂。一个通信分为客户端A和服务端BA发送请求B响应请求。安全通信必须满足3个方面的要 求1是保密性即数据要经过加密防止第三者偷窥到。2是防篡改不知道用完整性来表示合适不即保证B收到的数据与A发出的数据是一样的3是抗否 认即如果A向B发送了数据要从技术上保证A没办法抵赖说A没发或者说A发的与B收到的不一样。2和3从某种意义上是同义词因为既然没人能冒充A发 数据那么A就不能抵赖。 二、PKI系统 PKI系统由信息发送方接收方和CA证书认证中心3部分组成。PKI系统可以满足以上安全通信的所有要求。 发送方A和接收方B都有一对密钥A有公钥A和私钥AB有公钥B和私钥B这些密码是由CA签发的A和B都信任CA信任的关系是建立在证书链 的基础上的CA有自己的根证书Root包含公钥Root和私钥RootA和B的密钥实际上是由CA根据自己的密钥所签发的子密钥。PKI系统实现 了这样一个逻辑就是如果一个PC信任一个Root证书那么它也信任由Root签发的子证书。这一逻辑由系统软件比如浏览器、WCF框架所实现我 们不必实现和管理此逻辑。所以A和B机里的受信任的根证书区里都要包含Root的公钥此外A和B都有自己的公钥和私钥因为A和B都信任Root所 以这样配置下来A就会信任BB也会信任A。 1发送信息I之前A首先生成某种对称加密算法比如DESAES的密钥QQ是用来加密信息I的因为对称加密比非对称加密快很多所以虽然我们可以用私钥A来对I加密但却不这么做。 2A用公钥B对Q加密生成Q’。 3A用Q对I加密生成I’。 4A用私钥A做签名。具体过程是先对Q’I’做哈希MD5、SHA1等得S再用私钥A对S做加密得S’。 5A把Q’I’S’发给B。 6B用公钥A对签名做验证。具体过程是先对Q’I’做哈希MD5、SHA1等得S再用公钥A对S’做解密得S’’看S是否等于S’’相等则有效不等则验证失败。 7B用私钥B对Q’做解密得Q。 8用Q对I’做解密得I。至此A完成了向B发送IB完成了接收I。 在第5步信息流传于公网上所以Q’I’S’可能被黑客X所截获但我们可以证明X不可能获得有用的信息即保密性X也不能篡改I并发给B防篡改检测篡改A也不能抵赖抗否认 1. X要想知道I则必须先知道Q但它只知道Q’所以它还要知道私钥B才能得到Q但这是不可能的因为只有B和CA才知道私钥B而CA是绝对公正和安全的B又不会把私钥B告诉别人。 2. 如果第6步验证成功我们可以断定I没有被篡改过。因为假如I被篡改过则签名S’经过公钥A解密后得的S’’一定不会等于Q’I’的哈希值S而这与已知的条件不符所以是不可能的。 3. 假如A要想否认自己发过I则说明A可能把私钥A泄露给了别人YY就是坏蛋。如果A说没有告诉别人则A就在说谎因为签名S’只有A才能生成。所以A不能抵赖。 三、一个Case 有3台PCWYPW为客户端W请求YY又请求P那么Y即是服务端又是客户端P是服务端Y和P上布署的有WCF。 要保证这三台PC间的安全通信还必须有个CA我们可以自己架设也可以买第三方的服务。在开发阶段我们可以用makecert来模拟CA签发证书的过程。 具体过程如下 1生成根证书 makecert -n CNTempCA -r -sv TempCA.pvk TempCA.cer TempCA就是模拟的Root证书 2生成WYP子证书 makecert -n CNW -iv TempCA.pvk -ic TempCA.cer -sv W.pvk W.cer -pe -sky exchangepvk2pfx.exe -pvk W.pvk -spc W.cer -pfx W.pfx makecert -n CNY -iv TempCA.pvk -ic TempCA.cer -sv Y.pvk Y.cer -pe -sky exchangepvk2pfx.exe -pvk Y.pvk -spc Y.cer -pfx Y.pfx makecert -n CNP -iv TempCA.pvk -ic TempCA.cer -sv P.pvk P.cer -pe -sky exchangepvk2pfx.exe -pvk P.pvk -spc P.cer -pfx P.pfx 3导入证书 把TempCA.cer导入WYP的受信任的根证书区把各自的pfx导入各自的个人证书区这样每台机器都有2个证书一个根证书一个自己的证书。 4创建WCF 首先在P上创建WCF服务再在Y上创建WCF服务并引入P的服务再在W上创建客户端引入Y的服务。 5配置安全选项 W上的配置类似于 system.serviceModel bindings wsHttpBinding binding nameServerBinding security modeMessage message clientCredentialTypeCertificate negotiateServiceCredentialtrue algorithmSuiteDefault establishSecurityContexttrue/ /security /binding /wsHttpBinding /bindings client endpoint addresshttp://Y/Test.svc bindingwsHttpBinding bindingConfigurationServerBinding contractWcfClients.ITest nameWSHttpBinding_ITest behaviorConfigurationTestEndpointBehavior identity dns valueY/ /identity /endpoint /client behaviors endpointBehaviors behavior nameTestEndpointBehavior clientCredentials clientCertificate findValueW storeLocationLocalMachine x509FindTypeFindBySubjectName / serviceCertificate authentication certificateValidationModeChainTrust revocationModeNoCheck / /serviceCertificate /clientCredentials /behavior /endpointBehaviors /behaviors /system.serviceModel 简单解释一下 binding节配置了消息的传输方式和安全策略并配置有name在后面的endpoint里可以引用。服务端和客户端的binding要一致。 client节点代表客户端引用了哪些endpoint每个endpoint的binding是什么。 endpointBehavior节点是一种扩展针对本例只需要配置客户端需要的具体身份凭据。服务端和客户端都可以定义 endpointBehavior它是针对endpoint的。另外还有针对service的serviceBehavior它只需配置在服务端客 户端不需要。 Y的配置 system.serviceModel client endpoint addresshttp://P/Service1.svc bindingwsHttpBinding bindingConfigurationServerBinding contractIService1 nameWSHttpBinding_IService1 behaviorConfigurationServiceBehavior identity dns valueP / /identity /endpoint /client bindings wsHttpBinding binding nameServerBinding security modeMessage message clientCredentialTypeCertificate / /security /binding /wsHttpBinding /bindings services service behaviorConfigurationWcfSample.TestBehavior nameWcfSample.Test endpoint address bindingwsHttpBinding contractWcfSample.ITest bindingConfigurationServerBinding /endpoint endpoint addressmex bindingmexHttpBinding contractIMetadataExchange/ /service /services behaviors serviceBehaviors behavior nameWcfSample.TestSecureBehavior serviceMetadata httpGetEnabledtrue/ serviceDebug includeExceptionDetailInFaultsfalse/ serviceCredentials serviceCertificate storeNameMy storeLocationLocalMachine x509FindTypeFindBySubjectName findValueTomYang-PC/ clientCertificate authentication certificateValidationModeChainTrust revocationModeNoCheck / /clientCertificate /serviceCredentials /behavior /serviceBehaviors endpointBehaviors behavior nameServiceBehavior clientCredentials clientCertificate storeNameMy storeLocationLocalMachine x509FindTypeFindBySubjectName findValueY/ serviceCertificate authentication certificateValidationModeChainTrust revocationModeNoCheck/ /serviceCertificate /clientCredentials /behavior /endpointBehaviors /behaviors /system.serviceModel Y的配置之所以如此之长是因为它既要配置服务端又要配置客户端。其中的service节和serviceBehavior节是与W的对应之处也就是服务端需要什么样的凭据客户端就要提供反过来客户端需要服务端提供什么样的凭据服务端也要提供相应的配置。 P的配置 system.serviceModel bindings wsHttpBinding binding nameServerBinding security message clientCredentialTypeCertificate / /security /binding /wsHttpBinding /bindings services service nameService1 behaviorConfigurationService1Behavior endpoint address bindingwsHttpBinding contractIService1 bindingConfigurationServerBinding /endpoint endpoint addressmex bindingmexHttpBinding contractIMetadataExchange / /service /services behaviors serviceBehaviors behavior nameService1Behavior serviceMetadata httpGetEnabledtrue / serviceDebug includeExceptionDetailInFaultstrue / serviceCredentials clientCertificate authentication certificateValidationModeChainTrust revocationModeNoCheck / /clientCertificate serviceCertificate findValueP storeNameMy x509FindTypeFindBySubjectName / /serviceCredentials /behavior /serviceBehaviors /behaviors /system.serviceModel OK 所有代码与配置均写好了还有要注意的一点是防火墙的问题假如你所做的WCF使用了被防火墙屏蔽的端口时你需要配置一下防火墙方法可以是添加例外的 应用程序或者添加端口。还有元数据的配置即address为mex的那些东东在正式的生产环境中是需要去掉的它们可能会泄露系统敏感信息。 四、剩余的工作 这个Case只做到了安全通信没有实现更详细的控制比如身份识别服务端收到请求后如何知道请求者是谁权限控制如何把一个用户映射到角 色某个功能只对某些用户名角色开放。身份识别可以使用证书的thumbprint权限控制可以用代码访问安全性设置。这方面还没深入了解有谁有这 方面的经验可以分享啊 对于有些应用比如不需要太详细的控制只要求实现两点间的安全通信即可那么这个Case已经够用了。 与老外讨论WCF 与老外讨论安全通信 posted on 2010-08-25 11:55 灰灰狼 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/bighuiwolf/archive/2010/08/25/1808020.html