![clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/64357884-4468-4bb9-9d86-2da52c30cd17.gif)
图11-42 创建证书 证书创建完成之后,我们在MMC控制台添加证书管理单元,然后将两个证书转移到受信任存储区,如图11-43。
![clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/8c5948e7-2e4a-42ac-89bd-aead4d5963c9.gif)
图11-43 将证书转移到受信任存储区 说明: 图11-43所示的过程我们也完全可以在命令行把证书直接生成到指定的区域,这里主要的目的是告诉大家如何统一的管理证书。 因为传输安全模式下使用的是SSL链接,当然这需要我们在IIS配置站点的https绑定。 我们重新创建一个和站点同名的证书--wcfservicewebsite.com,然后将其导出到本地。打开IIS,首先切换到IIS7.5的服务器管理,单击“服务器证书”,为服务器添加证书。然后回到服务站点管理视图,编辑站点绑定,选择添加的证书。回到站点管理视图,点击“SSL设置”,勾选“要求SLL”,如图11-44。
![clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/35cad1a2-b57c-458a-a3d3-deaef6d00218.gif)
图11-44 配置站点要求SSL 此时访问站点会报告证书无效,因为是本地生成的证书没有经过验证的颁发机构,如图11-45所示。
![clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/6fcbd8a6-0dbd-4f1f-8214-d14d104ab6d3.gif)
图11-45 访问https链接证书错误 此时我们可以单击IE上的红叉,根据提示来将此证书安装到受信任的颁发机构中,如图11-46和图11-47。
![clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/c65a82b4-9ce5-4178-95c1-4808fa0e28f5.jpg)
图11-46 选择安装证书
![clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/ab8efd91-41aa-427e-a519-96520ff93394.jpg)
图11-47 将证书安装到受信任的根证书颁发机构 再次刷新站点,我们看到是通过验证的锁头标志,如图11-48。
![clip_image014clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/e230fd73-98b8-426d-a135-c9d37e37b7f0.gif)
图11-48 证书通过验证 首先我们看看不设置客户端凭据情况下Transport模式下的通信是什么样的,修改服务端配置为代码清单11-100所示的内容。 代码清单11-100 不设置客户端凭据
......
客户端根据服务端做相应的调整,之后设置可以通过https获取元数据,配置如代码清单11-101
客户端相应的将endpoint的address修改为:
![clip_image016clip_image014clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/0292cf74-f073-4304-a374-1adb6256d808.gif)
图11-49 Transport模式无凭据测试结果 从图11-49的结果结合服务端代码,我们可以知道当前采用的是匿名访问。那么传输层是不是保证了传输安全呢?我们Fiddler的捕获结果,如代码清单11-102。 代码清单11-102 Transport模式下捕获的数据
CONNECT wcfservicewebsite.com:443 HTTP/1.1
Host: wcfservicewebsite.com
Proxy-Connection: Keep-Alive
The data sent represents an SSLv3-compatible ClientHello handshake. For your
convenience, the data is extracted below.
Major Version: 3
Minor Version: 1
Random: 4E 07 11 12 D7 AE D1 35 94 52 CF CE B9 EA BF 8C 5B 4E B2 D4 86 0A BC
E6 D2 61 C4 97 BC 1C 11 DA
SessionID: empty
Ciphers:
[002F] TLS_RSA_AES_128_SHA
[0035] TLS_RSA_AES_256_SHA
[0005] SSL_RSA_WITH_RC4_128_SHA
[000A] SSL_RSA_WITH_3DES_EDE_SHA
[C013] TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
[C014] TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
[C009] TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
[C00A] TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
[0032] TLS_DHE_DSS_WITH_AES_128_SHA
[0038] TLS_DHE_DSS_WITH_AES_256_SHA
[0013] SSL_DHE_DSS_WITH_3DES_EDE_SHA
[0004] SSL_RSA_WITH_RC4_128_MD5
代码清单11-102的内容是客户端发送的请求内容,Fiddler显示的并不是原始数据,但是足以证明数据在传输层面得到了保护,被加密传输,可以设置Fiddler对SSL进行解密,解密后的请求数据如代码清单11-103所示。 代码清单11-103 实际的请求信息
POST http://wcfservicewebsite.com/HelloService.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData:
uIDPo9B4edYyOw5ClT+7ozgCtOoAAAAAqjlegWjQxkCz0d14I8iaZDw+0oZgJs5BgmW5E+f6yIkACQAA
SOAPAction: "http://tempuri.org/IHelloService/GetHello"
Host: wcfservicewebsite.com
Content-Length: 133
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
现在我们来配置服务端和客户端证书,分别使用上面生成的两个证书。接下来我们配置服务端证书,如代码清单11-104。 代码清单11-104 配置服务端证书
storeLocation="CurrentUser"
storeName="TrustedPeople"
x509FindType="FindBySubjectName"/>
storeLocation="CurrentUser"
storeName="TrustedPeople"
findValue="xServer"
/>
证书配置和NetTcpBinding没有什么区别,这里我就不重复了,如果您还有疑惑可以参考前文。服务端配置好以后,我们从浏览器访问http://wcfservicewebsite.com/HelloService.svc,却出现如图11-50所示的错误。
![clip_image018clip_image016clip_image014clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/b018df33-16a4-4613-b3cf-fb8d0b897407.gif)
图11-50 找不到证书错误 我在Window7上做测试偶尔会出现这样的错误,有可能是证书存储区的缓存机制造成的,不过将证书存储在LocalMachine上,可以迅速找到。这可能和IIS托管有关,笔者对此没有深入研究,如果您遇到同样的问题可以尝试将证书放在LocalMachine存储区上。 更新测试站点的配置,更新后客户的相关配置如代码清单11-105所示。 代码清单11-105 客户端证书配置
storeLocation="CurrentUser"
storeName="TrustedPeople"
x509FindType="FindBySubjectName"/>
…...
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IHelloService"
contract="HelloServiceReferenceForBasic.IHelloService"
name="BasicHttpBinding_IHelloService" behaviorConfiguration="clientBehavior">
代码清单11-105的配置中,我们将endpoint的address属性更改为https连接http://wcfservicewebsite.com/HelloService.svc",并配置
![clip_image020clip_image018clip_image016clip_image014clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/6f58cf47-82fe-4e21-8ea9-0739da90b833.gif)
图11-51 SSL配置不一致错误 出现图11-51的错误的原因在于服务本身要求客户端必须传递证书,而IIS的SSL设置没有对客户证书设置成必须。按图11-52修改就可以了。
![clip_image022clip_image020clip_image018clip_image016clip_image014clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/d1ed983d-5256-4ea2-822c-d6dbbd2ba201.gif)
图11-52 设置IIS的SSL 现在我们再次运行测试站点,结果如图11-53。
![clip_image024clip_image022clip_image020clip_image018clip_image016clip_image014clip_image012clip_image010clip_image008clip_image006clip_image004clip_image002WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)保虫宿主](/Files/20117/d2e4e82e-4086-4de2-a0fa-5a3218d4c0ff.gif)
图11-53 Certificate验证成功 图11-53中成功的返回证书标识和验证类型X509,说明服务端对客户端证书的验证成功。
最新评论