Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
三. 进一步提高WCF Service的可靠性和安全性
我们已经实现了对Windows Azure上Blob数据的安全存取。但是这还不足以应用到生产环境。在生产环境,我们还需要保证WCF Service的高可靠性。设置服务器的负载均衡是一个很好的解决办法。下面就让我们来介绍一下如何修改WCFServiceWebRole1的设定以实现负载均衡。
1.在Cloud Service项目WindowsAzure1的Roles文件夹中,右键点击WCFServiceWebRole1选择Properties打开属性页。
2.在Configuration页面中将Instance count设为2或更多,Windows Azure会该为Cloud Service创建相应数目虚拟机做负载平衡。这样如果其中一台虚拟机出问题的时候其他虚拟机还能继续服务,从而保证了服务的稳定性。
另外,第三方还有可能通过抓包的方式来获取身份验证及数据信息,虽然因为我们使用了共享访问签名,可以设置该身份验证信息的有效时间,但还是可能形成隐患。为了避免这种情况,我们需要实现与Windows Azure的https连接。由于客户端和Storage Service的连接已经是https的了,所以这里只需要关心客户端和Cloud Service的连接设置。下面就是设定与Cloud Service的通讯为https连接的步骤:
1.为了采用https连接,我们需要一张SSL证书。而在实际生产环境中,您需要使用一张受信任的证书或者公司颁发的证书。出于演示目的,这里我使用了一张自签名的证书,在Developer Command Prompt for VS2013中以管理员身份运行makecert命令可以帮助我们创建一张自签名证书:
C:\>makecert -r -pe -n CN="sasservice.cloudapp.net " -b 03/13/2014 -e 03/13/2015 -eku 1.3.6.1.5.5.7.3.1 -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv sasCert.pvk sasCert.cer
2.期间您需要设定并输入私钥的保护口令。生成的证书包含两个文件,一个是pvk文件,用于存储证书私钥,一个是cer文件,用于存储证书公钥。关于如何使用makecert命令的详细信息,您可以参考以下链接:
https://msdn.microsoft.com/zh-cn/library/bfsktky3(v=vs.110).aspx
3.接下来您需要用pvk2pfx命令生成pfx文件以供后用:
C:\>pvk2pfx -pvk sasCert.pvk -pi “<pvk password>” -spc sasCert.cer -pfx sasCert.pfx -po “<pfx password>”
pfx文件中包含了证书公钥和私钥。-pi参数用来设定前面输入的私钥的保护口令,-po参数用来设定输出的pfx文件的私钥的保护口令。
4.在客户端右键点击sasCert.cer文件,选择Install certificate安装该证书,按照导入向导一步步将证书安装到Local Machine的Personal存储中。
5. 在Windows Azure管理门户进入前面建立的名为sasservice的云服务管理界面,点击Certificates标签页,在该页面中点击Upload弹出上传向导,根据向导将第3步生成的pfx文件上传到服务端。
6.回到在Cloud Service项目WindowsAzure1的Roles文件夹,右键点击WCFServiceWebRole1选择Properties打开属性页,在Certificates标签页中添加证书,Store Location选择Local Machine, Store Name选择My,Thumbprint选择步骤4中已经安装到客户端的sasservice证书。Cloud Service项目需要改Thumprint信息以便能够在服务端找到步骤5中上传的那张带私钥的证书。
7.在Endpoints标签页中,将Endpoint的Protocol改为https, Public Port改为443. SSL Certificate Name选择步骤6中添加的证书名Certificate1:
8. 打开WCFServiceWebRole1的web.config文件,加入以下设置使得WCF服务支持https:
<configuration>
<system.serviceModel>
<services>
<service name="WCFServiceWebRole1.Service1">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="secureHttpBinding"
contract="WCFServiceWebRole1.IService1"/>
<endpoint address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="secureHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</configuration>
9. 对WindowsAzure1项目点击Build->Publish将该服务重新发布Windows Azure上,这样Cloud Service就只允许通过https来访问了。
10. 在Windows Store应用客户端更新Service Reference,将原来的支持http的Service Renference删除,使用以下URL为应用重新添加Service Reference:
https://sasservice.cloudapp.net/Service1.svc
这样Windows Store应用客户端就可以通过https来与Cloud Service进行通讯了。
四.防止加密的https数据被Fiddler截获
理论上,通过https传输的内容是不可能被解密的。但是,我们发现,通过一定的设置以后,像Fiddler这样的网络抓包工具却能够看到https报文的内容。这是怎么回事呢?其实,这是因为Fiddler在数据发送端和接收端横插了一脚,充当了一个代理的角色。它首先在系统中生成了一张证书,然后用这张证书和发送端建立https连接。然后再用接收端的证书建立与接收端的https连接。这样子,它就成功的把数据骗到手里啦。
如果想要解决这个问题的话,我们需要对Windows Store应用的可信任的证书作一个限制,只允许它信任指定的证书,而确实它会信任所有安装在系统中的证书。方法是在Windows store应用的Manifest文件中添加所信任的证书,并且设定为Exclusive trust。
这里需要添加两张证书,一张是用于和Cloud service通讯的证书,也就是前面生成的sasCert.cer。另一张是用于Storage service通讯的证书,你首先需要找到这张证书的根证书。Windows Azure上的 Storage service用的证书是由Baltimore CyberTrust Root签发的。该证书可以在[Local Computer\Trusted Root Certification Authorities]中找到。这里我们将该证书导出到一个名为BalimoreCyber.cer的文件文件中。
通过以上一系列操作,我们终于将可以在Windows Store应用中安全的使用Windows Azure上的storage service了。由于步骤比较复杂,我这里附上了完整的示例代码以供大家参考,希望能够对大家开发高安全性的Windows Store应用有所帮助。大家如果有什么问题的话,也欢迎与我讨论。