当前位置: 首页 > 知识库问答 >
问题:

C#获取SMTP-Server的SSL证书过期日期作为从服务器证书验证回调的返回值

魏襦宗
2023-03-14

目前,我有以下代码来获取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;
                    }
                }
            }
        }

}

我的问题是我想将GetSMTPCert方法从false更改为字符串,以便我可以将证书到期日期返回给我的主方法。但目前我只能在Remote teServerCerateValidationCallback方法中获取到期日期,无法从那里返回。有没有可能的方法来获取我的GetSMTPCert方法的证书到期日期,然后将其返回给我的主方法?

我们也欢迎您提供有关获取SMTP服务器SSL证书到期日期的其他方法的建议。

共有1个答案

司马耘豪
2023-03-14

好的,我通过将字符串“CertificateDaysLeft”类型的公共静态字段添加到SMTPCert类中解决了这个问题。

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

}

我想我觉得有点太复杂了。

 类似资料:
  • 如果我在Mac或Linux中有实际的文件和Bash shell,我如何查询证书文件何时过期?不是web站点,而是证书文件本身,假设我有csr、key、pem和chain文件。

  • 我浏览了互联网,还没有找到一个解决方案或方法来验证证书时,通过HTTPS连接使用TIDWTTP。 我已经连接了一个idsslohandlersocketopenssl组件作为IOHandler,设置SSLModes,等等https://s3.amazonaws.com它无法验证证书。 OpenSSL(Indy)提供 “连接SSL时出错。SSL3\u获取\u服务器\u证书:证书验证失败” OpenS

  • 如果我在Mac中有一个实际的文件(.p12)和一个Bash shell,我如何提取证书和密钥文件以及证书过期日期?假设我有csr(.p12),关键文件。 提前感谢!

  • 问题内容: 尝试运行Discord机器人时,遇到此错误: 它刚刚开始无处不在,并且每次都在发生。 我在Windows 10上使用python 3.8 这是什么意思,我该如何解决? 问题答案: 要解决此问题: 使用Internet Explorer转到discord.com(以管理员身份运行) 点击右上角的锁 点击查看证书 安装一个 PS:如果您的防病毒软件对Web浏览器有效,并且此解决方案不起作用

  • 问题内容: 如果我在Mac或Linux中拥有实际的文件和Bash shell,如何查询cert文件何时到期?假设我有csr,key,pem和chain文件,则不是网站,而是证书文件本身。 问题答案: 与: 输出形式为: 以了解如何轻松地检查证书是否已过期,或者证书是否将在一定时间段内,而不必解析上述日期。

  • 我正在尝试使用SoundCloud SDK进行用户身份验证。用户单击“登录”后我的第一条路线: 然后我有下一条路线,它们被重定向: 我可以成功点击重定向url并返回代码,但我从Sinatra收到以下错误: OpenSSL::SSL::SSL中/signed_处的SSLError\u connect返回=1 errno=0 state=SSLv3读取服务器证书B:证书验证失败 我读过以下流行文章:h