Apache2
Dans une installation système, il est fortement conseillé de ne pas autoriser de communication externe directe vers le serveur SAINet. Pour ce faire, il est recommandé d’utiliser un service Apache2 qui prendra en charge les connexions HTTP/HTTPS et transfèrera les requêtes à SAINet en arrière-plan.
Apache2 peut être téléchargé ici. Pour ce programme, il est également nécessaire d’installer le paquet Redistribuable Visual C++ 2015.
Dans le cadre de SAINet, Apache2 sert uniquement à rediriger les requêtes HTTPS en interne vers le serveur applicatif SAINet. Selon l’infrastructure, ce composant est donc remplacable par un Firewall/Proxy/LoadBalancer qui peut être mis en frontend dans une DMZ afin de rediriger les requêtes sur un serveur interne.
Afin d’installer le service, dans une console Administrateur, exécuter la commande suivante:
<apache>\bin\httpd -k install -n Apache2
Il est conseillé de configurer le service pour que celui-ci redémarre automatiquement en cas de défaillance.
Il est possible de désinstaller le service avec la commande <apache>\bin\httpd -k uninstall -n Apache2
.
Une fois le service installé, ouvrir le fichier <apache>\conf\httpd.conf
et le remplacer par
le contenu suivant (remplacer <apache>
par le chemin complet vers le dossier d’installation Apache2):
Define SRVROOT "<apache>"
Define port 9090
ServerRoot "${SRVROOT}"
ServerAdmin admin@example.com
ServerName localhost:80
Listen 80
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule env_module modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "${SRVROOT}/htdocs"
ErrorLog "logs/error.log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access.log" common
</IfModule>
<IfModule ssl_module>
Listen 443 https
SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLCompression off
SSLSessionTickets off
SSLHonorCipherOrder on
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:${SRVROOT}/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
CustomLog "${SRVROOT}/logs/ssl_request.log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" env=HTTPS
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
<VirtualHost _default_:80>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<VirtualHost _default_:443>
ProxyPreserveHost on
<Location "/">
ProxyPass "http://localhost:${port}/" timeout=3600
</Location>
RequestHeader set X-Forwarded-Proto "https"
SSLEngine on
SSLCertificateFile conf\ssl\server.crt
SSLCertificateKeyFile conf\ssl\server.key
</VirtualHost>
Dans la configuration ci-dessus, le certificat est statique. Les fichiers nécessaires sont pointés
par les variables SSLCertificateFile
et SSLCertificateKeyFile
. Par défaut, Apache fournit un
certificat auto-signé, ce qui provoque des messages d’alertes lorsqu’un utilisateur accède à SAINet
par un navigateur Web.
Il existe plusieurs moyens d’obtenir un certificat SSL, moyennant le fait que le serveur SAINet soit sur un serveur publique avec un DNS. Il est recommandé d’utiliser Let’s Encrypt et de configurer un renouvellement automatique avec certbot.
Il est possible de générer les fichier nécessaires pour le certificat avec la commande suivante: openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -sha256 -nodes -days 99999
. Il ne sera pas reconnu par les navigateurs, mais permettra la communication HTTPS à travers Apache.
Si le service Apache ne démarre pas, il est possible d’avoir plus d’informations en utilisant les commandes suivantes:
<apache>\bin\httpd -k stop -n "Apache2"
<apache>\bin\httpd -k start -n "Apache2"
Pour tester la configuration:
<apache>\bin\httpd -t
Le terminal doit être ouvert en mode Administrateur.
Une erreur typique peut être un message qui se présente comme ceci:
AH00072: make_sock: could not bind to address 0.0.0.0:80
Cela signifie généralement qu’un autre programme est déjà en train d’écouter sur le port 80. Il est donc nécessaire d’arrêter ce programme ou alors de changer la configuration Apache pour utiliser un autre port. Il s’agit généralement du service IIS (Service de publication World Wide Web).
Si la connexion est refusée alors que le service Apache est bien démarré et configuré correctement (il est possible de
le vérifier en utilisant http://localhost
dans un navigateur), cela peut provenir du pare-feu Windows qui empêche les
connexions externes.
Le pare-feu Windows doit permettre les connextions entrantes sur les ports 80 et 443.