2014-11-12 3 views
8

Я пытаюсь отправить электронное письмо с помощью php и swiftmailer с помощью STARTTLS, но я получаю ошибку сертификата. У меня есть root-доступ к SMTP-серверу, и используемый сертификат самоподписан. Я использую Debian на обеих машинах (веб-сервер и сервер SMTP)PHP - Swiftmailer с использованием STARTTLS и самоподписанных сертификатов

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?

ответ

10

Swiftmailer сейчас был обновлен, чтобы включить в него вариант. Теперь его можно решить с помощью метода setStreamOptions из вашего экземпляра Swift_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))); 
+1

Где вы создали эти строки? –

+0

@WilliamLepinski Вы просто звоните в setStreamOptions, где бы вы ни находились в своем коде, который вы создаете экземпляр Swift_SmtpTransport. Если вы не знаете, как использовать Swift Mailer, см. Пример здесь: http://swiftmailer.org/docs/sending.html Следуйте этому примеру, но добавьте вызов setStreamOptions из экземпляра Swift_SmtpTransport. –

+1

Это худшее, что вы можете сделать, отключите все преимущества безопасности TLS. –

12

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

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

В любом случае, быстрый грязный хак, который вы не должны использовать, - это изменить swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php. В _establishSocketConnection() строке 253 заменить:

$options = array(); 

с чем-то вроде этого:

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

Это изменит ssl options из stream_context_create() (несколько строк ниже $options):

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

Не нужно редактировать /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']); 
} 
... 
Смежные вопросы