如何判断服务器是否有ssl证书

How to determine if server has ssl certificate

我正在 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;
}

我认为这是一个很好的方法。

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

这实际上很可能是您所说 "certificate is installed on the server" 的定义。

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