API Rest via un proxy https
Contexte
Pour effectuer des échanges entre l’API 8sens et un serveur tiers situé en dehors du réseau local (serveur e-commerce par exemple) il est indispensable de crypter les échanges en https.
Pour sécuriser d’avantage les échanges avec un serveur web, il est également nécessaire de restreindre les échanges aux IP qui consomment l’API
Cette configuration est simple à mettre en oeuvre en configurant sur le serveur 8sens (ou dans le réseau local) un serveur http (apache, nginx, …) jouant le rôle de proxy http.
Ce serveur proxy permet de :
-
relayer tous les échanges en https
-
configurer le contrôle d’accèspar IP ou autre
-
s’adapter à l’évolution des algorithmes de cryptage (TLS, …)
-
configurer à l’infini en s’appuyant sur des logiciels (apache, nginx, …) aptes à gérer la sécurité
Exemple avec Apache sur MacOS
Pour illustrer le cas, nous choisissons de mettre en oeuvre Apache sur un serveur MacOS.
Attention cette documentation a pour but de donner un exemple et n’est pas à suivre à la lettre car la configuration, les noms et les chemins, etc. peuvent varier fortement selon les versions d’OS, de logiciels, et la configuration du proxy
Architecture générale

Ce schéma donne une vue d’esemble de l’architecture
- Le serveur 8sens est situé dans le réseau local et contient la base de données et le client 8sens qui distribue l’API sur un port http
- Le serveur Proxy est également situé dans le réseau local, soit directement sur le serveur 8sens soit sur un serveur séparé
- Le serveur e-commerce est situé sur le réseau internet chez un hébergeur de type Cloud. Il se connecte à l’api 8sens en https via un routeur situé à la frontière entre le réseau local et internet (Box avec NAT, Routeur, …)
Cette configuration est donnée à titre d’exemple. Elle peut varier fortement.
Entrer dans le terminal sur le serveur Proxy MacOS
Lancez l’application “Terminal”
Toutes les commandes suivantes nécessitent les privilèges root
sudo -s
Vérifier qu’Apache est bien installé
Apache est pré-installé sur MacOS. On vérifie que c’est le cas et on repère repérer le répertoire de configuration
apachectl -t -D DUMP_INCLUDES
Exemple de réponse sur MacOS
/usr/local/etc/httpd/httpd.conf
Ce chemin peut être différent en fonction de votre installation. Par exemple çà peut-être
/etc/apache2/httpd.conf
Veillez à utiliser le chemin restitué par cette commande.
Le répertoire des modules sera
/usr/local/etc/httpd/extra
On sauvegarde la configuration originale
cp -p /usr/local/etc/httpd/httpd.conf /usr/local/etc/httpd/httpd.conf.ori
cp -p /usr/local/etc/httpd/extra/httpd-ssl.conf /usr/local/etc/httpd/extra/httpd-ssl.conf.ori
##On édite la configuration Apache
Fichier /usr/local/etc/httpd/httpd.conf
#Listen 12.34.56.78:80
Listen 8080
# Decommenter pour activer les modules proxy et SSL dont nous avons besoin
LoadModule authn_socache_module lib/httpd/modules/mod_authn_socache.so
LoadModule xml2enc_module lib/httpd/modules/mod_xml2enc.so
LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
LoadModule ssl_module lib/httpd/modules/mod_ssl.so
Include /usr/local/etc/httpd/extra/httpd-ssl.conf
Installer les certificats
Qui dit SSL dit certificats. On les installe dans la config
Dans le dossier /usr/local/etc/httpd , placer les fichiers de certificats
/usr/local/etc/httpd/server.crt
/usr/local/etc/httpd/server.key
/usr/local/etc/httpd/server-ca.crt # (si nécessaire)
Editer la configuration mod-ssl
Fichier /usr/local/etc/httpd/extra/httpd-ssl.conf
Renseignez si nécessaire le port par defaut sur lequel le serveur https écoute
Listen 8443
Utiliser des algorithmes sécurisés
Commenter 2 lignes
# SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
# SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
Décommenter 2 lignes
SSLCipherSuite HIGH:MEDIUM:!SSLv3:!kRSA
SSLProxyCipherSuite HIGH:MEDIUM:!SSLv3:!kRSA
Utiliser des protocoles sécurisés
Modifier 2 lignes
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
Par ces 2 lignes
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1
Cherchez la section VirtualHost dans le fichier
Elle commence par <VirtualHost>
et termine par </VirtualHost>
Elle utilise le nom de domaine (Hôte virtuel) avec lequel vous accédez au serveur
L’exemple ci-dessous concerne www.example.com sur le port non-standard 8443
# modifier le nom de domaine et le port si souhaité dans le VirtualHost
ServerName www.example.com:8443
ServerAdmin admin@example.com
Listen 8443
# Modifier les lignes de certificats dans le VirtualHost
Attention, le certificat doit correspondre au ServerName
SSLCertificateFile "/usr/local/etc/httpd/server.crt"
SSLCertificateKeyFile « /usr/local/etc/httpd/server.key »
# Si nécessaire
SSLCertificateChainFile « /usr/local/etc/httpd/server-ca.crt"
# Les directives de Proxy
Forward du traffic https vers l’api 8sens et vice versa dans le VirtualHost
SSLProxyEngine on
ProxyPass / http://localhost:8082/
ProxyPassReverse / http://localhost:8082/
# Limitation par IP le cas échéant dans le VirtualHost
Ces lignes permettent de limiter l’accès à l’API à l’IP XX.XX.XX.XX
<Location />
<RequireAny>
Require ip XX.XX.XX.XX
</RequireAny>
</Location>
Vérifier la syntaxe et redémarrer
Vérifier syntaxe
apachectl configtest
Lancer, arrêter, relancer
apachectl start
apachectl stop
apachectl restart
Tableau récapitulatif
Pour vous aider à préparer la configuration
Valeur exemple | Notes | |
---|---|---|
Serveur de e-commerce | ||
Celui qui se connecte à l’API | ||
IP publique WAN | 22.33.44.55 | Cette IP sera utilisée pour restreindre l’accès à l’API Require ip 22.33.44.55 |
Nom de domaine e-commerce | shop.sport8.com | Le nom de domaine choisi pour le site e-commerce |
Port https pour accéder à l’API | 8443 | Le port utilisé par le site e-commerce pour interroger l’API Doit être égal au port du serveur proxy ci-dessous |
Serveur Proxy | ||
Celui qui fournit le proxy https | ||
IP publique WAN | 44.55.66.77 | IP fixe gérée par le routeur (Box avec NAT , routeur, IP virtuelle …) |
IP privée LAN | 192.168.1.33 | L’IP locale |
Nom de domaine API | api.sport8.com | Le nom de domaine choisi pour l’API Mappé sur l’IP WAN (DNS) |
Port https proxy | 8443 | Le port choisi pour https (443 par défaut) |
A-t-on un certificat SSL ? | Doit correspondre au nom de domaine ci-dessus SSLCertificateFile ,SSLCertificateKeyFile, SSLCertificateChainFile |
|
Serveur 8sens | ||
Celui qui fournit l’API | ||
IP privée LAN | 192.168.1.33 | Idem proxy ou IP dans le LAN visible du proxy |
Port Rest API | 8082 | Le port choisi pour le serveur Rest 8sens (config Rest) |