【问题标题】:How to determine if server has ssl certificate如何确定服务器是否有 ssl 证书
【发布时间】:2019-01-29 19:57:00
【问题描述】:

我正在 Windows 服务中创建一个自托管的 o​​win 服务器。我已经实现了一个 ACME 客户端来从 Let's Encrypt 获取证书(到服务配置给出的域)。但是,如果该服务在已经有证书的服务器上运行,我不需要请求新的。如何在代码中确定是否安装了适用于服务配置中设置的域的证书?

我找到的最接近解决方案的方法是忽略现有证书(如果有)并始终请求新证书。然后,当从 Let's Encrypt 收到证书时,我将该证书的序列号保存到文件中。然后在启动时,我使用保存的文件(如果有)从商店中查找现有证书:

public async Task<bool> NeedNewCertificate()
{
    string certSerial = await AsyncFileHandler.ReadFileAsync(CERT_SERIAL_FILENAME);

        using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
        {
            store.Open(OpenFlags.ReadOnly);
            var certCollection = store.Certificates.Find(X509FindType.FindBySerialNumber, certSerial, true);
            foreach (var cert in certCollection)
            {
                if (cert.NotBefore <= DateTime.Now && cert.NotAfter > DateTime.Now.AddDays(30)) // Let's Encrypt certificates are valid 90 days. They recommend renewing certificates every 30 days.
                    return false;
            }
        }
    return true;
}

【问题讨论】:

  • 您为什么不使用 store.Certificates 查看所有证书,看看您必须使用哪一个来帮助您调试代码。异步执行可能会给您带来问题。
  • 这就是我在这里要问的。如何确定 store.Certificates 中的任何证书是否对我的域有效?
  • 尝试以下操作:string issuer = cert.Issuer; AsnEncodedData subject = cert.SubjectName;

标签: c# ssl https ssl-certificate certificate-store


【解决方案1】:

我认为这是一种足够好的方法。

或者,您可以在证书存储中进行搜索,以匹配您指定的参数:证书应用到的域、到期日期等。如果找到有效的,则可以使用它。

实际上,这很可能是您所说的“证书已安装在服务器上”的定义。

您可能想要检查的属性是“主题”,例如你会喜欢那些有“CN = mydomain.com”的。您也可以拥有通配符证书,因此您需要弄清楚可以安装哪些类型的证书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2014-12-05
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多