将智能卡插入读卡器时,证书将被读入个人存储,我的问题很简单,然后我如何向 WCF 解释它应该在运行时使用特定的(这些)证书?
我的 WCF 服务是自托管的,并通过 TCP 与客户端通信。
我已经有一个使用证书的通信,但这些证书在配置文件中说明(一个用于服务,一个用于客户端)。
现在我需要在通信之前在客户端切换证书。
将智能卡插入读卡器时,证书将被读入个人存储,我的问题很简单,然后我如何向 WCF 解释它应该在运行时使用特定的(这些)证书?
我的 WCF 服务是自托管的,并通过 TCP 与客户端通信。
我已经有一个使用证书的通信,但这些证书在配置文件中说明(一个用于服务,一个用于客户端)。
现在我需要在通信之前在客户端切换证书。
您应该尝试找到一组特定的属性,这些属性对于您要使用的证书是唯一的。例如我们使用这样的过滤:
/// <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 存储在应用程序配置文件中,这样下次他就不必再执行这些步骤了。