我必须使用以下代码检查并确保证书没有过期:
if (DateTime.Parse(cert.GetExpirationDateString()) <= DateTime.Now)
{
_logger.Log(LogLevel.Error, "Chain Certificate is Expired");
return false;
}
cert
是.net.的X509Certificate类的一个实例
我面临的问题是GetExpirationDateString函数以字符串格式(取决于当前区域性的短日期格式)提供到期日期
如果我的机器的短日期格式是DD-MM-YY
,它将到期日期21-12-2030
返回为21-12-30
,DateTime.Parse
函数将30
转换为1930
(如果到期年份>30)。
有没有一种方法可以让我总是以dd/mm/yyyy
格式获得证书到期,以避免这个问题?
在解析DateTime时,无论您如何尝试,字符串表示年份30
都将默认转换为1930
,而从不转换为2030
。您最好按照@Glorin的建议进行操作,并使用X509Certificate2。此类型具有一个构造函数,该构造函数采用X509Certificate的实例。或者,您可以使用其他构造函数之一生成。以下是基于您提供的代码示例:
var cert2 = new X509Certificate2(cert);
if(cert2.NotAfter <= DateTime.Now)
{
_logger.Log(LogLevel.Error, "Chain Certificate is Expired");
return false;
}
你可以试试这个(因为我是法语,所以你的格式可能是MM/dd/yyyy):
DateTime dt = DateTime.ParseExact(item.GetExpirationDateString(), "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture);
string s = dt.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(s);