立博名家

证书存储位置

有朋友也许认为,证书存储位置一般不都是照搬微软的那一套嘛,其实不然,有以下几种情况是我们在真正的项目应用中不容忽视的。

  1、开发模式:开发模式时,为方便我们一般都采用控制台作为WCF服务的宿主,意味着当前运行的帐户权限为当前账户,估计多半是管理员权限了,这个时候你是不用担心你的证书存储在哪里的,只要你的证书生成了就好,实际真的就是这么回事,当你将你的WCF安全配置更改一下,看代码了:   

<serviceCredentials>
<clientCertificate>
<authenticationcertificateValidationMode="PeerTrust"/>
<clientCertificate>
<serviceCredentials>

  如果你的证书现在不受信任,如果你还过得了服务,你就牛X了。 证书authentication (服务器与客户端)共有四种: 

None = 未执行任何证书验证    

PeerTrust = 如果证书位于被信任的人的存储区中,则有效

ChainTrust = 如果该链在受信任的根存储区生成证书颁发机构,则证书有效

PeerOrChainTrust = 如果证书位于被信任的人的存储区或该链在受信任的根存储区生成证书颁发机构,则证书有效

Custom = 用户必须插入自定义 <?XML:NAMESPACE PREFIX = MSHELP />X509CertificateValidator

   实际上,只要你把信任模式更改为:None,证书放在哪里都无所谓了。

 

  2、部署模式

   CrazyBird强烈推荐以Windows Service作为WCF宿主,不论从效率或者安全及稳定性上来说,Windows Service都是最棒的,特别是你的WCF服务还是以TCP命名管道作为主要通信手段的时候,Windows Service就更值得你考虑了,先不要说IIS6.0不支持TCP协议先。  

  在以Windows Service方式运行WCF host的时候,你首先会碰上第一个问题,找不到证书,一般都会提示你,不能以下列搜索标准找到证书,该进程必须具有对私钥的访问权限,在这个时候,就千万不要相信人云亦云的通过微软的FindPrivateKey工具找到证书文件,给LOCAL SERVICE访问权限,不信去试试,问题依旧。  

  实际上产生这个问题的原因很搞笑,只是因为你在开发时总是使用同一个证书,想当然的部署的时候只是用一个证书,如果你一开始就用两个证书,客户端和服务器之间利用证书时行相互认证和加密,那应该是没有问题的,以下第一条是很严肃的原则。  

  • 以Windows Service作为WCF Host宿主,如果采用了消息加密策略,并启用了X509证书安全,那X509证书的安装位置必须为LocalMachine,同时,证书应位于TrustedPeople位置中。
  • 这只是最基本的要求,不要把它当作教条,实际上,证书必须存储在LocalMacnine是没错的,但是位置就应该按你的<authentication certificateValidationMode="PeerTrust"/>策略来调整了,如果你把证书放在了:ROOT(受信任的根证书颁发机构),你再把证书放到哪里去都是没有问题,甚至可以放到My(个人)区中。
  • 同时,你还应当把客户端证书复制到受信任的证书人区域中,最基本的嘛,当然,这还是和安全策略有关。

posted on 2012-02-03 09:41  大李  阅读(1168)  评论(0)    收藏  举报

导航

立博名家