C# 从 ServerCertificateValidationCallback 获取 SMTP 服务器的 SSL 证书到期日期作为 return 值
C# Get SSL-Certificate expiration date of SMTP-Server as return value from ServerCertificateValidationCallback
目前我有这段代码来获取 SMTP 服务器的到期日期:
namespace SMTPCert
{
public class SMTPCert
{
public static void GetSMTPCert(string ServerName)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
using (System.Net.Mail.SmtpClient S = new System.Net.Mail.SmtpClient(ServerName))
{
S.EnableSsl = true;
using (System.Net.Mail.MailMessage M = new System.Net.Mail.MailMessage("test@example.com", "test@example.com", "Test", "Test"))
{
try
{
S.Send(M);
}
catch (Exception)
{
return;
}
}
}
}
private static bool RemoteServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
Console.WriteLine(certificate);
return true;
}
}
}
我的问题是我想将 GetSMTPCert 方法从无效更改为字符串,以便我可以 return 将证书到期日期更改为我的主要方法。
但目前我只能在 RemoteServerCertificateValidationCallback 方法中获取到期日期,而不能从那里获取 return。是否有任何可能的方法将证书到期日期发送到我的 GetSMTPCert 方法,然后 return 将其发送到我的主要方法?
也欢迎提出有关获取 SMTP 服务器的 SSL 证书到期日期的其他方法的建议。
好的,我通过将类型字符串 "CertificateDaysLeft" 的 public 静态字段添加到我的 SMTPCert class.
解决了这个问题
namespace SMTPCert
{
public static string CertificateDaysLeft;
public static string GetSMTPCert(string ServerName)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
using (System.Net.Mail.SmtpClient S = new System.Net.Mail.SmtpClient(ServerName))
{
S.EnableSsl = true;
using (System.Net.Mail.MailMessage M = new System.Net.Mail.MailMessage("test@example.com", "test@example.com", "Test", "Test"))
{
try
{
S.Send(M);
string daysLeft = CertificateDaysLeft;
return daysLeft;
}
catch (Exception)
{
string daysLeft = CertificateDaysLeft;
return daysLeft;
}
}
}
}
private static bool RemoteServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
DateTime ExpirDate = Convert.ToDateTime(certificate.GetExpirationDateString());
string DaysLeft = Convert.ToString((ExpirDate - DateTime.Today).Days);
CertificateDaysLeft = DaysLeft;
Console.WriteLine(certificate);
return true;
}
}
}
我想我想的有点太复杂了。
目前我有这段代码来获取 SMTP 服务器的到期日期:
namespace SMTPCert
{
public class SMTPCert
{
public static void GetSMTPCert(string ServerName)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
using (System.Net.Mail.SmtpClient S = new System.Net.Mail.SmtpClient(ServerName))
{
S.EnableSsl = true;
using (System.Net.Mail.MailMessage M = new System.Net.Mail.MailMessage("test@example.com", "test@example.com", "Test", "Test"))
{
try
{
S.Send(M);
}
catch (Exception)
{
return;
}
}
}
}
private static bool RemoteServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
Console.WriteLine(certificate);
return true;
}
}
}
我的问题是我想将 GetSMTPCert 方法从无效更改为字符串,以便我可以 return 将证书到期日期更改为我的主要方法。 但目前我只能在 RemoteServerCertificateValidationCallback 方法中获取到期日期,而不能从那里获取 return。是否有任何可能的方法将证书到期日期发送到我的 GetSMTPCert 方法,然后 return 将其发送到我的主要方法?
也欢迎提出有关获取 SMTP 服务器的 SSL 证书到期日期的其他方法的建议。
好的,我通过将类型字符串 "CertificateDaysLeft" 的 public 静态字段添加到我的 SMTPCert class.
解决了这个问题namespace SMTPCert
{
public static string CertificateDaysLeft;
public static string GetSMTPCert(string ServerName)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
using (System.Net.Mail.SmtpClient S = new System.Net.Mail.SmtpClient(ServerName))
{
S.EnableSsl = true;
using (System.Net.Mail.MailMessage M = new System.Net.Mail.MailMessage("test@example.com", "test@example.com", "Test", "Test"))
{
try
{
S.Send(M);
string daysLeft = CertificateDaysLeft;
return daysLeft;
}
catch (Exception)
{
string daysLeft = CertificateDaysLeft;
return daysLeft;
}
}
}
}
private static bool RemoteServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
DateTime ExpirDate = Convert.ToDateTime(certificate.GetExpirationDateString());
string DaysLeft = Convert.ToString((ExpirDate - DateTime.Today).Days);
CertificateDaysLeft = DaysLeft;
Console.WriteLine(certificate);
return true;
}
}
}
我想我想的有点太复杂了。