我正在 Windows 服务中创建一个自托管的 owin 服务器。我已经实现了一个 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;
}