Esup-Signature

Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: ajout monitoring

Sommaire
maxLevel1

...

Tomcat

Configuration du serveur Tomcat embarqué dans Spring Boot.

...

Port AJP pour communication avec un serveur frontal. À ne pas configurer si l'application est démarrée par un serveur Tomcat externe.

Bloc de code
languageyaml
tomcat:
    ajp:
        port: 6009

...

Spring - Configuration globale

...

Configuration i18n (internationalisation).

Bloc de code
languageyaml
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

...

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

Bloc de code
languageyaml
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

...

Configuration de l'adresse d'envoi des emails

Bloc de code
languageyaml
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.

Bloc de code
languageyaml
sms:
    enable-sms: false

...

#    service-name: SMSU

...

#    url: https://smsu-api.<votre-domaine>.fr/

...

#    username: sms-account

...


#    password: ********

...

DSS - Signature numérique et validation

...

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

Bloc de code
languageyaml
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

...

Si votre serveur se trouve derrière un forward proxy, configurez l'accès aux certificats de confiance :

Bloc de code
languageyaml
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

...

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.

Bloc de code
languageyaml
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

Bloc de code
languageyaml
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.

...

Authentification centralisée. Nécessite une configuration LDAP. Idéale pour utilisation interne.

Bloc de code
languageyaml
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.

Bloc de code
languageyaml
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 :

Bloc de code
languagexml
<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

...

Exemple complet : CAS + LDAP avec groupes virtuels

Bloc de code
languageyaml
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.

Bloc de code
languageyaml
 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é.

...

Paramètres du serveur Tomcat embarqué

Bloc de code
languageyaml
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

...

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

Configuration DSS et OpenSC

sign:
    aes-key: "0000000000000000"
    
    cades-digest-algorithm: SHA256
    cades-signature-level: CAdES_BASELINE_LT
    
    container-type: ASiC_E
    default-signature-form: XAdES
    
    pades-digest-algorithm: SHA256
    pades-signature-level: PAdES_BASELINE_LT
    
    password-timeout: 60000
    signature-packaging: ENVELOPED
    
    xades-digest-algorithm: SHA256
    xades-signature-level: XAdES_BASELINE_LT
    
    sign-with-expired-certificate: false
    
    # Paramètres OpenSC (alternative libre au driver PKCS11 propriétaire)
    opensc-command-sign: "pkcs11-tool --sign -v --id {0} -p {1} --mechanism SHA256-RSA-PKCS --input-file {2} --output-file {3}"
    opensc-command-get-id: "pkcs11-tool -O --type pubkey"
    opensc-command-get-key: "pkcs11-tool -r --id {0} --type cert"
    opensc-command-cert-id: <cert-id>
    opensc-path-linux: ""

Logging - Logs de l'application

Configuration des fichiers de logs et niveaux de verbosité

...

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é

Bloc de code
languageyaml
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.

Bloc de code
languageshell
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 :

Bloc de code
languagexml
<?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>
      

...

 

...

Fichier logback.xml personnalisé

Vous pouvez utiliser un fichier XML de configuration Logback avancée :

...

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

appender>

...

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 Rouen NormandieVille

...

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

...

Configuration de la documentation API et interface Swagger

Bloc de code
languageyaml
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"]

...


Astuce

Passons à la partie déploiement : Compilation et déploiement