You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenSSL SSL证书匹配错误:生产环境Rails邮件配置突发故障求助

解决OpenSSL::SSL::SSLError: hostname "smtp.gmail.com" does not match server certificate问题

这个错误本质是OpenSSL在TLS握手阶段,验证服务器返回的SSL证书时,发现证书声明的主机名和你请求的smtp.gmail.com不匹配。既然之前生产环境正常、突然失效,大概率是外部服务或服务器环境变化导致的,下面给你几个排查和解决的具体方向:

1. 先确认生产服务器对smtp.gmail.com的解析及证书有效性

登录你的生产服务器,执行这条命令查看Gmail SMTP服务器的证书详情:

openssl s_client -connect smtp.gmail.com:587 -starttls smtp

在输出结果里找到Subject:X509v3 Subject Alternative Name:字段,确认是否包含smtp.gmail.com。如果没有,说明你的服务器DNS解析出了问题(比如解析到了错误的IP),可以尝试刷新DNS缓存,或者更换DNS服务器(比如改用Google的8.8.8.8)。

2. 强制指定TLS版本

Gmail早已停止支持TLS 1.0/1.1这类旧版本协议,如果你的Rails应用默认使用的TLS版本过低,可能会导致握手时拿到错误的证书。修改你的setup_email.rb配置,添加强制TLS 1.2的设置:

if Rails.env.production? 
  ActionMailer::Base.smtp_settings = { 
    :address => "smtp.gmail.com", 
    :port => "587", 
    :domain => "gmail.com", 
    :user_name => "username", 
    :password => "mypass", 
    :authentication => "login", 
    :enable_starttls_auto => true,
    :tls_version => :TLSv1_2 # 新增这一行强制指定TLS版本
  } 
end

3. 更新服务器的CA根证书

如果生产服务器的CA根证书包过期,会导致无法验证Gmail的新SSL证书。根据你的服务器系统执行对应的更新命令:

  • Ubuntu/Debian系统:
sudo apt-get update && sudo apt-get install --reinstall ca-certificates
  • CentOS/RHEL系统:
sudo yum reinstall ca-certificates

4. 检查Gmail账号的安全设置

  • 如果你的Gmail账号开启了两步验证,原来的账号密码无法用于SMTP登录,需要去Google账号安全设置里生成一个应用专用密码,替换配置中的mypass
  • 登录Gmail网页端,检查是否有异常登录提醒——Google可能因为异常行为暂时限制了SMTP访问,需要手动解除限制。

5. 尝试更换SMTP端点(可选)

如果上述方法都无效,可以尝试使用Gmail的中继SMTP端点smtp-relay.gmail.com(注意:普通Gmail账号需要满足一定条件才能使用,G Suite账号适配性更好),配置示例:

if Rails.env.production? 
  ActionMailer::Base.smtp_settings = { 
    :address => "smtp-relay.gmail.com", 
    :port => "587", 
    :domain => "your-domain.com", # 替换为你的业务域名
    :user_name => "username", 
    :password => "mypass", 
    :authentication => "login", 
    :enable_starttls_auto => true,
    :tls_version => :TLSv1_2
  } 
end

附你的原始报错与配置:
报错信息:OpenSSL::SSL::SSLError: hostname "smtp.gmail.com" does not match the server certificate
配置代码:

if Rails.env.production? 
  ActionMailer::Base.smtp_settings = { 
    :address => "smtp.gmail.com", 
    :port => "587", 
    :domain => "gmail.com", 
    :user_name => "username", 
    :password => "mypass", 
    :authentication => "login", 
    :enable_starttls_auto => true 
  } 
end

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

火山引擎 最新活动