WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)
2011-07-02 11:54
393 查看
本节使用Transport安全模式来做Certificate验证,因为TransportCredentialOnly模式不支持证书。
Certificate验证需要客户端或者服务端提供证书,从而进行身份验证。首先我们在vs2010的命令行使用如图11-42所示的命令创建两个证书,分别用于服务端和客户端。
图11-42创建证书
证书创建完成之后,我们在MMC控制台添加证书管理单元,然后将两个证书转移到受信任存储区,如图11-43。
图11-43将证书转移到受信任存储区
说明:
图11-43所示的过程我们也完全可以在命令行把证书直接生成到指定的区域,这里主要的目的是告诉大家如何统一的管理证书。
因为传输安全模式下使用的是SSL链接,当然这需要我们在IIS配置站点的https绑定。
我们重新创建一个和站点同名的证书--wcfservicewebsite.com,然后将其导出到本地。打开IIS,首先切换到IIS7.5的服务器管理,单击“服务器证书”,为服务器添加证书。然后回到服务站点管理视图,编辑站点绑定,选择添加的证书。回到站点管理视图,点击“SSL设置”,勾选“要求SLL”,如图11-44。
图11-44配置站点要求SSL
此时访问站点会报告证书无效,因为是本地生成的证书没有经过验证的颁发机构,如图11-45所示。
图11-45访问https链接证书错误
此时我们可以单击IE上的红叉,根据提示来将此证书安装到受信任的颁发机构中,如图11-46和图11-47。
图11-46选择安装证书
图11-47将证书安装到受信任的根证书颁发机构
再次刷新站点,我们看到是通过验证的锁头标志,如图11-48。
图11-48证书通过验证
首先我们看看不设置客户端凭据情况下Transport模式下的通信是什么样的,修改服务端配置为代码清单11-100所示的内容。
代码清单11-100不设置客户端凭据
[/code]
客户端根据服务端做相应的调整,之后设置可以通过https获取元数据,配置如代码清单11-101
客户端相应的将endpoint的address修改为:
<endpointaddress=https://wcfservicewebsite.com/HelloService.svc.../>。
运行测试站点,结果如图11-49。
图11-49Transport模式无凭据测试结果
从图11-49的结果结合服务端代码,我们可以知道当前采用的是匿名访问。那么传输层是不是保证了传输安全呢?我们Fiddler的捕获结果,如代码清单11-102。
代码清单11-102Transport模式下捕获的数据
[/code]
代码清单11-102的内容是客户端发送的请求内容,Fiddler显示的并不是原始数据,但是足以证明数据在传输层面得到了保护,被加密传输,可以设置Fiddler对SSL进行解密,解密后的请求数据如代码清单11-103所示。
代码清单11-103实际的请求信息
[/code]
现在我们来配置服务端和客户端证书,分别使用上面生成的两个证书。接下来我们配置服务端证书,如代码清单11-104。
代码清单11-104配置服务端证书
[/code]
证书配置和NetTcpBinding没有什么区别,这里我就不重复了,如果您还有疑惑可以参考前文。服务端配置好以后,我们从浏览器访问https://wcfservicewebsite.com/HelloService.svc,却出现如图11-50所示的错误。
图11-50找不到证书错误
我在Window7上做测试偶尔会出现这样的错误,有可能是证书存储区的缓存机制造成的,不过将证书存储在LocalMachine上,可以迅速找到。这可能和IIS托管有关,笔者对此没有深入研究,如果您遇到同样的问题可以尝试将证书放在LocalMachine存储区上。
更新测试站点的配置,更新后客户的相关配置如代码清单11-105所示。
代码清单11-105客户端证书配置
[/code]
代码清单11-105的配置中,我们将endpoint的address属性更改为https连接https://wcfservicewebsite.com/HelloService.svc",并配置<authenticationcertificateValidationMode="None"/>使得客户端不验证服务端证书。
启动测试站点,得到了如图11-51的错误。
图11-51SSL配置不一致错误
出现图11-51的错误的原因在于服务本身要求客户端必须传递证书,而IIS的SSL设置没有对客户证书设置成必须。按图11-52修改就可以了。
图11-52设置IIS的SSL
现在我们再次运行测试站点,结果如图11-53。
图11-53Certificate验证成功
图11-53中成功的返回证书标识和验证类型X509,说明服务端对客户端证书的验证成功。
Certificate验证需要客户端或者服务端提供证书,从而进行身份验证。首先我们在vs2010的命令行使用如图11-42所示的命令创建两个证书,分别用于服务端和客户端。
图11-42创建证书
证书创建完成之后,我们在MMC控制台添加证书管理单元,然后将两个证书转移到受信任存储区,如图11-43。
图11-43将证书转移到受信任存储区
说明:
图11-43所示的过程我们也完全可以在命令行把证书直接生成到指定的区域,这里主要的目的是告诉大家如何统一的管理证书。
因为传输安全模式下使用的是SSL链接,当然这需要我们在IIS配置站点的https绑定。
我们重新创建一个和站点同名的证书--wcfservicewebsite.com,然后将其导出到本地。打开IIS,首先切换到IIS7.5的服务器管理,单击“服务器证书”,为服务器添加证书。然后回到服务站点管理视图,编辑站点绑定,选择添加的证书。回到站点管理视图,点击“SSL设置”,勾选“要求SLL”,如图11-44。
图11-44配置站点要求SSL
此时访问站点会报告证书无效,因为是本地生成的证书没有经过验证的颁发机构,如图11-45所示。
图11-45访问https链接证书错误
此时我们可以单击IE上的红叉,根据提示来将此证书安装到受信任的颁发机构中,如图11-46和图11-47。
图11-46选择安装证书
图11-47将证书安装到受信任的根证书颁发机构
再次刷新站点,我们看到是通过验证的锁头标志,如图11-48。
图11-48证书通过验证
首先我们看看不设置客户端凭据情况下Transport模式下的通信是什么样的,修改服务端配置为代码清单11-100所示的内容。
代码清单11-100不设置客户端凭据
[code]
<bindings>
<basicHttpBinding>
<binding
name="basicBindingConf">
<security
mode="Transport">
<transport
clientCredentialType="None">
</transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
......
[/code]
客户端根据服务端做相应的调整,之后设置可以通过https获取元数据,配置如代码清单11-101
<behaviorname="WcfHelloService.ServiceBehavior">
<serviceMetadata
httpsGetEnabled="true"/>
</behavior>
客户端相应的将endpoint的address修改为:
<endpointaddress=
运行测试站点,结果如图11-49。
图11-49Transport模式无凭据测试结果
从图11-49的结果结合服务端代码,我们可以知道当前采用的是匿名访问。那么传输层是不是保证了传输安全呢?我们Fiddler的捕获结果,如代码清单11-102。
代码清单11-102Transport模式下捕获的数据
[code]
CONNECTwcfservicewebsite.com:443HTTP/1.1
Host:wcfservicewebsite.com
Proxy-Connection:Keep-Alive
ThedatasentrepresentsanSSLv3-compatibleClientHellohandshake.Foryour
convenience,thedataisextractedbelow.
MajorVersion:3
MinorVersion:1
Random:4E071112D7AED1359452CFCEB9EABF8C5B4EB2D4860ABC
E6D261C497BC1C11DA
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
[/code]
代码清单11-102的内容是客户端发送的请求内容,Fiddler显示的并不是原始数据,但是足以证明数据在传输层面得到了保护,被加密传输,可以设置Fiddler对SSL进行解密,解密后的请求数据如代码清单11-103所示。
代码清单11-103实际的请求信息
[code]
POSThttps://wcfservicewebsite.com/HelloService.svcHTTP/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
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetHello
xmlns="http://tempuri.org/"/></s:Body></s:Envelope>
[/code]
现在我们来配置服务端和客户端证书,分别使用上面生成的两个证书。接下来我们配置服务端证书,如代码清单11-104。
代码清单11-104配置服务端证书
[code]
<serviceBehaviors>
<behavior
name="WcfHelloService.ServiceBehavior">
<serviceMetadata
httpGetEnabled="true"/>
<serviceDebug
includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<clientCertificate>
<authentication
certificateValidationMode="PeerTrust"/>
<certificate
findValue="xClient"
storeLocation="CurrentUser"
storeName="TrustedPeople"
x509FindType="FindBySubjectName"/>
</clientCertificate>
<serviceCertificate
x509FindType="FindBySubjectName"
storeLocation="CurrentUser"
storeName="TrustedPeople"
findValue="xServer"
/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
[/code]
证书配置和NetTcpBinding没有什么区别,这里我就不重复了,如果您还有疑惑可以参考前文。服务端配置好以后,我们从浏览器访问
图11-50找不到证书错误
我在Window7上做测试偶尔会出现这样的错误,有可能是证书存储区的缓存机制造成的,不过将证书存储在LocalMachine上,可以迅速找到。这可能和IIS托管有关,笔者对此没有深入研究,如果您遇到同样的问题可以尝试将证书放在LocalMachine存储区上。
更新测试站点的配置,更新后客户的相关配置如代码清单11-105所示。
代码清单11-105客户端证书配置
[code]
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior
name="clientBehavior">
<clientCredentials>
<clientCertificate
findValue="XuanhunClient"
storeLocation="CurrentUser"
storeName="TrustedPeople"
x509FindType="FindBySubjectName"/>
<serviceCertificate>
<authentication
certificateValidationMode="None"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
…...
<security
mode="Transport">
<transport
clientCredentialType="Certificate"proxyCredentialType="None">
</transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint
address="https://wcfservicewebsite.com/HelloService.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IHelloService"
contract="HelloServiceReferenceForBasic.IHelloService"
name="BasicHttpBinding_IHelloService"behaviorConfiguration="clientBehavior">
</endpoint>
</client>
</system.serviceModel>
[/code]
代码清单11-105的配置中,我们将endpoint的address属性更改为https连接
启动测试站点,得到了如图11-51的错误。
图11-51SSL配置不一致错误
出现图11-51的错误的原因在于服务本身要求客户端必须传递证书,而IIS的SSL设置没有对客户证书设置成必须。按图11-52修改就可以了。
图11-52设置IIS的SSL
现在我们再次运行测试站点,结果如图11-53。
图11-53Certificate验证成功
图11-53中成功的返回证书标识和验证类型X509,说明服务端对客户端证书的验证成功。
相关文章推荐
- WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)
- WCF BasicHttpBinding 安全解析(4)windows验证(IIS宿主)
- WCF HttpBinding 安全解析 (5)Basic验证(IIS宿主)
- WCF BasicHttpBinding 安全解析(6)Digest验证(IIS宿主)
- WCF HttpBinding 安全解析 (5)Basic验证(IIS宿主)
- WCF BasicHttpBinding 安全解析(6)Digest验证(IIS宿主)
- WCF BasicHttpBinding 安全解析(3)默认安全设置(IIS宿主)
- WCF BasicHttpBinding 安全解析(3)默认安全设置(IIS宿主)
- WCF BasicHttpBinding 安全解析(8)Message安全模式(iis宿主)
- WCF BasicHttpBinding 安全解析(8)Message安全模式(iis宿主)
- WCF分布式安全开发实践(2):传输安全模式之基本身份验证(Windows账户密码):Transport_Basic_WSHttpBinding
- WCF分布式安全开发实践(5):传输安全模式之Certificate身份验证:Transport_Certificate_WSHttpBinding
- WCF分布式安全开发实践(5):传输安全模式之Certificate身份验证:Transport_Certificate_WSHttpBinding
- WCF分布式安全开发实践(12):消息安全模式之自定义X509证书验证:Message_CustomX509Certificate_WSHttpBinding
- WCF分布式安全开发实践(12):消息安全模式之自定义X509证书验证:Message_CustomX509Certificate_WSHttpBinding
- WCF分布式安全开发实践(11):消息安全模式之Certificate身份验证:Message_Certificate_WSHttpBinding
- WCF分布式安全开发实践(11):消息安全模式之Certificate身份验证:Message_Certificate_WSHttpBinding
- WCF分布式安全开发实践(11):消息安全模式之Certificate身份验证:Message_Certificate_WSHttpBinding
- WCF分布式安全开发实践(6):传输安全模式之自定义X509Certificate证书验证:Transport_X509Certificate_WSHttpBinding
- WCF消息安全模式之自定义用户名密码:Message CustomUserNamePassword wsHttpBinding 使用Windows Services宿主以及客户端免证书验证