Laravel 5

SSL sur un Projet Laravel existant [Laravel 5.2 ; PHP 7.0 ; Serveur Debian 8]

  • Avatar de MakoubaSetho
    Membre depuis :
    16/10/2017
    Messages :
    19

    Bonjour à tous,
    Je souhaite sécuriser un projet Laravel via un chiffrement SSL (HTTPS) certifié.

    Le site est hébergé sur un serveur, fait par mes soins,
    Sur une Debian 8.11 avec Apache 2 - PHP 7.0 .. Je l'ai développé en Laravel 5.2.

    Mais je rencontre 2 problèmes/incompréhensions distinctes :

    • Installer et Configurer un certificat SSL LIBRE sur ma machine Debian
    • Comment mettre en place le SSL sur un projet Laravel

    I - Certificat SSL :
    Pour le certificat, je m'essaie à passer par l'outils "LetsEncrypt" ->
    Censé être simple à mettre en place, et gratuit, mais qui me revois toujours sur une erreur que je comprends comme étant due au passage à travers un Proxy, mais que je ne parviens pas à résoudre ... !

    A l'excecution de "./certbot-auto", j'obtiens toujours l'erreur suivante :

    WARNING: unable to check for updates.
    Creating virtual environment...
    Installing Python packages...
    Traceback (most recent call last):
    File "/tmp/tmp.iT9hh893Gr/pipstrap.py", line 177, in <module>
    sys.exit(main())
    File "/tmp/tmp.iT9hh893Gr/pipstrap.py", line 158, in main
    for path, digest in PACKAGES]
    File "/tmp/tmp.iT9hh893Gr/pipstrap.py", line 117, in hashed_download
    response = opener(using_https=parsed_url.scheme == 'https').open(url)
    File "/usr/lib/python2.7/urllib2.py", line 433, in open
    response = self._open(req, data)
    File "/usr/lib/python2.7/urllib2.py", line 451, in _open
    '_open', req)
    File "/usr/lib/python2.7/urllib2.py", line 411, in _call_chain
    result = func(*args)
    File "/usr/lib/python2.7/urllib2.py", line 1242, in https_open
    context=self._context)
    File "/usr/lib/python2.7/urllib2.py", line 1199, in do_open
    raise URLError(err)
    urllib2.URLError: <urlopen error [Errno 101] Network is unreachable>

    J'ai cru comprendre que "urllib2" avait bien du mal à faire son office au travers d'un Proxy ...
    J'ai essayé de lui passer le miens, en changeant le fichier "/usr/lib/python2.7/urllib2.py" pour y ajouter mes paramètres tel qu'en suivant les conseils de ce site :

    proxy = urllib2.ProxyHandler({'http': '127.0.0.1'}) //En remplacant l'adresse IP locale par celle de mon proxy
    opener = urllib2.build_opener(proxy)
    urllib2.install_opener(opener)
    f = urllib2.urlopen('http://www.google.com') //"f =" etant présent avant dans les parametres du fichier

    Mais rien ne passe -_- ...
    Mon Proxy est, autrement, bien configuré et toutes les requêtes vers l'extérieur passent.

    II - Laravel HTTPS :
    Quelques postes existent déjà sur le sujet, certes.
    Mais j'ai l'impression que la réponse diffère plus où moins à tous les coups et n'est jamais complète ?!
    Il est vrai également que je ne peux être certain de ce que je fait puisque, sans certificat adéquat, le passage en HTTPS ne peut pleinement aboutir mais c'est mon but final alors je profite de ce billet pour pouvoir faire le point.

    L'installation du Certificat, une fois aboutie, implique normalement la modification du fichier de vHost d'Apache2 comme l'exemple suivant :

    <VirtualHost :80>
    #Host 80 redirige tout sur 443

    ServerName domain.tld
    ServerAlias www.domain.tld

    RewriteEngine on
    RewriteCond %{HTTPS} !on
    RewriteRule (.
    ) https://%{HTTP_HOST}%{REQUEST_URI}

    </VirtualHost>

    <VirtualHost *:443>
    #Host 443 = ssl

    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /path/laravel-project/public

    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>

    <Directory /path/laravel-project>
    AllowOverride all
    </Directory>

    ServerAlias laravel-project

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/laravel-project/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/laravel-project/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/laravel-project/chain.pem
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCompression off
    SSLOptions +StrictRequire
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/laravel-project.log
    CustomLog ${APACHE_LOG_DIR}/laravel-project.log combined

    </VirtualHost>

    Cette modification du vHost est-elle également nécessaire pour un projet Laravel ? Sachant qu'on applique plus où moins les même via les options qui suivent ... :

    Sinon, oui, j'ai noté : Il faut forcer les URL du site en HTTPS depuis un provider :

    namespace App\Providers;

    use Illuminate\Support\Facades\URL;

    use Illuminate\Support\ServiceProvider;

    class AppServiceProvider extends ServiceProvider

    {

    public function boot()

    {

    URL::forceScheme('https');

    }

    }

    Mais je tombe également sur des choses dans ce goût là, venant modifier notre ".htaccess" :

    RewriteEngine On

    RewriteCond %{HTTPS} !on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    Ainsi que :

    FORCE_SSL=true

    Dans le ".env" ...

    Est-il tout à fait nécessaire de modifier TOUT CA ?!
    En repassant mon Appli' en local, plus rien ne marchera !?
    Je me doute qu'une condition du style :

    if (App::environment() === 'production')
    {
    URL::forceScheme('https');
    }
    else
    {
    }

    Pourrait faire l'affaire, mais alors il faut également changer tout le ".htaccess" ?

    BREF,

    J'aurais bien besoin d'un coups de main !
    La plupart des topic d'aide au SSL sur Laravel élipsent totalement la partie de Certification alors qu'elle est crutiale et peut se faire de 50 façons différentes .. Quanta la prise en charge réelle et totale de l'HTTPS par un projet Laravel, je m'y perds un peu également, donc si quelqu'un se sent de me donner un coups de main.

  • Avatar de KYoann
    Membre depuis :
    11/02/2019
    Messages :
    15

    Salut,

    Je pourrais pas beaucoup t'aider concernant l'aspet serveur. Mais pour ce qui est de la partie SSL, je peut te dire que mes projets qui été publier sur un serveur sans SSL, j'ai symplement activer les certificats sur mes hebergements, et je n'ai eu aucune modification à apporter dans mon code.

  • Avatar de MakoubaSetho
    Membre depuis :
    16/10/2017
    Messages :
    19

    Merci de ce premier retour !
    Et cela voudrait donc dire que, dans le principe, si je me concentre sur l'importation du certificat SSL purement serveur (Génération du Certificat + Modification des fichiers VHosts d'Apache), la simple redirection HTTPS conseillée pour Laravel via le provider suffira donc à faire le travail .. ?!
    Si je trouve du temps, je regarderais + en profondeur la partie installation/configuration de certif' sur mon serveur !
    Et je vous tiendrais donc au courant ^^

  • Avatar de MakoubaSetho
    Membre depuis :
    16/10/2017
    Messages :
    19

    Je déterre enfin mon sujet, mais c'est pour le Résoudre !
    Mes tests avec LetsEncrypt étaient perdus d'avance,
    Dans la mesure où ce dernier ne signe que des Sites Webs PUBLIQUES (Et que le miens est en interne)...

    Si ça interesse quelqu'un, mon erreur avec CertBot provennait tout de même bien du Proxy,
    Car la variable "https_proxy" n'était pas renseignée dans :
    /ect/profil.d/proxy.sh


    Bref, au final je suis partit sur de l'OpenSSL classique qui, après plusieurs essais infructueux et UN BON TUTO
    , à porté ses fruits et ce, effectivement, sans nécessiter de modification du code de mon Projet !
    Seul le fichier de conf' VirtualHost lié à mon site à été bidouillé pour correspondre au besoin (SSL = 443).

    Je n'arrive pas à donné une double configuration (80+443) comme dans l'exemple que j'ai donné avant, mais peu importe, car tout fonctionne avec le SSL seul, sans provider dédié, sans règles dans le .htaccess tel que :

    NameVirtualHost :443
    <VirtualHost
    :443>
    ServerName monSite.monDomain.mk
    ServerAdmin monemail@secret.gfy
    DocumentRoot /var/www/monSite/public

    #Règles d'Accès aux Dossiers
    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>
    <Directory /var/www/monSite>
    AllowOverride All
    </Directory>

    #Les directives pour les certificats
    SSLEngine On
    SSLCertificateFile /etc/ssl/server-monSite.crt
    SSLCertificateKeyFile /etc/ssl/server-monSite.key

    #Les directives qui suivent ne sont pas obligatoires mais
    #aident au débugage
    #On isole les erreurs relatives à http
    #Attention : il faut créer le fichier "error_ssl.log"

    ErrorLog /var/log/apache2/error_ssl.log
    LogLevel warn
    </VirtualHost>

    °- Nb : Il à également été nécessaire de mettre à jour le liens des Icônes Materialize 0.100.2 ! Car il est passé en HTTPS aussi et qu'une fois mon site raccord, il n'y avait plus d'icônes distribuées par l'ancien lien (non sécurisé)

Vous ne pouvez pas répondre à ce sujet.