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

 最好的冰雪之母_227 发布于 2022-12-11 20:42

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

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配置错误?

3 个回答
  • 您无需编辑/vendor文件.您可以在config/mail.php文件中指定(未记录的)选项:

    'stream' => [
        'ssl' => [
            'allow_self_signed' => true,
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
    ],
    

    你可以自己vendor/laravel/framework/src/Illuminate/Mail/TransportManager.php在线检查~50:

    ...
    if (isset($config['stream'])) {
        $transport->setStreamOptions($config['stream']);
    }
    ...
    

    2022-12-11 20:44 回答
  • 我在Laravel中使用Swiftmailer遇到了同样的问题.

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

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

    $options = array();
    

    用这样的东西:

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

    这将改变SSL选项的stream_context_create)( (下面的几行$options):

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

    2022-12-11 20:44 回答
  • Swiftmailer现已更新,包括一个选项.现在可以使用实例中的setStreamOptions方法解决它,Swift_SmtpTransport而不是编辑swift类.

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

    2022-12-11 20:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有