Intereting Posts

PHP – Swiftmailer с использованием STARTTLS и самоподписанных сертификатов

Я пытаюсь отправить электронное письмо с помощью php и swiftmailer, используя STARTTLS, но получаю ошибку сертификата. У меня есть root-доступ к SMTP-серверу, и используемый сертификат самоподписан. Я использую Debian на обеих машинах (веб-сервер и 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?

Swiftmailer теперь обновлен, чтобы включить в него вариант. Теперь его можно решить с setStreamOptions метода setStreamOptions из вашего экземпляра Swift_SmtpTransport а не для редактирования класса setStreamOptions .

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

У меня такая же проблема с использованием Swiftmailer в Laravel.

Похоже, в Swiftmailer нет возможности для этого. Чистым решением было бы добавить свой собственный корневой ЦС на ваш сервер и подписать сертификат вашего почтового сервера с этим ЦС. После этого сертификат будет действителен. См. Например, этот учебник .

Во всяком случае, быстрый грязный хак, который вы не должны использовать, – это редактировать 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)); 

Вам не нужно редактировать /vendor файлы /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']); } ...