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

synopsis-https-api
synopsis-https-api

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)