如何:使用独立的 X.509 证书进行签名和加密

本主题演示如何配置 Windows Communication Foundation (WCF) 以使用不同的证书在客户端和服务上进行消息签名和加密。

若要实现在签名和加密时使用独立的证书,必须创建自定义客户端或服务凭据(或者两者都创建),因为 WCF 不提供设置多个客户端或服务证书的 API。此外,还必须提供安全令牌管理器,以利用多个证书的信息并为指定的密钥用法和消息方向创建相应的安全令牌提供程序。

下图演示所用的主类、它们从其继承的类(由向上箭头指示)以及某些方法和属性的返回类型。

有关 自定义凭据的更多信息,请参见如何:创建自定义客户端和服务凭据

此外,必须创建自定义标识验证程序,并将它链接到自定义绑定中的安全绑定元素。还必须使用自定义凭据而不是默认凭据。

下图演示在自定义绑定中涉及的类,以及如何链接自定义标识验证程序。涉及到几个绑定元素,它们都继承自 BindingElementAsymmetricSecurityBindingElement 具有 LocalClientSecuritySettings 属性,该属性返回 IdentityVerifier 的实例(从其自定义 MyIdentityVerifier)。

有关 创建自定义标识验证程序的更多信息,请参见如何:创建自定义客户端标识验证工具

使用独立的证书进行签名和加密

  1. 定义从 ClientCredentials 类继承的新客户端凭据类。实现四个新属性以允许指定多个证书:ClientSigningCertificateClientEncryptingCertificateServiceSigningCertificateServiceEncryptingCertificate。还重写 CreateSecurityTokenManager 方法在下一步中定义的自定义 ClientCredentialsSecurityTokenManager 类的实例。

  2. 定义从 ClientCredentialsSecurityTokenManager 类继承的新客户端安全令牌管理器。重写 CreateSecurityTokenProvider 方法以创建相应的安全令牌提供程序。requirement 参数(一个 SecurityTokenRequirement)提供消息方向和密钥用法。

  3. 定义从 ServiceCredentials 类继承的新服务凭据类。实现四个新属性以允许指定多个证书:ClientSigningCertificateClientEncryptingCertificateServiceSigningCertificateServiceEncryptingCertificate。还重写 CreateSecurityTokenManager 方法以返回在下一步中定义的自定义 ServiceCredentialsSecurityTokenManager 类的实例。

  4. 定义从 ServiceCredentialsSecurityTokenManager 类继承的新服务安全令牌管理器。如果给定传入消息的方向和密钥用法,则重写 CreateSecurityTokenProvider 方法以创建相应的安全令牌提供程序。

在客户端上使用多个证书

  1. 创建自定义绑定。安全绑定元素必须以双工模式运行,以允许为请求和响应采用不同的安全令牌提供程序。执行此操作的一种方法是使用具有双工能力的传输,或使用下面的代码所示的 CompositeDuplexBindingElement。将在下一步中定义的自定义 IdentityVerifier 链接到安全绑定元素。将默认客户端凭据替换为以前创建的自定义客户端凭据。

  2. 定义一个自定义的 IdentityVerifier。因为使用不同的证书来加密请求和对响应进行签名,所以服务具有多个标识。

    提示

    在下面的示例中,出于演示的目的,提供的自定义标识验证程序不执行任何终结点标识检查。建议在生产代码中不要这样做。

在服务上使用多个证书

  1. 创建自定义绑定。安全绑定元素必须以双工模式运行,以允许为请求和响应采用不同的安全令牌提供程序。像客户端一样使用具有双工能力的传输,或使用下面的代码所示的 CompositeDuplexBindingElement。将默认服务凭据替换为以前创建的自定义服务凭据。

另请参见

参考

ClientCredentials
ServiceCredentials
ClientCredentialsSecurityTokenManager
ServiceCredentialsSecurityTokenManager
IdentityVerifier

概念

如何:创建自定义客户端和服务凭据