Tomcat
Configuration du serveur Tomcat embarqué dans Spring Boot.
ajp.port
Port AJP pour communication avec un serveur frontal. À ne pas configurer si l'application est démarrée par un serveur Tomcat externe.
tomcat:
ajp:
port: 6009
Spring - Configuration globale
Tous les paramètres Spring regroupés ci-dessous.
Session - À ne pas modifier
Permet l'activation de spring-session.
Cache
Configuration du cache applicatif (Caffeine).
Threads virtuels
Support des threads virtuels Java (depuis Java 19+).
Datasource
Configuration de la connexion à PostgreSQL. session.timeout définit le timeout de session (ex: 30m).
JPA
Configuration Hibernate. ddl-auto détermine la gestion du schéma :
update: Créer et mettre à jour (développement/déploiement)validate: Vérifier uniquement (production)create: Recréer complètement (dangereux)
LDAP (Spring)
Configuration de l'accès LDAP pour Spring (obligatoire si CAS est activé).
Configuration du serveur SMTP.
Web, Servlet, Thymeleaf
Configuration web (ne pas modifier).
OAuth2 Security
Configuration de l'authentification via OAuth2 (CAS, ProConnect, FranceConnect).
Messages
Configuration i18n (internationalisation).
spring:
cache:
type: caffeine
cache-names: ldapLightCache
caffeine:
spec: maximumSize=1000,expireAfterWrite=24h
session:
timeout: 30m
jdbc:
initialize-schema: always
save-mode: always
threads:
virtual:
enabled: true
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/esupsignature
username: esupsignature
password: esup
jdbc-url: ${spring.datasource.url}
hikari:
auto-commit: false
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
format_sql: true
jdbc:
lob:
non_contextual_creation: true
show-sql: false
open-in-view: false
ldap:
base: dc=<votre-domaine>,dc=fr
urls: ldap://ldap.<votre-domaine>.fr
username: cn=consult,dc=<votre-domaine>,dc=fr
password: <mot-de-passe>
mail:
host: smtp.<votre-domaine>.fr
messages:
basename: i18n/messages
encoding: UTF-8
fallback-to-system-locale: false
data:
ldap:
repositories:
enabled: false
security:
oauth2:
client:
provider:
cas:
issuer-uri: https://cas.<votre-domaine>.fr/oidc
servlet:
multipart:
enabled: true
max-file-size: 1280KB
max-request-size: 1280KB
resolve-lazily: true
thymeleaf:
cache: false
encoding: UTF-8
mode: HTML
servlet:
produce-partial-output-while-processing: false
web:
resources:
cache:
cachecontrol:
max-age: 1d
cache-public: true
static-locations: classpath:/static
chain:
enabled: true
strategy:
content:
enabled: true
paths: /**
mvc:
static-path-pattern: /**
LDAP - Configuration avancée
Configuration spécifique à votre établissement, précisant les modalités de recherche des utilisateurs dans l'annuaire.
Explication des paramètres
Bases et object classes : Définissent où et comment chercher les utilisateurs, groupes, UO et aliases dans l'annuaire.
Filtres de recherche : Déterminent comment retrouver les utilisateurs et leurs groupes. Les requêtes LDAP doivent impérativement être mises entre parenthèses.
Mapping des filtres vers groupes : Permet de créer des groupes virtuels basés sur des requêtes LDAP. Utilisé avant mapping-groups-roles pour l'attribution des rôles.
Configuration complète
ldap:
search-base: ou=people
user-object-classes: inetOrgPerson
group-object-classes: groupOfNames
ou-object-classes: organizationalUnit
alias-object-classes: nisMailAlias
users-search-filter: ((&(|(displayName={0}*)(cn={0}*)(uid={0})(mail={0}*))(mail=*))
user-id-search-filter: (uid={0})
cas-user-search-filter: (uid={0})
user-eppn-search-filter: (eduPersonPrincipalName={0})
user-mail-search-filter: (mail={0})
eppn-left-part-search-filter: (uid={0})
group-search-base: ou=groups
group-search-filter: member={0}
all-groups-search-filter: cn=*{0}
all-aliases-search-filter: (mail={0})
ou-search-base: ou=organizational-units
ou-search-filter: (supannCodeEntite={0})
member-search-filter: (&(uid={0})({1}))
members-of-group-search-filter: memberOf=cn={0},ou=groups,dc=<votre-domaine>,dc=fr
mapping-filters-groups:
student: "(eduPersonAffiliation:=student)"
staff: "(eduPersonAffiliation:=staff)"
Notes importantes
cas-user-search-filter: Filtre spécifique pour CAS (par défaut = userIdSearchFilter)eppn-left-part-search-filter: Pour les cas où l'EPPN n'est pas au formatuid@domain(par défaut = userIdSearchFilter)ou-search-filter: Utilisé seulement pour le pré-remplissage des affectations dans les formulairesmapping-filters-groups: Crée des groupes virtuels. Combinez ensuite avecmapping-groups-roles(section Security) pour l'attribution des rôles
Les objectClasses sont définis en dur dans les classes PersonLdap, PersonLightLdap, OrganizationalUnitLdap et AliasLdap. Pour modifier le champ de recherche, éditez ces classes dans : src/main/java/org/esupportail/esupsignature/service/ldap/entry
Mail - Paramètres généraux
Configuration de l'adresse d'envoi des emails
mail:
from: no-reply.esup-signature@<votre-domaine>.fr
SMS - Configuration OTP
Configuration d'un service d'envoi de SMS pour les codes OTP (One Time Password) destinés aux utilisateurs externes.
Des implémentations SMSU et OVH sont disponibles. Vous pouvez en ajouter en implémentant l'interface SmsService.
sms:
enable-sms: false
# service-name: SMSU
# url: https://smsu-api.<votre-domaine>.fr/
# username: sms-account
# password: ********
DSS - Signature numérique et validation
Configuration de la validation des signatures numériques.
Serveurs de temps
tsp-servers : Adresses des serveurs de temps pour horodatage des signatures.
Pour que la signature soit valable, le fournisseur doit apparaître dans la European Trusted List (EUTL). Depuis la version 1.28.9, vous pouvez configurer plusieurs serveurs. Le système essaie chaque adresse jusqu'à obtenir un timestamp.
Configuration générale
dss:
cache-data-source-driver-class-name: org.hsqldb.jdbc.JDBCDriver
cache-data-source-url: jdbc:hsqldb:mem:cachedb
cache-password:
cache-username: sa
default-validation-policy: policy/sign-constraint.xml
server-signing-keystore-filename: validate_service.p12
server-signing-keystore-password: password
server-signing-keystore-type: PKCS12
tsp-servers:
- http://timestamp.sectigo.com/qualified
- http://tsa.belgium.be/connect
lotl-country-code: EU
lotl-url: https://ec.europa.eu/tools/lotl/eu-lotl.xml
oj-url: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.C_.2019.276.01.0001.01.ENG
root-url-in-tl-browser: https://eidas.ec.europa.eu/efda/tl-browser/#/screen
country: FR
state-or-province: Région
postal-code: XXXXX
locality: Ville
check-revocation-for-untrusted-chains: false
multi-thread-tl-validation: true
accept-signature-field-overlap: false
Note : check-revocation-for-untrusted-chains: true (défaut) — Pour utiliser des certificats non eIDas (ex: Sectigo Rénater), passer à false
Proxy
Si votre serveur se trouve derrière un forward proxy, configurez l'accès aux certificats de confiance :
proxy:
http-enabled: true
http-host: localhost
http-port: 3128
http-user: <utilisateur>
http-password: <mot-de-passe>
http-excluded-hosts: <hosts>
https-enabled: true
https-host: localhost
https-port: 3128
https-user: <utilisateur>
https-password: <mot-de-passe>
https-excluded-hosts: <hosts>
FS - Système de fichiers et stockage
Configuration d'une source de stockage pour chaque type (SMB, CMIS, VFS). Une seule source par type est supportée.
SMB : Partages réseau Windows/Samba VFS : Systèmes de fichiers locaux ou FTP CMIS : Serveurs CMIS (Nuxeo, etc.)
Configuration
Note : Pour SMB et VFS, l'URI de test (*-uri-test) sert aux tests intégrés. Pour CMIS, l'URI est l'adresse "fixe" du serveur, les adresses relatives se configurent dans l'application elle-même.
fs:
# SMB - Partages réseau
smb-login: esup-signature
smb-password: <mot-de-passe>
smb-uri-test: smb://smb.<votre-domaine>.fr
smb-domain: <DOMAINE>
# VFS - Système de fichiers local
vfs-test-uri: /tmp
# CMIS - Serveur CMIS
cmis-uri-test: https://esup-signature.<votre-domaine>.fr/nuxeo
cmis-login: Administrator
cmis-password: <mot-de-passe>
cmis-respository-id: default
cmis-root-path: /default-domain/workspaces
PDF - Traitement des fichiers
Paramètres de traitement et conversion des fichiers PDF
pdf:
convert-to-pdf-a: true
path-to-g-s: /usr/bin/gs
pdf-a-level: 2
pdf-to-image-dpi: 72
auto-rotate: true
gs-command-params: -dSubsetFonts=true -dEmbedAllFonts=true -dAlignToPixels=0 -dGridFitTT=2 -dCompatibilityLevel=1.4 -sColorConversionStrategy=RGB -sDEVICE=pdfwrite -dPDFACompatibilityPolicy=1
Attention : L'option -dPDFSTOPONERROR anciennement présente semble poser des problèmes lors de la conversion.
Security - Authentification et autorisation
La sécurité est gérée par Spring Security. Plusieurs mécanismes d'authentification peuvent être activés simultanément :
- CAS : Authentification centralisée (avec LDAP)
- Shibboleth : Fédération d'identité (Renater/édugain)
- OTP : Authentification par code unique pour les externes
- OAuth : Fournisseurs d'identité OAuth2 (en étude)
Pour désactiver un mécanisme, commentez ses lignes dans la configuration.
Pour une documentation complète et détaillée sur le mécanisme d'attribution des rôles, consultez la page dédiée : https://www.esup-portail.org/wiki/spaces/SIGN/pages/980058116/Configuration+de+la+s%C3%A9curit%C3%A9
Rôles spéciaux
esup-signature possède quatre rôles particuliers :
ROLE_USER: Obligatoire pour accéder à l'applicationROLE_ADMIN: Accès à la partie administrationROLE_OTP: Obtenu automatiquement lors d'une connexion OTP (externes)ROLE_SEAL: Permission de signer avec le certificat cachet d'établissement
Mécanisme d'attribution des rôles
L'authentification d'un utilisateur donne lieu à une attribution de rôles selon ce processus :
- Récupération des groupes : À la connexion, les groupes de l'utilisateur sont récupérés
- Création de groupes virtuels (optionnel) :
- Via
mapping-filters-groups: Création de groupes basés sur des requêtes LDAP - Via
group-mapping-spel: Création de groupes via des règles SpEL (limité à#eppnet"true")
- Via
- Attribution des rôles :
- D'abord via
group-to-role-filter-pattern: Détecte les groupes correspondant au pattern et crée les rôles automatiquement (ex: groupefor.esup-signature.role.bondecommande→ rôleROLE_BONDECOMMANDE) - Ensuite via
mapping-groups-roles: Mappe les groupes aux rôles spécifiques
- D'abord via
CAS
Authentification centralisée. Nécessite une configuration LDAP. Idéale pour utilisation interne.
security:
cas:
url: https://cas.<votre-domaine>.fr
service: https://esup-signature.<votre-domaine>.fr/login/cas
title: Compte Université (CAS)
Shibboleth
Fédération d'identité (Renater/édugain). Permet l'accès aux utilisateurs d'autres établissements.
security:
shib:
idp-url: https://idp.<votre-domaine>.fr
principal-request-header: REMOTE_USER
credentials-request-header: MEMBER
title: Fédération d'identité
domains-white-list-url: https://eduspot.renater.fr/eduspot/whitelist-eduspot.txt
Configuration Apache pour Shibboleth
Ajoutez cette configuration au fichier VirtualHost Apache après installation du mod_shibboleth :
<Location />
ShibUseHeaders Off
ShibRequireSession Off
</Location>
<Location /user/nexu-sign>
ShibUseHeaders Off
ShibRequireSession Off
</Location>
<Location /Shibboleth.sso>
SetHandler shib
</Location>
<Location /login/shibentry>
AuthType shibboleth
ShibRequireSession On
Require shibboleth
ShibUseHeaders On
</Location>
Pour l'installation du mod_shibboleth, consultez : https://services.renater.fr/federation/documentation/guides-installation/sp3/chap04
Configuration Web - Attribution des rôles
group-to-role-filter-pattern
Pattern permettant de détecter automatiquement les groupes amenés à devenir des rôles applicatifs.
Syntaxe : Utilise une regex avec capture group (\w*) qui devient le suffixe du rôle.
Exemple : Pattern for.esup-signature.role.(\w*) avec groupe for.esup-signature.role.bondecommande génère le rôle ROLE_BONDECOMMANDE
mapping-groups-roles
Mappe les groupes (LDAP ou virtuels) aux rôles de l'application. ROLE_USER est obligatoire.
mapping-filters-groups (section LDAP)
Crée des groupes virtuels basés sur des requêtes LDAP. Voir section LDAP pour les détails.
group-mapping-spel
Assigne des groupes via SpEL (Spring Expression Language). Utile pour Shibboleth sans LDAP.
- Seul l'attribut
#eppnest accessible - Utilisez
"true"pour attribuer un groupe à tous les utilisateurs
ws-access-authorize-ips
Whitelist des adresses IP autorisées pour les web services. Accepte des adresses individuelles ou des plages CIDR.
actuators-access-authorize-ips
Whitelist pour l'accès aux actuateurs (par défaut = ws-access-authorize-ips).
csv-access-authorize-mask
Masque d'autorisation pour l'accès CSV (défaut : 127.0.0.1).
jwt-ws-authorized-audiences
Liste des audiences autorisées pour les web services JWT.
excluded-emails
Liste des emails exclus du système.
Exemple complet : CAS + LDAP avec groupes virtuels
spring:
ldap:
base: dc=<votre-domaine>,dc=fr
urls: ldap://ldap.<votre-domaine>.fr
username: cn=esup-signature,dc=<votre-domaine>,dc=fr
password: <mot-de-passe>
ldap:
search-base: ou=people
user-id-search-filter: (uid={0})
group-search-base: ou=groups
group-search-filter: member={0}
mapping-filters-groups:
mes-utilisateurs: "(eduPersonAffiliation:=staff)"
mes-admins: "(memberOf:=cn=esup-signature_admin,ou=groups,dc=<votre-domaine>,dc=fr)"
security:
cas:
url: https://cas.<votre-domaine>.fr
service: https://esup-signature.<votre-domaine>.fr/login/cas
title: Compte Université (CAS)
web:
group-to-role-filter-pattern: for.esup-signature.role.(\w*)
mapping-groups-roles:
mes-utilisateurs: ROLE_USER
mes-admins: ROLE_ADMIN
for.esup-signature.role.treasurer: ROLE_TREASURER
ws-access-authorize-ips: 127.0.0.1
Exemple : Shibboleth sans LDAP
Utilise group-mapping-spel pour l'attribution des rôles basée sur l'EPPN.
security:
shib:
idp-url: https://idp.<votre-domaine>.fr
principal-request-header: REMOTE_USER
title: Fédération d'identité
web:
mapping-groups-roles:
mes-utilisateurs: ROLE_USER
mes-admins: ROLE_ADMIN
group-mapping-spel:
mes-utilisateurs: "true"
mes-admins: "#eppn == 'admin1@<votre-domaine>.fr' or #eppn == 'admin2@<votre-domaine>.fr'"
ws-access-authorize-ips: 127.0.0.1
Note : Cette configuration est contraignante pour les nouveaux utilisateurs Shibboleth qui n'ont jamais accédé à l'application : ils ne peuvent pas être trouvés dans la recherche des destinataires. Solution : envoyer une demande à leur adresse email complète, un profil temporaire sera créé. Lors de leur première connexion, le profil sera complété.
Server - Serveur HTTP
Paramètres du serveur Tomcat embarqué
server:
servlet:
session:
timeout: 1800
tracking-modes: cookie
error:
include-stacktrace: always
port: 8080
tomcat:
mbeanregistry:
enabled: true
remoteip:
remote-ip-header: X-Forwarded-For
basedir: ./temp
Configuration des en-têtes proxy
server.tomcat.remote-ip-header=X-Forwarded-For: Spécifie l'en-tête contenant l'IP du client réelserver.tomcat.protocol-header=X-Forwarded-Proto: Indique l'en-tête pour le protocole d'origineserver.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}: Expression régulière pour les proxys de confiance
Sign - Paramètres de signature électronique
Configuration fine des paramètres de signature selon la norme ETSI EN 319 102-1.
La norme définit quatre classes de conformité :
AdES_BASELINE_B: Signature basiqueAdES_BASELINE_T: Basique + horodatageAdES_BASELINE_LT: T + matériel de validation à long termeAdES_BASELINE_LTA: LT + horodatages périodiques
Paramètres de chiffrement
aes-key
Clé AES(16bits) utilisée pour le chiffrement des mots de passe de keystores stockés en base de données (version 1.36.27 et antérieures).
Important : À partir de la version 1.36.27+, utilisez le paramètre aes256Key (32 bits) à la place. Si vous migrez depuis une version antérieure, conservez aes-key pour la migration des données existantes.
Paramètres de signature DSS
Algorithmes et niveaux de signature
Configurez séparément pour chaque format de signature :
- CAdES : Signatures ASN.1/CMS
- PAdES : Signatures PDF
- XAdES : Signatures XML
Pour chaque format, définissez :
*-digest-algorithm: Algorithme de hachage (SHA256 recommandé)*-signature-level: Niveau de conformité ETSI
container-type
Type de conteneur ASiC pour l'empaquetage (ex: ASiC_E)
default-signature-form
Format de signature par défaut (PAdES, XAdES ou CAdES)
signature-packaging
Mode d'intégration de la signature (ENVELOPED, ENVELOPING ou DETACHED)
password-timeout
Délai d'expiration du mot de passe en millisecondes
sign-with-expired-certificate
Autoriser les certificats expirés (développement/tests uniquement)
Logging - Logs de l'application
Configuration des fichiers de logs et niveaux de verbosité
logging:
file:
name: logs/esup-signature.log
pattern:
console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5level) %clr(${PID:- }){magenta} %highlight(%X{userId:-system}){cyan} %yellow([%15.15t]) %clr(:) %m%n%wEx"
file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5level) %clr(${PID:- }){magenta} %highlight(%X{userId:-system}){cyan} %yellow([%15.15t]) %clr(:) %m%n%wEx"
level:
root: info
org.esupportail.esupsignature: info
org.verapdf: error
org.apache.pdfbox: error
org.apache.fop: error
eu.europa.esig.dss: error
---
# config: classpath:logback-prod.xml
management - Informations et monitoring de l'application
Configuration des données retournées par http://esup-signature.univ.fr/actuator/health.
management:
health:
ldap:
enabled: false
endpoints:
jmx:
exposure:
include: '*'
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS # NEVER pour ne pas afficher les détails
Pour accéder a actuator, il faut paramétrer les ip autorisée dans security.actuators-access-authorize-ips
Fichier logback.xml personnalisé
Vous pouvez utiliser un fichier XML de configuration Logback avancée. Exemple avec envoi des erreurs par email :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- default configuration from springboot -->
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.univ-ville.fr</smtpHost>
<smtpPort>25</smtpPort>
<to>toto@univ-ville.fr</to>
<from>esup-signature@univ-ville.fr</from>
<subject>%-5level - esup-signature %date{dd/MM/yyyy HH:mm:ss}
</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>[%-5level] %date{dd/MM/yyyy HH:mm:ss} [%-20thread] %logger{36}.%M\(%line\) - %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<logger name="org.esupportail.esupsignature" level="info" additivity="false">
<appender-ref ref="EMAIL"/>
</logger>
<root level="info">
<appender-ref ref="EMAIL"/>
</root>
</configuration>
Messages et apparence
Vous pouvez modifier les messages de l'application via src/main/resources/i18n/messages.properties
Exemple pour le titre de l'application
application.title = Esup Signature
application.footer = Université de Ville
Logos et filigrane
Vous avez la possibilité de modifier les logos et le filigrane de la signature (watermark). Pour cela vous devez modifier les fichiers qui se trouvent dans le dossier src/main/resources/static/images/ :
- Le logo esup-signature correspond aux fichiers
logo.pngetlogo.svg(le PNG doit faire maximum 45px de haut si vous ne voulez pas avoir à modifier le CSS) - Le logo de l'université visible dans les emails correspond au fichier
logo-univ.png - Le filigrane correspond au fichier
watermark.png. Ses dimensions doivent être de 300×150 ou 600×300
SpringDoc - API et Swagger
Configuration de la documentation API et interface Swagger
springdoc:
api-docs:
enabled: true
swagger-ui:
enabled: true
supported-submit-methods: []
packages-to-scan: org.esupportail.esupsignature.web.ws, org.esupportail.esupsignature.web.wsjwt
Note : Pour permettre l'exécution des web services depuis Swagger, modifiez supported-submit-methods avec ["get", "post", "put"]
Passons à la partie déploiement : Compilation et déploiement