如何使用个人证书进行WCF通信?

时间:2013-03-15 15:04:28

标签: wcf encryption runtime certificate smartcard

当将智能卡插入阅读器时,证书将被读入个人商店,我的问题很简单,我如何解释WCF应该在运行时使用特定的(这些)证书?

我的WCF服务是自主设备,并通过TCP与客户端进行通信。

我已经有一个使用证书的通信,但这些证书在配置文件中说明(一个用于服务,一个用于客户端)。

现在我需要在通信之前在客户端切换证书。

1 个答案:

答案 0 :(得分:1)

您应该尝试查找一组特定的属性,这些属性对您要使用的证书是唯一的。 例如,我们使用这样的过滤:

    /// <summary>
    /// Get the certificate we need for authentication
    /// </summary>
    /// <returns>the certificate</returns>
    /// <exception cref="InvalidOperationException">when no certificate is available</exception>
    public static X509Certificate2 GetCertificate()
    {
        // open private certificate store of the user
        X509Store store = new X509Store(StoreName.My);
        store.Open(OpenFlags.ReadOnly);

        // get the collection of certificates which we need
        X509Certificate2Collection certColl = store.Certificates
            .Find(X509FindType.FindByExtension, new X509KeyUsageExtension().Oid.Value, false)
            .Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.NonRepudiation, false);

        store.Close();
        // if more certificates match the criteria, let the user choose one
        if (certColl.Count > 1)
        {
            certColl = X509Certificate2UI.SelectFromCollection(
                certColl, "Choose certificate", "We were unable to find the correct certificate. Please choose one from the list.",
                X509SelectionFlag.SingleSelection);
        }
        // if no certificate is available, fail
        if (certColl.Count < 1)
        {
            throw new InvalidOperationException("No certificates selected");
        }
        else
        {
            return certColl[0];
        }
    }

检查所需证书的属性,并尝试创建自己的查找条件。当然,使用它可以在他的商店中有符合标准的附加证书,这种情况下弹出一个对话框窗口并要求用户自己这样做。

当然,一旦用户选择了正确的证书,您就可以将证书的CN存储在应用程序配置文件中,以便下次他不必再执行这些步骤。