...
Configuration i18n (internationalisation).
| Bloc de code | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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
...
Des implémentations SMSU et OVH sont disponibles. Vous pouvez en ajouter en implémentant l'interface SmsService.
| Bloc de code | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
<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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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
...
Configuration DSS et OpenSC
| Bloc de code | ||
|---|---|---|
| ||
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é
| Bloc de code | ||
|---|---|---|
| ||
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 |
...
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 | ||
|---|---|---|
| ||
<?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> |
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 | ||
|---|---|---|
| ||
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"]
...