Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajouter un SSL pour un VPS

    8 octobre 2022 à 11:02:59


    Bonjour à toutes et à tous,

    J'ai un nom de domaine chez hostinger et j'héberge une application Node sur un VPS OVH qui effectue des requêtes API vers une base de donnée OVH.

    Quand je fais ma requête via postman ou directement via l'url à par exemple http://XX.XXX.XXX.X:8090/api/post j'obtiens bien la réponse et je vois mes données mais quand je passe en https:// j'obtiens ce message d'erreur

    Et le problème c'est que depuis le client le navigateur force le passage en https...

    Du coup je pense qu'il faut que j'installe un SSL sur le serveur, j'ai bien tenté pas mal de truc avec certbot par exemple mais quand ils me demandent un nom de domaine et bien au final je n'en ai pas puisque c'est simple une IP.

    Du coup ma question est : déjà est ce bien un problème de certificat SSL et ensuite comment en installler un sur un serveur que n'a pas de nom de domaines ?

    Merci à vous !
    • Partager sur Facebook
    • Partager sur Twitter
      8 octobre 2022 à 11:33:20

      Bonjour,

      As-tu essayé avec un autre navigateur? Et avec postman, as-tu une erreur aussi en HTTPS?

      Tu peux utiliser un certificat auto-signé (les utilisateurs de ton site auront un message comme quoi le certificat n'est pas reconnu, ils pourront alors manuellement autoriser l'utilisation de ce certificat pour ce site).

      Tu peux générer facilement un certificat avec openssl sur une distrib Linux.

      La commande:

      $ openssl req -x509 -newkey rsa:4096 -days days -keyout key_filename -out cert_filename

      remplacer days, key_filename et cert_filename par les valeurs voulues.

      Sinon, avec certbot, à la place du nom de domaine, indique l'adresse IP de ton serveur.

      Je ne sais pas en quel langage et avec quel framework est développé ton API. Et quel est le serveur web qui gère le protocol HTTP. Donc sans ces infos, il est difficile de conseiller sur la marche à suivre.

      Personnellement, j'aime bien utiliser un reverse proxy pour ce genre d'application. J'utilise le reverse proxy de NGINX (mais il en existe d'autres comme Apache ou HAProxy par exemple).

      https://www.nginx.com/blog/nginx-ssl/

      • Partager sur Facebook
      • Partager sur Twitter
        8 octobre 2022 à 12:18:30

        Bonjour KoaTao,

        Merci pour ta réponse,

        Effectivement je n'ai pas préciser grand chose. L'API a été développé avec Node et Express, le serveur est ubuntu 20.04. J'ai apache2 également sur le serveur.

        Le problème est le même pour tout les navigateur. Le message d'erreur postman est différent mais revient quand même à parler de SSL "Error: write EPROTO 48299656:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:../../../../src/third_party/boringssl/src/ssl/tls_record.cc:242:" et quand je cherche sur internent les forums disent juste de passer en http mais le problème c'est que le navigate force le https dans tout les cas même si mes variables d'environnement sont en http.

        J'ai donc effectué la commande que tu m'as donné, je l'avais déjà utilisé et j'obtiens bien mes fichiers key et crt (il faut que je supprime ce sans l'extension) mais cela ne change rien... C'est mon premier déploiement de Node c'est vraiment une autre paire de manche qu'un site vitrine lol

        Peut être qu'il faut maintenant paramétrer des choses dans la config apache ? J'ai vu des forums ou ça parlait du dossier sites-availes et enabled dans /etc/apache2 mais comme je lis beaucoup trop d'information et ligne de commande en ce moment je commence à me perdre complétement..

         Et le problème avec certbot c'est qui me renvoie ça quand je met l'ip à la place du nom de domaine : "Requested name XX.XXX.XXX.XX is an IP address. The Let's Encrypt certificate authority will not issue certificates for a bare IP address."

        PS : J'ai aussi ajouté au DNS de mon nom de domaine l'IP du VPS, je ne sais pas si cela est utile

        -
        Edité par julosd 8 octobre 2022 à 12:45:24

        • Partager sur Facebook
        • Partager sur Twitter
          8 octobre 2022 à 13:27:30

          Normalement, ton application Node avec Express est déjà un serveur web, par défaut, tu utilises sûrement le server HTTP de Node.

          Soit tu ajoutes le serveur HTTPS de Node:

          https://expressjs.com/en/api.html#app.listen (construction du serveur utilisant ton application avec express)

          https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener (pour l'utilisation et la gestion des certificats).

          Soit tu configures apache en reverse proxy aussi pour ce qui est trafic HTTPS (en gros Apache gère tout ce qui est TLS et ensuite redirige le trafic vers ton appli en HTTP). Tu définis pour cela un hôte virtuel (VirtualHost ou vhost).

          https://httpd.apache.org/docs/current/vhosts/ (configuration d'un Virtual Host)

          https://httpd.apache.org/docs/current/ssl/ (pour la configuration de TLS avec certificats)

          Par contre, j'ai oublié de préciser, mais HTTP et HTTPS sont deux «serveurs» différents, il faut utiliser un port différent pour le HTTP (par défaut 80), et HTTPS (par défaut 443).

          L'avantage d'utiliser Apache en reverse proxy dans ton cas est le suivant:

          - Ton application Express configure un serveur HTTP en écoute sur socket réseau (une association adresse IP/port/protocle)  qui ne nécessite pas des droits élevés en utilisant notamment un port TC du type 8000, 8080, 8443, 9000, 9443 (les ports alternatifs courants utilisés dans le web). Ne pas lancer ton application avec des droits élevés offre une meilleure sécurité. En plus de ça tu peux uniquement mettre ton application en écoute sur l'interface de loopback (une interface qui ne permet qu'à ton système de communiquer avec lui-même), l'adresse de loopback typiquement utilisée est 127.0.0.1.

          Donc ton appli Express est en écoute sur 127.0.0.1:8000 par exemple.

          - Pour gérer le trafic venant de l'extérieur vers ton application tu utilises apaches en reverse proxy. C'est lui qui va écouter sur les ports standards du web (80 pour HTTP et 443 pour HTTPS). Pour écouter sur ces ports, il faut avoir des droits plus élevés. Apache gérera donc tout le côté établissement de la connexion, gestion de la file d'attente, gestion des connexions sécurisés avec TLS (HTTPS).

          Apache redirige ensuite les requêtes vers ton serveur Express en HTTP en interne sur ta machine.

          Pour résumer:

          Internet --- Serveur OVH (IP: a.b.c.d) ---<Connexion d'internet en HTTP et HTTPS vers a.b.c.d>--- Serveur Apache (en écoute sur a.b.c.d:80 et a.b.c.d:443) ---<Redirection en interne du trafic HTTP et HTTPS vers l'app Express en HTTP>--- App Express (en écoute sur 127.0.0.1:8000)

          J'ai utilisé a.b.c.d:80 (le port 80 pour HTTP) et a.b.c.d:443 (le port 443 pour HTTPS) car ce sont les ports standards pour ces deux protocoles, mais tu es libre d'utiliser n'importe quels autres ports supérieur à 2048 à la place (à condition qu'il ne soit pas déjà utilisé).

          Dans ton app Node:

          var express = require('express')
          var app = express()
          app.listen(8000, '127.0.0.1')
          

          Dans les fichiers de conf sites-available d'apache, tu devrais avoir un truc du genre (je connais pas trop Aapche donc je ne suis pas certains de la conf):

          Listen 80
          Listen 443
          <VirtualHost *:80>
              ProxyPreserveHost On
              ProxyPass        "/" "http://127.0.0.1:8000/"
              ProxyPassReverse "/" "http://127.0.0.1:8000/"
              ServerName a.b.c.d
          </VirtualHost>
          <VirtualHost *:443>
              ProxyPreserveHost On
              ProxyPass        "/" "http://127.0.0.1:8000/"
              ProxyPassReverse "/" "http://127.0.0.1:8000/"
              ServerName a.b.c.d
              SSLEngine on
              SSLCertificateFile "/path/to/a.b.c.d.cert"
              SSLCertificateKeyFile "/path/to/a.b.c.d.key"
          </VirtualHost>
          
          

          Activer le site avec la commande a2enmod <non_du_site>.
          Et bien sur relancer apache une fois que les modifications sont effectuées.

          -
          Edité par KoaTao 8 octobre 2022 à 13:33:30

          • Partager sur Facebook
          • Partager sur Twitter
            8 octobre 2022 à 15:29:57

            Génial merci beaucoup pour toutes ces explications bien détaillées, je me planche sur tout ça je te fais un retour si ça résout le problème !

            -
            Edité par julosd 8 octobre 2022 à 15:34:02

            • Partager sur Facebook
            • Partager sur Twitter

            Ajouter un SSL pour un VPS

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown