PHP - 使用STARTTLS和自签名证书的Swiftmailer

我正在尝试使用startTLS使用php和swiftmailer发送电子邮件,但我收到证书错误。我对SMTP服务器具有root访问权限,并且使用的证书是自签名的。我在两台机器(Web 服务器和 smtp 服务器)上都使用 Debian

PHP message: PHP Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in [..]/lib/classes/Swift/Transport/StreamBuffer.php on line 97 PHP message: PHP Fatal error: Uncaught exception 'Swift_TransportException' with message 'Unable to connect with TLS encryption' in [..]/lib/classes/Swift/Transport/EsmtpTransport.php:294

我是否需要在某个地方添加我自己的证书才能使其被接受?或者这是一些OpenSSL配置错误?


答案 1

编者按:禁用SSL验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模拟受信任的终结点(例如 GitHub 或其他远程 Git 主机),并且您将容易受到中间人攻击

在将其用作解决方案之前,请确保您完全了解安全问题。

Swiftmailer 现在已经更新,包括一个选项。现在可以使用实例中的方法(而不是编辑 swift 类)来解决它。setStreamOptionsSwift_SmtpTransport

$transport = Swift_SmtpTransport::newInstance('smtp.server.com', 123, 'tls')
    ->setUsername('username')
    ->setPassword('password')
    ->setStreamOptions(array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false)));

答案 2

我在Laravel中使用Swiftmailer时遇到了同样的问题。

看起来在 Swiftmailer 中没有这样的选项。干净的解决方案是将您自己的根 CA 添加到服务器,并使用此 CA 对邮件服务器证书进行签名。在此之后,证书将有效。例如,请参阅本教程

编者按:禁用SSL验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以模拟受信任的终结点(例如 GitHub 或其他远程 Git 主机),并且您将容易受到中间人攻击

在将其用作解决方案之前,请确保您完全了解安全问题。

无论如何,您不应该使用的快速肮脏黑客就是 编辑 。在第 253 行中替换:swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php_establishSocketConnection()

$options = array();

用这样的东西:

$options = array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false));

这将更改 stream_context_create()ssl 选项(下面几行):$options

$this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, 
    $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));

推荐