8768 sujets

Développement web côté serveur, CMS

Bonjour à tous !
Je viens vers vous aujourd'hui car je butte sur une notion qui est nouvelle pour moi.

J'ai créé un site (html/js) ainsi qu'une API hébergée sur un server VPS chez Ionos. Quand j'interroge mon API avec Postman je reçois les bonnes réponses, tout semble bien fonctionner.
Quand le site est exécuté localement (dans Visual Studio Code via Live Server) tout fonctionne nickel. Par contre quand j'envoie les pages sur mon hébergeur et que j'y accède normalement via l'url, les connexions à l'API posent problème. J'ai le message :
a écrit :
Blocked loading mixed active content “http://xxx.xxx.xxx.xxx:xx/api/xxxxxl/”
.

Je pense que c'est dû au fait que mon site est fourni en https mais pas l'API. Ce qui me fait dire ça c'est que quand je supprime le "s" de https de l'url du site, les liens avec l'API fonctionnent et j'arrive à récupérer toutes les infos dont j'ai besoin.

Du coup, grande question, comment puis-je faire pour que mon API soit accessible via une url en "https" au lieu de "http". Je précise que mon API a été réalisée avec nodejs et Express.

Je fouille sur le net depuis des heures mais je ne trouve pas ce que je cherche. Je crois qu'il faut que j'installe un certificat sur le serveur qui fournit mon API mais je ne sais pas comment procéder...

Merci d'avance pour toute aide
Modifié par Vahia (04 Feb 2023 - 16:19)
Modérateur
Salut,

Je pense que tes liens dans ta page appellent le mauvais protocole. Commence les par (supprimer le protocole) : //

exemple :

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <link rel="stylesheet" href="//chemin/vers/fichier.css">
</head>
<body>
    <script src="//chemin/vers/fichier.js"></script>
</body>
</html>

Modifié par niuxe (06 Feb 2023 - 19:06)
Salut

Effectivement, le problème que tu rencontres est lié au fait que ton site est chargé via HTTPS, alors que ton API est chargée via HTTP. Les navigateurs modernes bloquent par défaut les requêtes vers des contenus mixtes (c'est-à-dire des contenus chargés via des protocoles différents).

La solution à ton problème consiste à configurer ton API pour utiliser HTTPS. Pour cela, tu dois effectivement installer un certificat SSL sur ton serveur. Cela permettra de chiffrer les échanges entre ton API et les navigateurs des utilisateurs.

Il existe plusieurs façons de procéder pour installer un certificat SSL sur un serveur, mais voici une méthode générale :

Chope un certificat SSL auprès d'une autorité de certification (CA) reconnue, comme Let's Encrypt, qui propose des certificats gratuits.

Installe le certificat sur ton serveur. Selon ta configuration, cela peut impliquer de générer une clé privée, de créer une demande de certificat, de valider ton nom de domaine, etc. Les détails dépendent de la CA que tu utilises et du logiciel de serveur que tu utilises.

Et configure ton serveur pour utiliser HTTPS. Pour Node.js et Express, cela implique de configurer un serveur HTTPS en utilisant le module "https" de Node.js, et de rediriger toutes les requêtes HTTP vers HTTPS.

Voici un exemple de code pour configurer un serveur HTTPS avec Express :
const https = require('https');
const fs = require('fs');
const app = express();

const options = {
  key: fs.readFileSync('/chemin/vers/cle_privee.pem'),
  cert: fs.readFileSync('/chemin/vers/certificat.pem')
};

https.createServer(options, app).listen(443);

Modifié par JENCAL (21 Feb 2023 - 13:24)
Merci à tous pour votre aide.

J'ai finalement réussi à installer un certificat SSL sur mon serveur. C'est pas compliqué mais quand on ne l'a jamais fait c'est pas évident de trouver les infos.

Voici comment j'ai procédé :
Tout d'abord petit rappel du contexte :
- j'ai un espace web chez ionos rattaché à un nom de domaine.
- j'ai pris un serveur VPS-S (toujours chez ionos) pour héberger mon server nodejs qui sert de back-end à mon site (le front étant déposé sur l'espace web). C'est un serveur qui tourne sous Debian.
Ionos fourni un certificat SSL pour l'espace web. Il suffit de l'activer dans l'interface de gestion et très facilement le site est consultable en https. Par contre, comme dit plus haut, le navigateur refusera d'interroger le serveur nodejs s'il n'est pas servi, lui-aussi, en https.

J'ai choisi let's encrypt comme fournisseur de certificat car c'est gratuit. Par contre il est important de savoir que let's encrypt ne fourni pas de certificat pour une adresse IP. Il faut donc créer un sous-domaine (ça donnera une adresse du genre "sous-domaine.votredomaine.com") et le faire pointer vers vers l'IP de votre serveur VPS.

Installation du certificat :
D'abord se logger sur le serveur :
ssh root@ipduserveur

On installe snapd qui permettra d'installer l'outils de création de certificat :
apt install snapd

On verifie que snapd est bien à la dernière version avec ces 2 commandes :
snap install core
snap refresh core

On installe certbot (l'outils de création de certificat) :
snap install --classic certbot

On verifie que certbot est fonctionnel :
ln -s /snap/bin/certbot /usr/bin/certbot

Ensuite soyez sur que rien ne tourne sur le port 80 puis exécutez :
certbot certonly --standalone

Spécifiez l'adresse "sous-domaine.votredomaine.votreextension" comme domaine devant recevoir le certificat. Vu que vous l'avez fait pointer vers votre VPS, quand certbot va l'interroger il va attérir sur votre VPS.
Là on va obtenir 2 fichiers (le certificat et une clé). Bien noter les emplacements.

Mettez à jour votre serveur nodejs en mettant à jour les chemins dans les options (voir le code de Jencal ci-dessus). Attention, adaptez bien le chemin en fonction d'où vous aller mettre votre serveur nodejs sur le VPS. Faites gaffe aussi de ne pas intervertir les 2 chemins (la clé pour le certif et inversement). C'est bête mais ça génère une erreur qui est beaucoup recherchée sur Google.

Ensuite vous uploadez votre serveur nodejs sur votre VPS avec git (n'oubliez pas d'installer git sur le VPS) et tout devrait fonctionner.

Voilà j'espère que ces quelques lignes aideront ceux qui, comme moi, on passé des heures à chercher en vain comment sécuriser un serveur nodejs.