我可以在配置文件中指定多个x509FindTypes来检索SSL证书吗?

时间:2014-03-18 09:39:33

标签: ssl ssl-certificate x509certificate

我目前正在使用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>

由于

2 个答案:

答案 0 :(得分:1)

在配置文件中没有办法做到这一点。

  • 但是你可以在代码中执行此操作。在中创建端点行为 代码并将其分配给指定的端点。你可以链 X509Store.Certificates.Find方法多次并指定 搜索条件。
  • 或者您可以在日历中记下续订证书 端点在到期前的某个时间使用,选择一天进行服务中断并重新配置。使用指纹作为端点证书的搜索条件。

答案 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.Fin‌​dBySubjectName, certSubj, false).Find(X509FindType.FindByTimeValid, DateTime.N‌​ow, 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();

这在测试环境中对我有用,但我还没有将其转移到生产中,所以请在使用前彻底测试。