我正在Windows服务中创建一个自托管的owin服务器。我已经实现了ACME客户端,以从“加密”(到服务的配置所指定的域)中获取证书。但是,如果该服务在已经具有证书的服务器上运行,则无需请求新证书。如何通过代码确定是否安装了适用于服务配置中设置的域的证书?
与我发现的解决方案最接近的事情是忽略现有证书(如果有),并始终请求新证书。然后,当从“加密”中收到证书时,我将该证书的序列保存到文件中。然后,在启动时,我使用保存的文件(如果有)从商店中查找现有证书:
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;
}
答案 0 :(得分:0)
我认为这已经足够了。
或者,您可以在证书存储中进行与指定参数匹配的搜索:证书所应用的域,到期日期等。如果找到有效的证书,则可以使用它。
实际上,这很可能是您对“证书已安装在服务器上”的定义。
您可能要检查的属性是“主题”,例如您喜欢这样的“ CN = mydomain.com”。您还可以拥有通配符证书,因此您需要弄清楚可以安装哪些类型的证书。