Contexte
Le consortium ESUP-Portail gère un nombre de plus en plus important de documents qui doivent être signés par ESUP-Portail et souvent par un établissement membre.
Ces documents correspondent à des adhésions, des conventions, des devis, facturations etc.
L'instance esup-signature d'ESUP-Portail a vocation à faciliter la dématérialisation et le flux de gestion de ces documents, notamment vis-à-vis de ces signatures.
Ainsi l'instance esup-signature d'ESUP-Portail doit permettre à son/sa président(e) ou un de ses représentants par délégation de signer des documents qui engagent ESUP-Portail.
Cette même instance doit aussi permettre de faire signer un partenaire ou d'utiliser un document déjà signé pour qu'il soit sur-signé par ESUP-Portail.
Dans le cas où le document est signé numériquement (et ne correspond pas une 'simple' signature calligraphique / apposition d'image) via une autre instance d'esup-signature ou tout autre outil, l'instance d'esup-signature d'ESUP-Portail doit permettre de conserver les signatures numériques déjà présentées. Si les documents signés via ESUP-Portail de manière dématérialisée ne nécessitent pas l'usage d'une signature qualifiée (type RGS**) de personnes physiques, on souhaite cependant préserver toute signature de ce type qui aurait pu être utilisée en amont de la signature ESUP-Portail par un de nos partenaires.
Caractéristiques d'esup-signature.esup-portail.org
En résumé, d'un point de vue pratique, ces considérations nous ont amené à mettre en place une instance esup-signature d'ESUP-Portail proposant ces caractéristiques :
- authentification shibboleth avec des rôles affectés en fonction de l'attribut eduPersonPrincipalName (eppn) sans lien direct avec un annuaire LDAP ;
- un usage systématique d'un certificat cachet serveur RGS** tel que le supporte esup-signature.
Installation matérielle
L'instance esup-signature d'ESUP-Portail est installée et gérée par l'Université de Rouen Normandie ; elle correspond à une Machine Virtuelle opérée par la solution VMware vSphere de l'université.
Le certificat cachet serveur propre à l'esup-signature d'ESUP-Portail a été acquis auprès de certinomis par le consortium lui-même, un membre de l'université de Rouen en est le mandataire et le responsable technique.
Ce certificat cachet serveur se matérialise par :
- une carte à puce SIM "Gemalto IDPrime 940C"
- intégrée dans un lecteur USB de carte à puce "Feitian SCR301"
- lui-même branché dans un hub USB réseau "Digi AnywhereUSB® 8 Plus" racké dans une baie du data center de l'université de Rouen
- et monté par linux en périphérique USB via "AnywhereUSB Manager" sur la machine virtuelle dédiée à l'instance d'esup-signature d'ESUP-Portail
Configurations logicielles
Esup-signature supporte les certificats cachets (seal) soit :
- en passant par OpenSC, qui détermine alors le driver libre à utiliser en fonction de la clef ;
- cette possibilité a l'avantage d'utiliser des logiciels libres directement disponibles via le sysème de paquets de votre distribution (opensc)
- cela présuppose cependant qu'un driver libre supporte effectivement la clef proposée ; si les certificats idprime-940 sont supportés en opensc 0.23.0, les idprime-940c ne le sont que sur la toute dernière 0.24.0 sortie en déc. 2023 et non encore disponible à cette date par exemple ; plus d'informations sur la page OpenSC sur ce même wiki.
- en passant directement par le driver / librairie propriétaire
- cette option a l'avantage d'utiliser le driver officiel livré par l'entreprise vendant le support matériel du cachet ; le support est donc normalement garanti (normalement sur tous les OS dont linux si vous installez esup-signature sur un serveur linux ; fortement recommandé)
- cela a aussi l'avntage de proposer un process de signature plus rapide (constatation à l'usage)
→ si nous avons bien validé le fonctionnement de notre cachet idprime-940c avec opensc 0.24.0, nous avons opté malgré tout pour l'usage du driver propriétaire.
Le service https://esup-signature.esup-portail.org est déclaré dans la fédération ESR portée par Renater : https://registry.federation.renater.fr/entities/view/2294
L'usage de la signature par certificat cachet serveur est systématique : le cachet serveur permet la réalisation de cachets systématiques côté serveur en masse sans requérir à une installation ou configuration supplémentaire pour les clients signataires.
La demande d'une signature par le/la président(e) d'ESUP-Signature (ou délégataire) est possible à toute personne authentifiée (fédération ESR).
L'initiation d'un circuit autre est disponible pour certains membres d'ESUP-Portail (authentifiés et identifiés via la fédération ESR à nouveau).
Fichier application.yml
Le fichier de configuration de cette instance d'esup-signature est ainsi le suivant (à quelques paramètres/passwords de sécurité près) :
global: root-url: https://esup-signature.esup-portail.org domain: esup-portail.org nexu-url: http://localhost:9795 nexu-version: 1.22, 1.23 ou Esup-DSS-Client 1.0 hide-wizard: true hide-auto-sign: true hide-send-sign-request: true hide-wizard-except-roles: hide-auto-sign-except-roles: hide-send-sign-except-roles: enable-su: false enable-splash: true application-email: no-reply@esup-portail.org hours-before-refresh-notif: 24 share-mode: 1 pdf-only: true seal-certificat-pin: ****** # usage du driver propriétaire et pas d'OpenSC # seal-certificat-type: OPENSC seal-certificat-type: PKCS11 seal-certificat-driver: /usr/lib/pkcs11/libIDPrimePKCS11.so infinite-scrolling: true return-to-home-after-sign: false naming-template: "[title]" signed-suffix: "_signed" trash-keep-delay: 15 disable-cert-storage: true export-attachements: false authorized-sign-types: certsign tomcat: ajp: port: 8009 info: app: name: esup-signature description: Instance de production tags: environment: PROD management: health: ldap: enabled: false endpoints: jmx: exposure: include: '*' web: exposure: include: '*' endpoint: health: show-details: ALWAYS spring: session: jdbc: initialize-schema: ALWAYS datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/esupsignature password: ************* username: esupsignature jdbc-url: ${spring.datasource.url} hikari: auto-commit: false tomcat: validation-query: SELECT 1; jpa: hibernate: ddl-auto: update properties: hibernate: jdbc: lob: non_contextual_creation: true show-sql: false open-in-view: false mail: host: smtp.univ-rouen.fr messages: basename: i18n/messages encoding: UTF-8 fallback-to-system-locale: false data: ldap: repositories: enabled: false thymeleaf: cache: true 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 mail: from: no-reply@esup-portail.org sms: enable-sms : false 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/constraint.xml server-signing-keystore-filename: validate_service.p12 server-signing-keystore-password: password server-signing-keystore-type: PKCS12 tsp-server: 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 fs: vfs-test-uri: /tmp pdf: convert-to-pdf-a: true pdf-a-level: 2 path-to-g-s: /usr/bin/gs path-to-fonts : /usr/share/fonts pdf-to-image-dpi: 72 security: shib: idp-url: https://idp.univ-rouen.fr principal-request-header: REMOTE_USER title: Fédération d'identité RENATER / Shibboleth domains-white-list-url: https://eduspot.renater.fr/eduspot/whitelist-eduspot.txt web: group-to-role-filter-pattern: for.esup-signature.role.(\w*) mapping-groups-roles: for.esup-signature.admin: ROLE_ADMIN for.esup-signature.user: ROLE_USER for.esup-signature.create-sign-req: ROLE_CREATE_SIGNREQUEST for.esup-signature.esup-coord: ROLE_CREATE_AUTOSIGN for.esup-signature.seal: ROLE_SEAL ws-access-authorize-ips: 127.0.0.1 group-mapping-spel: for.esup-signature.admin: "#eppn == '*****@univ-rouen.fr' or #eppn == '*****@univ-rouen.fr'" for.esup-signature.user: "true" for.esup-signature.seal: "true" for.esup-signature.create-sign-req: "#eppn == '****@univ-rouen.fr' or #eppn == '****@univ-rouen.fr' or #eppn == '*****@univ-lyon3.fr' or #eppn == '*****@uphf.fr' or #eppn == '****@univ-lorraine.fr' or #eppn == '****@toulouse-inp.fr'" for.esup-signature.esup-coord: "#eppn == '****@univ-rouen.fr' or #eppn == '***@univ-rouen.fr' or #eppn == '****@univ-lyon3.fr' or #eppn == '****@toulouse-inp.fr'" server: servlet: session: tracking-modes: COOKIE error: include-stacktrace: always port: 8080 tomcat: mbeanregistry: enabled: true remoteip: remote-ip-header: X-Forwarded-For basedir: ./temp max-swallow-size: -1 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 logging: file: name: /var/log/esup-signature/esup-signature.log pattern: console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(%X{userId:-system}){cyan} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx" file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(%X{userId:-system}){cyan} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx" level: root: warn org.esupportail.esupsignature: info org.verapdf: error org.apache.pdfbox: error eu.europa.esig.dss: error org.springframework.web.filter.CommonsRequestLoggingFilter: error springdoc: api-docs: enabled: true path: /api-docs swagger-ui: enabled: true supported-submit-methods: [] path: /swagger-ui.html packages-to-scan: org.esupportail.esupsignature.web.ws show-actuator: true