Esup-Signature

Arborescence des pages


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é).

Mail

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 format uid@domain (par défaut = userIdSearchFilter)
  • ou-search-filter : Utilisé seulement pour le pré-remplissage des affectations dans les formulaires
  • mapping-filters-groups : Crée des groupes virtuels. Combinez ensuite avec mapping-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'application
  • ROLE_ADMIN : Accès à la partie administration
  • ROLE_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 :

  1. Récupération des groupes : À la connexion, les groupes de l'utilisateur sont récupérés
  2. 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é à #eppn et "true")
  3. 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: groupe for.esup-signature.role.bondecommande → rôle ROLE_BONDECOMMANDE)
    • Ensuite via mapping-groups-roles : Mappe les groupes aux rôles spécifiques

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 #eppn est 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éel
  • server.tomcat.protocol-header=X-Forwarded-Proto : Indique l'en-tête pour le protocole d'origine
  • server.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3} : Expression régulière pour les proxys de confiance

Voir : https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/howto-embedded-web-servers.html#howto-customize-tomcat-behind-a-proxy-server


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 basique
  • AdES_BASELINE_T : Basique + horodatage
  • AdES_BASELINE_LT : T + matériel de validation à long terme
  • AdES_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.png et logo.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

  • Aucune étiquette