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.

Info:

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.

Service

Afin d’installer le service, dans une console Administrateur, exécuter la commande suivante:

<apache>\bin\httpd -k install -n Apache2
Info:

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.

Configuration

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>

Certificats SSL

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.

Info:

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.

En cas de problème

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
Info:

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.