没有证书存储的WCF证书

Kan*_*ane 12 c# ssl wcf certificate

我的团队正在为第三方胖客户端应用程序开发一些WPF插件.WPF插件使用WCF来使用由许多TIBCO服务发布的Web服务.胖客户端应用程序维护一个单独的中央数据存储,并使用专有API来访问数据存储.胖客户端和WPF插件将部署到10,000个工作站上.我们的客户希望保持在中央数据存储使用的胖客户端证书,使他们不必担心重新签发证书(当前再发行周期大约需要3个月),并有机会授权使用证书.所提出的体系结构在中央数据存储和TIBCO服务之间提供了一种形式的共享秘密/认证.

虽然我不一定同意所提议的架构,但我们的团队无法改变它并且必须使用所提供的内容.

基本上我们的客户希望我们在我们的WPF插件中构建一个机制,该机制从中央数据存储(基于该数据存储中的角色允许或拒绝)检索证书到内存然后使用证书创建SSL连接到TIBCO服务.不允许使用本地计算机的证书存储,并且在每个会话结束时丢弃内存版本.

所以,问题是没有人知道是否有可能通过在内存中的证书到WCF(.NET 3.5)的服务,为SSL传输层加密?

注意:我曾经问了一个类似的问题(这里),但后来删除了它并重新询问了更多信息.

Aar*_*ght 13

有可能的.我们使用Mutual Certificate Auth做类似的事情 - 服务证书,在某些情况下,客户端证书是从中央机构获取的,作为自动发现/单点登录机制的一部分.

在使用证书的上下文中并不完全清楚,但在所有情况下,您需要做的是定义您自己的行为和行为元素,该元素源自获取System.ServiceModel.Description证书的命名空间中的特定行为/元素.我暂时假设它是一个客户端凭证.首先,您必须编写行为,如下所示:

public class MyCredentials : ClientCredentials
{
    public override void ApplyClientBehavior(ServiceEndpoint endpoint,
        ClientRuntime behavior)
    {
        // Assuming GetCertificateFromNetwork retrieves from CDS
        ClientCertificate.Certificate = GetCertificateFromNetwork();
    }

    protected override ClientCredentials CloneCore()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您需要创建一个可以进入XML配置的元素:

public class MyCredentialsExtensionElement : ClientCredentialsElement
{
    protected override object CreateBehavior()
    {
        return new MyCredentials();
    }

    public override Type BehaviorType
    {
        get { return typeof(MyCredentials); }
    }

    // Snip other overrides like Properties
}
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以将策略添加到WCF配置:

<behaviors>
    <endpointBehaviors>
        <behavior name="MyEndpointBehavior">
            <myCredentials/>
        </behavior>
    </endpointBehaviors>
</behaviors>
Run Code Online (Sandbox Code Playgroud)

编辑:几乎忘了提,你需要注册扩展名:

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="myCredentials"
                 type="MyAssembly.MyCredentialsExtensionElement, MyAssembly,
                       Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
    </extensions>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.如果您需要有关所有这些类的安排以及幕后发生的事情的更多详细信息,请尝试阅读使用自定义行为扩展WCF.