证书以及它们所提供的声明是一个安全的提供身份的通用方法。它们提供了一个鲁棒性的安全架构可以让它们非常适合加密和认证。WCF使用X.509工业标准证书,它被很多技术提供商广泛采用。互联网浏览器和互联网服务器使用这个标准来存储加密密钥并在网络上为SSL通信签名。证书提供强加密而且很容易理解和文档化。
证书的主要劣势是从第三方授权组织获取它们用于生产的代价以及呈现它们的复杂度。你如何分发证书?如果一个证书被偷了你该怎么做?在一个证书丢失了后你如何恢复数据?如果你在一个客户端电脑上存储证书,你如何从其他地方访问信息?有很多解决方案处理了这些问题,从在一个局域网内部或者在公共互联网上将证书存储到一个目录中,到将证书存储到我们可以放到口袋里的智能卡片上。不考虑呈现方案,证书是加密和认证问题的一个非常好的选择。
概念
使用非对称密钥来加密消息的概念总体上来说很简单。想象一个可以使用一个密钥加密任意字符串并使用另外一个密钥对其解密的算法。现在想象我有一对儿这样的密钥,我让它们中的一个是公共的以便于互联网上的所有人都可以看到它,但是我让另外一个是私有的以便于只有我可以看到它。如果我的朋友想给我发送一条消息,他寻找我的公共密钥,运行算法加密消息,然后发送它。如果加密的消息被我的敌人截获,那个人不能读取它因为只有我,有我的私有密钥,可以解密消息。当我发送一个反馈给我的朋友时,我寻找他的公共密钥,运行算法来加密反馈,然后发送。再次,只有他可以解密加密的消息,所有它将在我们俩之间保密。
但是相反的是数字签名使用消息加密。一个数字签名是一个使用私有密钥加密的简单字符串以便于它只可以使用相关的公共密钥来解密。对那个字符串(例如,我的名字)的正确解密是公共信息,所有在一些人使用我的公共密钥解密消息后,那个人可以确定我的名字存储在消息中。
信赖是证书的另一个重要方面。在我们的与一个朋友交换消息的例子中,我们怎么知道我们有我们朋友的公共密钥而不是我们敌人的?对一个客户端和服务端来说要确定彼此的证书是正确的,合法的而且没有,它们必须信赖一个公共权威机构。如果客户端和服务端使用不同权威组织颁发的证书,只要这些证书都信赖一个第三方的,公共的权威组织就是可以的。公共权威组织通常被引用为根权威组织,一般是自我签名,意味着它不信赖任何其他人或组织。当一个客户端从一个服务的接收一个证书,它查看服务证书的证书路径来看是否这个路径是合法的并在一个可信赖权威组织验证。如果这样,客户端就认为证书是合法的;如果不是,它就会拒绝它。WCF中有规则来禁止证书路径验证以便于在开发和测试时可以使用不被信赖的证书。
创建
证书可以在传输安全或消息级别安全使用。一个常用的传输层加密选项是SSL,通过在服务端使用一个证书来实现传输加密。消息层加密在独立的消息上使用。而基于传输层的加密要求在服务端安装一个证书,基于消息的加密支持客户端/服务端证书等很多模式。
这章的"传输层安全"和"消息层安全"中的例子将使用两台机器: 一台Vista桌面机和一台Windows Server 2003.桌面机有一个证书,MyClientCert.服务有一个证书MyServerCert.列表8.2显示了运行在Vista上用来生成必要证书的命令。Makecert.exe创建一个证书。-pe选项让私有密钥可以导出。-n选项定义证书的名字并将用于验证。-sv选项定义私有密钥文件。-sky选项可以是"交换"或者一个数字签名。Pvt2pfx是一个可以将私有密钥和公共密钥联合为一个单独文件的实例。
如果你在一台机器上开发,将MyServer的名字改成localhost.所有其他的命令保留一致。
提示 生产环境证书
要记住在这个例子中生成的证书不应该在生产场景中使用。生产环境中使用的证书应该从一个可信赖的第三方证书授权机构请求。
列表8.2 生成证书
makecert.exe -r -pe -sky exchange
-n "CN=MyClientCert" MyClientCert.cer
-sv MyClientCert.pvk
pvk2pfx.exe -pvk MyClientCert.pvk
-spc MyClientCert.cer
-pfx MyClientCert.pfx
makecert.exe -r -pe -sky exchange
-n "CN=MyServer.com" MyServerCert.cer
-sv MyServerCert.pvk
pvk2pfx.exe -pvk MyServerCert.pvk
-spc MyServerCert.cer
-pfx MyServerCert.pfx
.cer文件是公共密钥,.pvk文件时私有密钥,.pfx文件一个包含私有密钥和公共密钥的密钥交换文件。下面的密钥必须在微软管理控制台使用证书管理单元安装。
1. 在服务端安装下面的内容,在本机证书存储器中:
a. 将MyServerCert.pfx 导入私有文件夹。这允许服务端解密使用它的公共密钥加密的消息。它也允许服务端使用它的私有密钥加密消息。
b. 将MyClientCert.cer导入可信赖人文件夹。这允许服务端解密由MyClientCert私有密钥加密的消息,比如数据消息和认证用的数字签名。它也允许服务端
使用MyClientCert公共密钥加密消息。
2. 在客户端安装下面内容,在当前用户证书存储器中:
a. 将MyClientCert.pfx导入私有文件夹。 这允许客户端解密使用MyServerCert私有密钥加密的消息,比如数据消息和用来验证的数字签名。它也允许客户端
使用MyServerCert公共密钥加密消息。