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;
    }
}

}

我想我想的有点太复杂了。