...
ESUP-SGC inclut également son propre client pour l’encodage des cartes (esup-sgc-client) qui est en fait également client d'esup-nfc-tag-server.
L’encodage via esup-sgc-client se passe de cette manière :
- Edition en 2 temps :
lecture du QR code présent sur la carte (identifiant l’individu à encoder) ; la carte ayant été imprimée depuis l'interface web d'esup-sgc via un navigateur web
association de la carte avec l’individu dans le SGC
encodage des différentes applications DESFIRE telles que décrites dans le fichier de configuration d'ESUP-NFC-TAG-SERVER
... et optionnellement (on recommande plutôt d'acheter des cartes pré-encodés IZLY) encodage de l’application IZLY (CROUS) via ESUP-NFC-TAG-SERVER en utilisant la clé SAM du CNOUS et des DLL Windows
...
...
ESUP-SGC-CLIENT-ZEBRA -SOURCES
- Edition en 1 temps :
- sélection de la carte à imprimer et encoder depuis l'interface web d'esup-sgc via un navigateur web
impression de la carte
association de la carte avec l’individu dans le SGC et encodage des différentes applications DESFIRE telles que décrites dans le fichier de configuration d'ESUP-NFC-TAG-SERVER
... et optionnellement (on recommande plutôt d'acheter des cartes pré-encodés IZLY) encodage de l’application IZLY (CROUS) via
...
ESUP-NFC-TAG-SERVER en utilisant la clé SAM du CNOUS et des DLL Windows
Schéma d’architecture de la solution
...
Java : nous recommandons l'usage d'openjdk
pour la partie serveur les versions 8 ou 11 ou 17 (généralement présentes dans les distributions) conviennent),
pour la partie cliente vous pouvez utiliser openjdk et openjfx en version 11 ou 1217.
Maven (dernière version 3.0.x) : le mieux est de l'installer via le système de paquets de votre linux - http://maven.apache.org/download.cgi
Postgresql : le mieux est de l'installer via le système de paquets de votre linux.
Tomcat 8 : https://tomcat.apache..5 ou 9 (Tomcat 10 n'est pas supporté) : https://tomcat.apache.org/download-8090.cgi
Apache + libapache2-mod-shib2
Git
...
Serveur : 2 CPU, RAM > 2 Go, Disque > 20 Go
Cartes Mifare Desfire EV1 ou EV2
- Edition 2 temps :
Un lecteur RFID USB Compatible PC/SC pour encodage
- Une webcam
- Une imprimante à carte.
- Edition 1 temps : Cartes Mifare Desfire EV1 ou EV2
- Une imprimante à carte
- evolis (primacy) / zebra (zc300) avec lecteur NFC
A cela, un Smartphone Android > 5 avec lecteur NFC peut également s'avérer utile par exemple.
Installation des pré-requis
...
Bloc de code | ||||
---|---|---|---|---|
| ||||
apt-get install wget apache2 libapache2-mod-shib2shib git apt-get install postgresql postgresql-contrib |
...
Installer les deux instances de Tomcat. L'une sera utilisée pour ESUP-SGC, l'autre pour ESUP-NFC-TAG.
Bloc de code | ||||
---|---|---|---|---|
| ||||
cd /opt/ wget httphttps://dlcdn.apache.crihan.frorg/dist/tomcat/tomcat-89/v8v9.50.2458/bin/apache-tomcat-89.50.2458.tar.gz tar xzvf apache-tomcat-89.50.2458.tar.gz mv apache-tomcat-89.50.2458 apache-tomcat-89.50.2458-esup-nfc-tag tar xzvf apache-tomcat-89.50.2458.tar.gz mv apache-tomcat-89.50.2458 apache-tomcat-89.50.2458-esup-sgc ln -s apache-tomcat-89.50.2458-esup-nfc-tag tomcat-esup-nfc-tag ln -s apache-tomcat-89.50.2458-esup-sgc tomcat-esup-sgc rm -Rf /opt/tomcat-esup-sgc/webapps/* mkdir /opt/tomcat-esup-sgc/webapps/ROOT/ rm -Rf /opt/tomcat-esup-nfc-tag/webapps/* mkdir /opt/tomcat-esup-nfc-tag/webapps/ROOT/ chown -R esup:esup /opt/apache-tomcat-89.50.2458-esup-sgc/ chown -R esup:esup /opt/apache-tomcat-89.50.2458-esup-nfc-tag/ |
Note : Le contenu du dossier webapps est impérativement à supprimer, si vous ne le faites pas l'interface d'administration d'esup-sgc ne s'affichera pas. l'URL /manager rentrera en conflit avec la webapp manager de tomcat livrée par défaut lors du déploiement du serveur tomcat.
...
Ces deux instances seront démarrées via Systemd. On peut donc créer et activer ces deux services:
Pour Esup-SGC:
Bloc de code | ||||
---|---|---|---|---|
| ||||
cat > /etc/systemd/system/tomcat-esup-sgc.service <<EOF # Systemd unit file for tomcat [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target [Service] Type=forking EnvironmentFile=/opt/esup-env Environment=CATALINA_PID=/opt/tomcat-esup-sgc/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat-esup-sgc ExecStart=/opt/tomcat-esup-sgc/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID User=esup Group=esup [Install] WantedBy=multi-user.target EOF systemctl enable tomcat-esup-sgc.service |
...
Pour Esup-NFC-TAG:
Bloc de code | ||||
---|---|---|---|---|
| ||||
cat > /etc/systemd/system/tomcat-esup-nfc-tag.service <<EOF # Systemd unit file for tomcat [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target [Service] Type=forking EnvironmentFile=/opt/esup-env Environment=CATALINA_PID=/opt/tomcat-esup-nfc-tag/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat-esup-nfc-tag ExecStart=/opt/tomcat-esup-nfc-tag/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID User=esup Group=esup [Install] WantedBy=multi-user.target EOF systemctl enable tomcat-esup-nfc-tag.service |
...
Bloc de code | ||||
---|---|---|---|---|
| ||||
<Server port="8205" shutdown="SHUTDOWN">
<!-- (...) -->
<Connector port="8209" protocol="AJP/1.3" redirectPort="8443" asyncTimeout="1200000" tomcatAuthentication="false" scheme="https" secure="true" URIEncoding="UTF-8" secretRequired="false"/> |
Idem pour l'instance d'Esup-NFC-TAG qui utilisera les ports 8305 et 8309.
Bloc de code | ||||
---|---|---|---|---|
| ||||
<Server port="8305" shutdown="SHUTDOWN">
<!-- (...) -->
<Connector port="8309" protocol="AJP/1.3" redirectPort="8443" asyncTimeout="1200000" tomcatAuthentication="false" scheme="https" secure="true" URIEncoding="UTF-8" secretRequired="false"/> |
Info |
---|
|
Configuration d'Apache
Activer les modules suivants:
Bloc de code | ||||
---|---|---|---|---|
| ||||
a2enmod rewrite a2enmod ssl a2enmod proxy_ajp a2enmod proxy_http a2enmod shib2shib |
Créer un fichier de configuration pour le VirtualHost esup-sgc.univ-ville.fr /etc/apache2/sites-available/esup-sgc.univ-ville.fr.conf
Bloc de code | ||||
---|---|---|---|---|
| ||||
<VirtualHost *:80> ServerName esup-sgc.univ-ville.fr ServerAdmin webmaster@univ-ville.fr DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] RewriteRule ^/(.*)$ https://esup-sgc.univ-ville.fr/$1 [L,R] </VirtualHost> <VirtualHost *:443> ServerName esup-sgc.univ-ville.fr ServerAdmin webmaster@univ-ville.fr DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2letsencrypt/certslive/esup-sgc.crt.univ-ville.fr/cert.pem SSLCertificateKeyFile /etc/apache2letsencrypt/certslive/esup-sgc.key.univ-ville.fr/privkey.pem SSLCACertificateFileSSLCertificateChainFile /etc/letsencrypt/apache2/certs/CA.crtlive/esup-sgc.univ-ville.fr/chain.pem ProxyPass /Shibboleth.sso ! ProxyPass /secure ! ScriptAlias /secure /var/www/printenv.pl ShibCompatValidUser Off <Location /Shibboleth.sso> SetHandler shib AuthType None Require all granted </Location> <Location /shibboleth-sp> AuthType None Require all granted </Location> Alias /shibboleth-sp/main.css /usr/share/shibboleth/main.css <Location /secure> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId default </Location> <Location /> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId default </Location> <Location "/resources"> Require all granted ShibRequireSession Off </Location> <Location "/wsrest"> Require all granted ShibRequireSession Off </Location> <Location "/payboxcallback"> Require all granted ShibRequireSession Off </Location> ProxyPass / ajp://localhost:8209/ ttl=10 timeout=3600 retry=1 <LocationMatch "^/(resources|webjars)"> ExpiresActive On ExpiresByType text/css "access plus 1 hour"AddOutputFilterByType DEFLATE text/plain text/html text/css text/javascript application/x-javascript application/javascript application/json image/svg+xml </VirtualHost> |
Idem pour le VirtualHost esup-nfc-tag.univ-ville.fr dans /etc/apache2/sites-available/esup-nfc-tag.univ-ville.fr.conf
Bloc de code | ||||
---|---|---|---|---|
| ||||
<VirtualHost *:80> ServerName esup-nfc-tag.univ-ville.fr ServerAdmin webmaster@univ-ville.fr DocumentRoot /var/www/html ExpiresByType text/javascript "access plusErrorLog 1 hour" ${APACHE_LOG_DIR}/error_esup-nfc-tag.log ExpiresByType application/javascript "access plus 1 hour" ExpiresByType image/gif "access plus 1 hour"CustomLog ${APACHE_LOG_DIR}/access_esup-nfc-tag.log combined RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* ExpiresByType image/png "access plus 1 hour" ExpiresByType image/jpg "access plus 1 hour"- [F] RewriteRule ^/(.*)$ https://esup-nfc-tag.univ-ville.fr/$1 [L,R] </VirtualHost> <VirtualHost *:443> ServerName esup-nfc-tag.univ-ville.fr ServerAdmin webmaster@univ-ville.fr ExpiresByType image/jpeg "access plus 1 hour"DocumentRoot /var/www/html ErrorLog ExpiresByType application/x-shockwave-flash "access plus 1 hour"${APACHE_LOG_DIR}/error_esup-nfc-tag.log ExpiresByType image/x-icon "access plus 1 hour" </LocationMatch> CacheRoot /var/cache/httpd/esup-sgc CacheDirLevels 2 CacheDirLength 1 CacheEnable disk /resources AddOutputFilterByType DEFLATE text/plain text/html text/css text/javascript application/x-javascript application/javascript application/json image/svg+xml </VirtualHost> |
Idem pour le VirtualHost esup-nfc-tag.univ-ville.fr dans /etc/apache2/sites-available/esup-nfc-tag.univ-ville.fr.conf
Bloc de code | ||||
---|---|---|---|---|
| ||||
<VirtualHost *:80> ServerName esup-nfc-tag.univ-ville.fr ServerAdmin webmaster@univ-ville.fr DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error_esup-nfc-tag.log CustomLog ${APACHE_LOG_DIR}/access_esup-nfc-tag.log combined RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] RewriteRule ^/(.*)$ https://esup-nfc-tag.univ-ville.fr/$1 [L,R] </VirtualHost> <VirtualHost *:443> ServerName esup-nfc-tag.univ-ville.fr ServerAdmin webmaster@univ-ville.fr DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error_esup-nfc-tag.log CustomLog ${APACHE_LOG_DIR}/access_esup-nfc-tag.log combined SSLEngine on SSLCertificateFile /etc/apache2/certs/esup-nfc-tag.crt SSLCertificateKeyFile /etc/apache2/certs/esup-nfc-tag.key SSLCACertificateFile /etc/apache2/certs/CA.crt ProxyPass /Shibboleth.sso ! ProxyPass /secure ! ScriptAlias /secure /var/www/printenv.pl ShibCompatValidUser Off <Location /Shibboleth.sso>CustomLog ${APACHE_LOG_DIR}/access_esup-nfc-tag.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/esup-nfc-tag.univ-ville.fr/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/esup-nfc-tag.univ-ville.fr/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/esup-nfc-tag.univ-ville.fr/chain.pem ProxyPass /Shibboleth.sso ! ProxyPass /secure ! ScriptAlias /secure /var/www/printenv.pl ShibCompatValidUser Off <Location /Shibboleth.sso> SetHandler shib AuthType None Require all granted </Location> <Location /shibboleth-sp> AuthType None Require all granted </Location> Alias /shibboleth-sp/main.css /usr/share/shibboleth/main.css <Location /secure> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId esup-nfc-tag </Location> <Location /manager> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session SetHandlerShibUseHeaders shibOn AuthType NoneShibRequestSetting applicationId esup-nfc-tag </Location> Require all<Location granted/admin> </Location> <LocationAuthType /shibboleth-sp> AuthTypeShibRequestSetting requireSession None 1 require shib-session Require allShibUseHeaders grantedOn </Location> ShibRequestSetting Alias /shibboleth-sp/main.css /usr/share/shibboleth/main.cssapplicationId esup-nfc-tag </Location> <Location /secure>nfc> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId esup-nfc-tag </Location> <LocationProxyPass /manager> AuthType shibboleth ajp://localhost:8309/ ttl=10 timeout=3600 retry=1 AddOutputFilterByType DEFLATE text/plain ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId esup-nfc-tag </Location> <Location /admin> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId esup-nfc-tag </Location> <Location /nfc> AuthType shibboleth ShibRequestSetting requireSession 1 require shib-session ShibUseHeaders On ShibRequestSetting applicationId esup-nfc-tag </Location> ProxyPass / ajp://localhost:8309/ ttl=10 timeout=3600 retry=1 <Location "/resources"> ExpiresActive On ExpiresByType text/css "access plus 1 hour" ExpiresByType text/javascript "access plus 1 hour" ExpiresByType application/javascript "access plus 1 hour" ExpiresByType image/gif "access plus 1 hour" ExpiresByType image/png "access plus 1 hour" ExpiresByType image/jpg "access plus 1 hour" ExpiresByType image/jpeg "access plus 1 hour" ExpiresByType application/x-shockwave-flash "access plus 1 hour" ExpiresByType image/x-icon "access plus 1 hour" </Location> CacheRoot /var/cache/httpd/esup-nfc-tag CacheDirLevels 2 CacheDirLength 1 CacheEnable disk /resources AddOutputFilterByType DEFLATE text/plain text/html text/css text/javascript application/x-javascript application/javascript application/json image/svg+xml </VirtualHost> |
A noter que l'applicationId
du ShibRequestSetting
diffère selon les VirtualHosts.
De plus, dans cet exemple, chaque VirtualHost dispose de son propre certificat. Il est tout à fait possible d'utiliser le même sous-réserve que les noms des deux VirtualHosts y soient indiqués (SAN).
Penser à intégrer ces certificats au keystore des tomcat. Par exemple:
text/html text/css text/javascript application/x-javascript application/javascript application/json image/svg+xml
</VirtualHost> |
A noter que l'applicationId
du ShibRequestSetting
diffère selon les VirtualHosts.
De plus, dans cet exemple, chaque VirtualHost dispose de son propre certificat. Il est tout à fait possible d'utiliser le même sous-réserve que les noms des deux VirtualHosts y soient indiqués (SAN).
En présentant la chaîne correctement et avec des certificats tels que proposés par Renater/Sectigo (les chemins ci-dessus correspondent à des exemples de chemins de certificats récupérés via le protocole ACME par certbot ... depuis Sectigo) le keystore par défaut de votre JVM suffira et vous n'avez pas besoin alors d'importer unitairement vos certificats dans le keystore java.
Si jamais vous avez un certificat issu d'une autorité de certification non reconnue par votre JVM (à proscrire) vous pouvez, en dernier recours, intégrer ce certificat au keystore ainsi par exemple:
Bloc de code | ||||
---|---|---|---|---|
| ||||
# on copie le cacerts initial pour conserver la confiance dans les autorités de certification racines par défaut
cp /etc/ssl/certs/java/cacerts /opt/esup.univ-ville.jks
# par défaut le password est changeit,on le modifie
keytool -storepasswd -keystore cacerts
# utile si on doit supprimer un ancien certificat expiré pour en mettre un nouveau | ||||
Bloc de code | ||||
| ||||
keytool -genkey -alias mon_cert -keyalg RSA -keystore /opt/esup.univ-ville.jks keytool -delete -alias mon_cert -keystore /opt/esup.univ-ville.jks # on importe le certificat keytool -import -file /etc/apache2/certs/esup-sgc.crt -alias sgc -trustcacerts -keystore /opt/esup.univ-ville.jks keytool -import -file /etc/apache2/certs/esup-nfc-tag.crt -alias nfctag -trustcacerts -keystore |
À nouveau, normalement, avec un certificat valide et bien présenté, vous n'avez pas besoin de réaliser cette opération sur le keystore java et vous n'avez pas besoin de fait d'avoir ce fichier keystore /opt/esup.univ-ville.jks
...
Activer les sites:
Bloc de code | ||||
---|---|---|---|---|
| ||||
a2dissite 000-default.conf a2ensite esup-sgc.univ-ville.fr a2ensite esup-nfc-tag.univ-ville.fr |
...
Bloc de code | ||||
---|---|---|---|---|
| ||||
<RequestMapper type="Native"> <RequestMap applicationId="default"> <Host name="esup-nfc-tag.univ-ville.fr" applicationId="esup-nfc-tag" authType="shibboleth" requireSession="false"/> <Host name="esup-sgc.univ-ville.fr" applicationId="esup-sgc" authType="shibboleth" requireSession="false"/> </RequestMap> </RequestMapper> |
...
Configurer la balise SSO pour utiliser le WAYF de Renater (ou un Idp par défaut sinon, cf variante en commentaires) :
Bloc de code | ||||
---|---|---|---|---|
| ||||
<ApplicationDefaults entityID="https://esup-sgc.univ-ville.fr" ...> <Sessions ...> <!-- <SSO entityID="https://idp.univ-ville.fr/idp/shibboleth"> SAML2 SAML1 </SSO> --> <SSO location="/" discoveryProtocol="SAMLDS" discoveryURL="https://discovery.renater.fr/renater"> SAML2 SAML1 </SSO> |
Penser à modifier le contact du support:
Bloc de code | ||||
---|---|---|---|---|
| ||||
<Errors supportContact="sysadmin@univ-ville.fr" |
Votre fournisseur de Metadata Renater (ou directement l'IDP - variante donnée en commentaires ; si vous n'utilisez pas la fédération Renater ...) - notez ici l'usage du "Whitelist" sur la fédération Renater :
Attention si vous avez un sp en version 3, uri="https://xx" est ignoré et il faut mettre url= !!! L'erreur étant peu évidente à comprendre, c'est 1/2 journée perdue
Bloc de code | ||||
---|---|---|---|---|
| ||||
<!-- <MetadataProvider type="XML" validate="true" url="https://idp.univ-ville.fr/idp/shibboleth" backingFilePath="idp.univ-ville.fr-metadata.xml"> </MetadataProvider> --> <MetadataProvider type="XML" url="https://metadata.federation.renater.fr/renater/main/main-idps-renater-metadata.xml" backingFilePath="/etc/shibboleth/metadatas/main-idps-renater-metadata.xml" reloadInte\ rvalreloadInterval="7200"> <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/> <MetadataFilter type="Signature" certificate="renater-metadata-signing-cert-2016.pem"/> <MetadataFilter type="Whitelist"> <Include>urn:mace:cru.fr:federation:univ-rouen.fr</Include> <Include>https://shibboleth.insa-rouen.fr/idp/shibboleth</Include> </MetadataFilter> </MetadataProvider> |
...
Et enfin, avant la fermeture de la balise ApplicationDefaults, rajoutez un ApplicationOverride. Dans notre cas, le VirtualHost esup-sgc.univ-ville.fr utilisera le default, on utilisera un id spécifique pour esup-nfc-tag:
Bloc de code | ||||
---|---|---|---|---|
| ||||
<ApplicationOverride id="esup-nfc-tag" entityID="https://esup-nfc-tag.univ-ville.fr/shibboleth"/> |
Les Metadata doivent à présent être téléchargeables à ces adresses:
...
Bloc de code | ||
---|---|---|
| ||
/opt/tomcat-esup-sgc/logs/catalina.out { copytruncate daily missingok rotate 30 compress delaycompress } /opt/tomcat-esup-nfc-tag/logs/catalina.out { copytruncate daily missingok rotate 30 compress delaycompress } |
Sous Debian, il est également possible d'éditer le fichier /var/lib/logrotate/status
pour déterminer plus précisément la date de rotation (ceci est utile dans le cas d'une utilisation de lvm2 par exemple).
...
Pour enrôler et éventuellement encoder vos cartes vous avez également besoin d'un client esup-sgc-client : voir la documentation Clients ESUP-SGC-CLIENT v2.0[archivé]
Installation materielle
Dans l'application esup-sgc-client, pour l'édition en 2 temps, l'encodage des cartes s'effectue à l'aide de la webcam et du lecteur de carte NFC. La webcam est disposée au dessus du lecteur de cartes de manière à le filmer. Lorsque qu'une carte est placée sur le lecteur la webcam lit le qrcode puis lance l'encodage.
...
Pour automatiser l'encodage des cartes il est possible d'utiliser une imprimante Zebra ZXP3. voir : Tuto robot encodeur basé sur une Zebra ZXP3
Pour plus d'informations sur les différentes possibilités d'édition, voir la page ESUP-SGC-Client et édition des cartes
Éléments optionnels
Vous pouvez également mettre en place les applications Esup-nfc-tag-desktop et Esup-nfc-tag-droid :
...