You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

受信任的自签名证书遭SMTP客户端拒绝问题求助

SMTP服务器StartTLS安全流初始化失败问题解决

问题背景

自行搭建了用于测试的“伪”SMTP服务器,标准SMTP功能正常,但客户端请求StartTLS后,始终无法完成安全流初始化,客户端会拒绝服务器验证并抛出异常。

环境信息

  • 使用IIS生成的自签名证书
  • 证书未过期,已存入个人和受信任CA证书存储区
  • 服务器已设置忽略CRL检查
  • 服务器与客户端在同一机器上,通过两个Visual Studio实例同时运行

相关代码

服务器端TLS握手代码

private void TlsHandshake(string certSerialNo, SslStream stream)
{
    X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    certStore.Open(OpenFlags.ReadOnly);
    X509Certificate2 cert = certStore.Certificates.Find(X509FindType.FindBySerialNumber, certSerialNo, true)[0];

    stream.AuthenticateAsServer(cert, false, false);
}

客户端测试代码

static void Main(string[] args)
{
    Console.WriteLine("Starting up...");
    using (SmtpClient client = new SmtpClient("127.0.0.1", 25))
    {
        client.EnableSsl = true;
        client.Send("test@from.com", "test@to.com", "asubject", "abody");
    }
}

解决方案

1. 修正服务器端TLS握手参数

服务器端AuthenticateAsServer方法参数配置存在问题:

  • 第三个参数传入false会使用默认SSL协议集,易出现协议兼容性问题
  • 需明确最后一个参数为false以禁用CRL检查,匹配你提到的服务器设置

修改后的代码:

private void TlsHandshake(string certSerialNo, SslStream stream)
{
    X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    certStore.Open(OpenFlags.ReadOnly);
    X509Certificate2 cert = certStore.Certificates.Find(X509FindType.FindBySerialNumber, certSerialNo, true)[0];

    // 指定支持的TLS版本,禁用CRL检查
    stream.AuthenticateAsServer(cert, false, SslProtocols.Tls12 | SslProtocols.Tls13, false);
}

2. 处理客户端证书验证问题

自签名证书常因域名不匹配导致验证失败(比如IIS生成的证书绑定机器名/localhost,但客户端用127.0.0.1连接),可通过两种方式解决:

方式一:临时忽略客户端证书验证(仅测试用)

在客户端代码中添加证书验证回调,跳过所有证书检查:

static void Main(string[] args)
{
    Console.WriteLine("Starting up...");
    // 仅用于测试环境,生产环境请勿使用
    ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
    
    using (SmtpClient client = new SmtpClient("127.0.0.1", 25))
    {
        client.EnableSsl = true;
        client.Send("test@from.com", "test@to.com", "asubject", "abody");
    }
}

方式二:生成匹配域名的自签名证书

重新生成自签名证书,确保Subject Alternative Name (SAN) 包含127.0.0.1和localhost,这样客户端用127.0.0.1连接时,证书域名验证会通过。

3. 确认SMTP流程正确性

确保服务器端遵循标准SMTP STARTTLS流程:

  1. 客户端发送EHLO命令
  2. 服务器回复支持STARTTLS
  3. 客户端发送STARTTLS命令
  4. 服务器回复220 Ready to start TLS
  5. 双方开始TLS握手(此时调用你的TlsHandshake方法)

若服务器未收到STARTTLS命令就启动TLS握手,会直接导致客户端异常。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:25:55