10
votes

Comment désactiver "verify_peer" avec le composant Symfony Mailer?

Je configure un serveur de messagerie (postfix), avec un certificat auto-signé, et il semble que ce certificat auto-signé soit un problème pour le composant Symfony Mailer.

Sur Swiftmailer, en utilisant une configuration telle que:

stream_options:
    ssl:
        verify_peer: false
        verify_peer_name: false

ou

transport:
    stream_options:
        ssl:
            allow_self_signed: true

pourrait le résoudre, mais je ne trouve pas de moyen de le faire sur mailer (je veux utiliser les fichiers de configuration YAML si possible).


0 commentaires

3 Réponses :


8
votes

Cette option sera activée lorsque cette demande d'extraction , qui a déjà été fusionnée dans master, est balisée et publiée.

Il semble donc que vous deviez attendre la prochaine version de Symfony (celle-ci a été fusionnée dans la branche 5.1, donc il ne semble pas du tout qu'elle sera disponible dans la branche 4.x), puis vous pourrez faites cela en ajoutant verify_peer à votre configuration Mailer DSN.

Régulièrement, vous pourrez configurer Mailer, il vous suffit de créer une variable d'environnement MAILER_DSN (généralement la définition de la valeur sur l'un de vos fichiers .env suffit).

Dans un futur proche, vous pourrez faire ceci:

MAILER_DSN=smtp://user:pass@localhost?verify_peer=false

Mais pour le moment (à partir de 4.4.4 et 5.0.4), vous ne pouvez pas faire cela de manière native avec Symfony Mailer.


6 commentaires

Ça semble parfait ! Mais cela ne semble pas encore être sous une étiquette, n'est-ce pas? Je suis actuellement sur 4.4, aucune mise à jour disponible et je n'ai pas ça ...


Vous avez raison, il ne semble pas avoir été fusionné. Il existe sur le changelog du maître , mais pas sur le changelog 4.4.4 . Je vais modifier la réponse pour refléter cela. Je suis sûr que 4.4.5 devrait être publié prochainement.


Vous voulez dire que le problème sera résolu uniquement dans 4.4.5, pas 4.4.4? car j'ai le même problème et j'utilise le dernier lTS (4.4.4)


@hous Yup, comme expliqué dans la réponse et les commentaires; 4.4.4 n'inclut pas encore cette fonctionnalité. Puisqu'il a été fusionné avec master, la prochaine version devrait l'inclure.


@yivi, oui je le ferai;) mais savez-vous quand la version 4.4.5 sortira? parce que je suis sur le point de faire un projet avec 4.4.4 et je n'aime pas utiliser SwiftMailer


Aucune idée, @hous. Cela devrait être trop long maintenant, mais il n'y a pas de calendrier de publication prédéfini pour les versions mineures que je connaisse.



3
votes

Malheureusement, la fonction verify_peer n'est pas (encore) dans symfony 4.4 comme l'indique correctement @yivi.

J'ai essayé de mettre à jour symfony / mailer dans composer vers dev-master mais les contraintes de symfony flex ne le permettent pas en raison de:

Restreindre les paquets répertoriés dans "symfony / symfony" à "4.4. *"

J'ai donc fini par mailer.transport_factory.smtp :

parameters:
  env(verify): 'false'

framework:
  mailer:
  dsn: '%env(MAILER_DSN)%?verify_peer=%env(bool:verify)%'

avec une EsmtpTransportFactory personnalisée qui contient cette fonctionnalité:

<?php


namespace App\Mailer;

use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport;
use Symfony\Component\Mailer\Transport\TransportInterface;

final class EsmtpTransportFactory extends AbstractTransportFactory
{
    public function create(Dsn $dsn): TransportInterface
    {
        $tls = 'smtps' === $dsn->getScheme() ? true : null;
        $port = $dsn->getPort(0);
        $host = $dsn->getHost();

        $transport = new EsmtpTransport($host, $port, $tls, $this->dispatcher, $this->logger);

        if (!$dsn->getOption('verify_peer', true)) {
            /** @var SocketStream $stream */
            $stream = $transport->getStream();
            $streamOptions = $stream->getStreamOptions();

            $streamOptions['ssl']['verify_peer'] = false;
            $streamOptions['ssl']['verify_peer_name'] = false;

            $stream->setStreamOptions($streamOptions);
        }

        if ($user = $dsn->getUser()) {
            $transport->setUsername($user);
        }

        if ($password = $dsn->getPassword()) {
            $transport->setPassword($password);
        }

        return $transport;
    }

    protected function getSupportedSchemes(): array
    {
        return ['smtp', 'smtps'];
    }
}

Notez la valeur booléenne si verify_peer dans le DSN ne peut pas être une chaîne.
Cela ne fonctionnera pas : MAILER_DSN=smtp://foo@default?verify_peer=false
Cela fonctionnera: MAILER_DSN=smtp://foo@default?verify_peer=0
ou comme mentionné dans ce commentaire :

mailer.transport_factory.smtp:
    class: App\Mailer\EsmtpTransportFactory
    tags:
      - { name: 'mailer.transport_factory', priority: "-100" }

Je suppose que ce serait mieux si cette fonctionnalité était portée à 4.4, mais j'utilise cette solution de contournement depuis longtemps.


0 commentaires

0
votes

Vous pouvez utiliser:

MAILER_DSN="smtp://user:pass@localhost?encryption=ssl&stream_options[ssl][verify_peer]=false&stream_options[ssl][verify_peer_name]=false&stream_options[ssl][allow_self_signed]=true"


0 commentaires