| Sommaire | ||
|---|---|---|
|
...
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 | ||
|---|---|---|
| ||
tomcat:
ajp:
port: 6009 |
...
Spring - Configuration globale
...
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
...
Configuration de l'adresse d'envoi des emails
| Bloc de code | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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
...
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
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
<?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 | ||
|---|---|---|
| ||
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 |