使用证书客户端的消息安全
下面的方案演示使用消息安全模式保护的 Windows Communication Foundation (WCF) 客户端和服务。使用证书对客户端和服务进行身份验证。有关更多信息,请参见 分布式应用程序安全.
有关示例应用程序,请参见Message Security Certificate。
特征 | 说明 |
---|---|
安全模式 |
消息 |
互操作性 |
仅 WCF |
身份验证(服务器) |
最初使用传输层安全 (TLS) 协商要求使用服务证书进行服务器身份验证 |
身份验证(客户端) |
使用客户端证书和 TLS 协商 |
完整性 |
是,使用 TLS 协议 |
保密性 |
是,使用 TLS 协议 |
传输 |
HTTP |
绑定 |
服务
下面的代码和配置将独立运行。执行下列操作之一:
- 使用代码(而不使用配置)创建独立服务。
- 使用提供的配置创建服务,但不定义任何终结点。
代码
下面的代码演示如何创建一个使用消息安全来建立安全上下文的服务终结点。
配置
以下配置可代替代码使用。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceCredentialsBehavior">
<serviceCredentials>
<serviceCertificate findValue="Contoso.com"
x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ServiceCredentialsBehavior"
name="ServiceModel.Calculator">
<endpoint address="https://localhost/Calculator"
binding="wsHttpBinding"
bindingConfiguration="MessageAndCerficiateClient"
name="SecuredByClientCertificate"
contract="ServiceModel.ICalculator" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ICalculator">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client />
</system.serviceModel>
</configuration>
客户端
下面的代码和配置应独立运行。请执行下列操作之一:
- 使用代码(和客户端代码)创建独立客户端。
- 创建不定义任何终结点地址的客户端。而使用将配置名称作为参数的客户端构造函数。例如:
代码
下面的代码创建客户端。绑定设置为消息模式安全,客户端凭据类型设置为 Certificate。
配置
下面的配置使用终结点行为指定客户端证书。有关证书的更多信息,请参见使用证书。该代码还使用 <identity> 元素来指定所需服务器标识的域名系统 (DNS)。有关 标识的更多信息,请参见服务标识和身份验证。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialsBehavior">
<clientCredentials>
<clientCertificate findValue="Cohowinery.com"
storeLocation="LocalMachine"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ICalculator" >
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://machineName/Calculator"
behaviorConfiguration="endpointCredentialsBehavior"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator"
contract="ICalculator"
name="WSHttpBinding_ICalculator">
<identity>
<dns value="Contoso.com" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>