Laravel8部署正式服务器后SMTP邮件证书CN不匹配报错排查
报错根因
你遇到的stream_socket_enable_crypto(): Peer certificate CN=<hostname> did not match expected CN=smtp-relay.sendinblue.com错误,本质是SMTP建立TLS加密连接时,对方返回的SSL证书绑定的域名和你请求连接的域名不匹配。本地Windows环境正常、上线后报错,问题基本出在服务器端的配置缓存、网络链路、系统证书环境上,你贴出的Laravel邮件配置本身没有语法错误。
排查步骤(按优先级从高到低)
第一步:清除Laravel配置缓存
服务器部署后如果没有执行配置清理命令,Laravel会读取旧的缓存配置,很可能之前残留的旧SMTP主机配置还在生效,实际连接的根本不是Sendinblue的SMTP服务器。直接在项目根目录执行以下命令:php artisan config:clear php artisan cache:clear清理完成后重试发信,看是否恢复正常。
第二步:排查服务器网络链路问题
这是该报错最高发的原因:服务器DNS被污染、出口防火墙/代理劫持了SMTP流量,导致你请求smtp-relay.sendinblue.com时实际连到了别的服务器,对方返回的证书自然和预期域名不匹配。- 先在服务器执行域名解析测试,确认解析结果正确:
如果返回的IP不属于Sendinblue官方IP段,直接换服务器DNS为公共DNS(比如1.1.1.1、8.8.8.8)再重试。nslookup smtp-relay.sendinblue.com - 直接用openssl测试TLS连接,绕过Laravel验证链路:
查看输出中openssl s_client -connect smtp-relay.sendinblue.com:587 -starttls smtpsubject字段的CN值,如果不是smtp-relay.sendinblue.com,可以确定是网络劫持问题,联系服务器运营商/网络管理员放开587端口的流量拦截,关闭SMTP流量劫持即可。
- 先在服务器执行域名解析测试,确认解析结果正确:
第三步:更新服务器系统CA证书包
如果openssl测试返回的证书CN确实是smtp-relay.sendinblue.com,那问题出在服务器的根证书库过旧,无法正确校验Sendinblue的证书链:- CentOS/RHEL系统执行:
yum update ca-certificates -y - Debian/Ubuntu系统执行:
apt update && apt install --reinstall ca-certificates -y
更新完成后重启php-fpm、Web服务再测试发信。
- CentOS/RHEL系统执行:
注意事项
绝对不要为了快速修复直接在SMTP配置中加'verify_peer' => false关闭证书校验,这种方式会完全失去TLS加密的防护能力,存在邮箱账号泄露、邮件内容被窃听的中间人攻击风险,仅可用于临时测试,生产环境严禁使用。
内容的提问来源于stack exchange,提问作者kyi

