我目前正在使用FindByThumbprint来检索我的证书 - 但是当指纹更改时,这会在撤销/续订时导致问题。我想通过主题名称找到我的证书。但是,有多个具有相同名称的证书。如果我没有弄错的话,这会引发异常。
是否可以按主题名称查找并检索最新的有效证书?使用配置文件中的设置。
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialBehavior" xdt:Transform="Replace" xdt:Locator="Match(name)">
<headerSecurityToken />
<clientCredentials>
<clientCertificate findValue="-------"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
由于
答案 0 :(得分:1)
在配置文件中没有办法做到这一点。
答案 1 :(得分:1)
虽然这是一个很老的帖子,但有人可能会得到帮助:)
我的回答是基于Pepo的回答和评论。
private X509Certificate2 GetValidCertificateFromStore()
{
string certSubj = System.Configuration.ConfigurationManager.AppSettings["Certificate-Subject"];
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindBySubjectName, certSubj, false).Find(X509FindType.FindByTimeValid, DateTime.Now, false);
store.Close();
return fcollection.OfType<X509Certificate2>().OrderBy(c => c.NotAfter).FirstOrDefault();
}
上面的方法为我做了工作,在这里我链接查找方法首先按主题查找然后按有效日期查找。接下来,我按照有效期直到它为您排序。
以下是我在客户端应用中使用此功能的方法:
using (MyServiceClient client = new MyServiceClient())
{
client.ClientCredentials.ServiceCertificate.DefaultCertificate = GetValidCertificateFromStore();
try
{
res = client.MyClientMethod(request);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw ex;
}
}
在wcf服务中,我在 CreateServiceHost 方法
中添加了以下行serviceHost.Credentials.ServiceCertificate.Certificate = GetValidCertificateFromStore();
这在测试环境中对我有用,但我还没有将其转移到生产中,所以请在使用前彻底测试。