From 3052b3f96e4405c4e3e5b58e026f8be3105c1d9e Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 09:35:30 +0200 Subject: [PATCH 01/11] =?UTF-8?q?feat(portail):=20mise=20en=20page=20du=20?= =?UTF-8?q?livre=20blanc,=20=C3=A0=20l'=C3=A9cran=20et=20en=20PDF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PDF : grille des chiffres clés sur trois colonnes (la grille portait sur le conteneur et tassait les cartes), sommaire avec numéros de page et points de conduite, titres hiérarchisés, en-tête courant de section, texte justifié avec césure, encadrés et tableaux sans ombre, couverture avec bandeau et filet d'accent. Écran : en-tête du livre blanc restylé, fiche d'identification sans ligne d'en-tête vide, titres plus marqués et encadrés plus lisibles. Les deux PDF restent conformes PDF/UA-1 (veraPDF). Co-authored-by: Claude --- docs/livre-blanc/index.md | 4 + docs/stylesheets/extra.css | 92 ++++++++++++++++ docs/stylesheets/print.css | 213 ++++++++++++++++++++++++++++++++++++- docs/white-paper/index.md | 4 + scripts/pdf-weasyprint.css | 29 ++--- 5 files changed, 319 insertions(+), 23 deletions(-) diff --git a/docs/livre-blanc/index.md b/docs/livre-blanc/index.md index a4cfc38..adc7711 100644 --- a/docs/livre-blanc/index.md +++ b/docs/livre-blanc/index.md @@ -25,6 +25,8 @@ description: "Livre blanc de l'Open Trusted Service Provider Initiative : défai

La version PDF est balisée et validée au format PDF/UA-1 par l'outil de contrôle veraPDF ; cette validation automatique ne remplace pas un test avec un lecteur d'écran. La présente page (HTML) reste la version accessible de référence.

+
+ | | | |---|---| | **Émetteur** | Initiative « Open Trusted Service Provider Initiative » (OTSPI), association loi 1901 en cours de constitution | @@ -34,6 +36,8 @@ description: "Livre blanc de l'Open Trusted Service Provider Initiative : défai | **Licence** | Creative Commons Attribution 4.0 International (CC-BY-4.0) | | **Contact** | [contact@otspi.org](mailto:contact@otspi.org) | +
+ !!! note "Nature du document" Le présent livre blanc expose une intention et une architecture cible. Il ne constitue ni une Politique d'Horodatage, ni une Déclaration des Pratiques de Certification (DPC), ni un engagement contractuel de service. Les références à des produits ou fournisseurs sont données à titre indicatif ; leur sélection définitive relèvera de procédures de mise en concurrence et de l'approbation du Comité des Politiques de Confiance (CPC). diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 817e9a0..66e0948 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -262,6 +262,94 @@ } } +/* -------------------------------------------------------------------------- + Livre blanc — en-tête, métadonnées et hiérarchie des titres + (la page de garde .wp-cover, masquée à l'écran, identifie la page du livre blanc) + -------------------------------------------------------------------------- */ +.md-typeset .wp-cover ~ h1 { + margin-bottom: 0.4em; + color: var(--otspi-primary); + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.md-typeset .wp-cover ~ h1 + h2 { + margin-top: 0; + padding-left: 0.8rem; + border-left: 4px solid var(--otspi-primary); + color: var(--md-default-fg-color); + font-size: 1.6em; + font-weight: 700; + line-height: 1.3; + letter-spacing: -0.01em; +} + +[data-md-color-scheme="slate"] .md-typeset .wp-cover ~ h1 { + color: #9cc0ff; +} + +[data-md-color-scheme="slate"] .md-typeset .wp-cover ~ h1 + h2 { + border-left-color: #8fb4ff; +} + +.md-typeset:has(> .wp-cover) h2 { + font-weight: 700; + letter-spacing: -0.01em; +} + +.md-typeset:has(> .wp-cover) h3 { + font-weight: 700; +} + +.md-typeset:has(> .wp-cover) h4 { + font-weight: 700; + color: var(--md-default-fg-color--light); +} + +/* Encadrés lisibles : Material les compose plus petit que le corps du texte */ +.md-typeset:has(> .wp-cover) .admonition, +.md-typeset:has(> .wp-cover) details { + font-size: 0.72rem; +} + +/* Fiche d'identification du document : tableau clé / valeur sans ligne d'en-tête */ +.md-typeset .wp-meta thead { + display: none; +} + +.md-typeset .wp-meta table:not([class]) { + border: none; + border-top: 2px solid var(--otspi-primary); + border-radius: 0; + box-shadow: none; + font-size: 0.72rem; +} + +.md-typeset .wp-meta table:not([class]) td { + padding: 0.55em 0.9em; + border-top: 1px solid var(--md-default-fg-color--lightest); + vertical-align: top; +} + +.md-typeset .wp-meta table:not([class]) td:first-child { + width: 11em; + color: var(--md-default-fg-color--light); + white-space: nowrap; +} + +.md-typeset .wp-meta table:not([class]) tr:hover { + box-shadow: none; +} + +@media screen and (max-width: 44.9375em) { + .md-typeset .wp-meta table:not([class]) td:first-child { + width: auto; + white-space: normal; + } +} + /* -------------------------------------------------------------------------- Livre blanc — chiffres clés -------------------------------------------------------------------------- */ @@ -429,6 +517,10 @@ --md-typeset-a-color: #8fb4ff; } +[data-md-color-scheme="slate"] .md-typeset .wp-meta table:not([class]) { + border-top-color: #8fb4ff; +} + [data-md-color-scheme="slate"] .otspi-badge { color: #9cc0ff; } diff --git a/docs/stylesheets/print.css b/docs/stylesheets/print.css index 55ddffb..2c8a8c1 100644 --- a/docs/stylesheets/print.css +++ b/docs/stylesheets/print.css @@ -30,6 +30,12 @@ /* Gabarit nommé du livre blanc : pied de page identifiant le document */ @page whitepaper { + @top-right { + content: string(section); + font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + color: #64748b; + } + @bottom-left { content: "OTSPI — Livre blanc · document de consultation v0.9 · CC-BY-4.0"; font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; @@ -38,12 +44,19 @@ } @page whitepaper:first { + @top-right { content: none; } @bottom-left { content: none; } @bottom-right { content: none; } } /* Gabarit anglais du livre blanc */ @page whitepaper-en { + @top-right { + content: string(section); + font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + color: #64748b; + } + @bottom-left { content: "OTSPI — White paper · public consultation v0.9 · CC-BY-4.0"; font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; @@ -52,6 +65,7 @@ } @page whitepaper-en:first { + @top-right { content: none; } @bottom-left { content: none; } @bottom-right { content: none; } } @@ -224,20 +238,211 @@ .wp-cover ~ hr { display: none; } + + /* Typographie du livre blanc */ + .md-typeset:has(> .wp-cover) { + color: #1e293b; + } + + .md-typeset:has(> .wp-cover) p, + .md-typeset:has(> .wp-cover) li { + text-align: justify; + hyphens: auto; + } + + /* Colonnes étroites et page de garde : le justifié y creuserait des blancs */ + .md-typeset .wp-cover p, + .md-typeset .grid.cards.wp-figures p, + .md-typeset .grid.cards.wp-figures li { + text-align: center; + hyphens: manual; + } + + .md-typeset .grid.cards.wp-figures p, + .md-typeset .grid.cards.wp-figures li { + text-align: left; + } + + .md-typeset .wp-cover ~ h2 { + margin: 0 0 6mm; + padding-bottom: 2.5mm; + border-bottom: 1.5pt solid var(--otspi-primary); + color: #0f2a6b; + font-size: 18pt; + font-weight: 700; + line-height: 1.25; + letter-spacing: -0.01em; + string-set: section content(); + } + + /* Le sous-titre masqué ne doit pas alimenter l'en-tête courant */ + .md-typeset .wp-cover ~ h1 + h2 { + string-set: section ""; + } + + .md-typeset .wp-cover ~ h3 { + margin: 7mm 0 2.5mm; + color: var(--otspi-primary); + font-size: 12.5pt; + font-weight: 700; + line-height: 1.3; + } + + .md-typeset .wp-cover ~ h4 { + margin: 5mm 0 2mm; + color: #1e293b; + font-size: 10.5pt; + font-weight: 700; + } + + /* Les titres ne restent jamais seuls en bas de page */ + .md-typeset .wp-cover ~ h3, + .md-typeset .wp-cover ~ h4 { + break-after: avoid; + break-inside: avoid; + } + + /* Encadrés : filet de couleur, sans ombre ni arrondi */ + .md-typeset:has(> .wp-cover) .admonition, + .md-typeset:has(> .wp-cover) details { + margin: 5mm 0; + border-width: 0 0 0 2.5pt; + border-radius: 0; + box-shadow: none; + font-size: 9pt; + } + + .md-typeset:has(> .wp-cover) .admonition-title, + .md-typeset:has(> .wp-cover) summary { + font-size: 9pt; + } + + /* Tableaux */ + .md-typeset:has(> .wp-cover) table:not([class]) { + border: none; + border-top: 1.5pt solid var(--otspi-primary); + border-bottom: 0.75pt solid #94a3b8; + border-radius: 0; + box-shadow: none; + } + + .md-typeset:has(> .wp-cover) table:not([class]) th { + background: #eef2fb; + color: #0f2a6b; + font-weight: 700; + } + + .md-typeset:has(> .wp-cover) table:not([class]) th, + .md-typeset:has(> .wp-cover) table:not([class]) td { + padding: 1.6mm 2.5mm; + border-top: 0.5pt solid #e2e8f0; + text-align: left; + hyphens: auto; + } + + .md-typeset:has(> .wp-cover) table:not([class]) thead { + display: table-header-group; + } + + .md-typeset:has(> .wp-cover) table:not([class]) tbody tr:nth-child(even) { + background: #f8fafc; + } + + .md-typeset .wp-meta table:not([class]) { + font-size: 9pt; + } + + /* Notes de bas de page */ + .md-typeset:has(> .wp-cover) .footnote { + font-size: 8pt; + color: #334155; + } + + .md-typeset:has(> .wp-cover) .footnote li { + text-align: left; + } + + /* Page de garde : bandeau et filet d'accent */ + .md-typeset .wp-cover { + border-top: 5mm solid var(--otspi-primary); + min-height: 240mm; + } + + .md-typeset .wp-cover .wp-cover-title { + color: #0f2a6b; + font-size: 24pt; + font-weight: 800; + letter-spacing: -0.01em; + } + + .md-typeset .wp-cover .wp-cover-title::after { + content: ""; + display: block; + width: 22mm; + height: 1.2mm; + margin: 9mm auto 0; + background: #ffcc00; + } + + /* Sommaire */ + .md-typeset .wp-toc h3 { + margin: 0 0 8mm; + padding-bottom: 2.5mm; + border-bottom: 1.5pt solid var(--otspi-primary); + color: #0f2a6b; + font-size: 18pt; + font-weight: 700; + } + + .md-typeset .wp-toc li { + margin: 0; + padding: 2.2mm 0; + border-bottom: 0.5pt solid #e2e8f0; + font-size: 10.5pt; + text-align: left; + } + + .md-typeset .wp-toc a { + color: #1e293b; + text-decoration: none !important; + } } /* Grille des chiffres clés du livre blanc */ @media print { + /* La grille porte sur la liste : posée sur le conteneur, elle tasserait les six cartes + dans la première colonne. */ .md-typeset .grid.cards.wp-figures { + display: block; + } + + .md-typeset .grid.cards.wp-figures > ul { display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 0.6rem; + grid-template-columns: repeat(3, 1fr); + gap: 4mm; + margin: 0; + padding: 0; + list-style: none; } - .md-typeset .grid.cards.wp-figures > ul > li, - .md-typeset .grid.cards.wp-figures li { + .md-typeset .grid.cards.wp-figures > ul > li { + margin: 0; + padding: 3.5mm 4mm; + border: 0.5pt solid #cbd5e1; + border-top: 2.5pt solid var(--otspi-primary); + border-radius: 0; + box-shadow: none; + background: #f8fafc; + font-size: 8.5pt; + line-height: 1.4; break-inside: avoid; } + + .md-typeset .grid.cards.wp-figures .wp-value { + color: var(--otspi-primary); + font-size: 17pt; + line-height: 1.15; + } } /* Schémas SVG du livre blanc : ne pas les couper d'une page à l'autre */ diff --git a/docs/white-paper/index.md b/docs/white-paper/index.md index 29eb7a4..37118b5 100644 --- a/docs/white-paper/index.md +++ b/docs/white-paper/index.md @@ -26,6 +26,8 @@ description: "White paper of the Open Trusted Service Provider Initiative: marke

The PDF is tagged and validated as PDF/UA-1 by the veraPDF checker; this automated validation does not replace testing with a screen reader. This page (HTML) remains the accessible reference version.

+
+ | | | |---|---| | **Issuer** | Open Trusted Service Provider Initiative (OTSPI), non-profit association under the French law of 1901, currently being formed | @@ -35,6 +37,8 @@ description: "White paper of the Open Trusted Service Provider Initiative: marke | **Licence** | Creative Commons Attribution 4.0 International (CC-BY-4.0) | | **Contact** | [contact@otspi.org](mailto:contact@otspi.org) | +
+ !!! note "Nature of this document" This white paper sets out an intention and a target architecture. It is neither a Time-Stamping Policy, nor a Certification Practice Statement (CPS), nor a contractual service commitment. References to products or suppliers are given for information only; their final selection will be subject to competitive procedures and to the approval of the Trust Policy Committee (CPC). diff --git a/scripts/pdf-weasyprint.css b/scripts/pdf-weasyprint.css index d86eb10..b04169d 100644 --- a/scripts/pdf-weasyprint.css +++ b/scripts/pdf-weasyprint.css @@ -40,6 +40,8 @@ body { width: 1px !important; height: 1px !important; overflow: hidden !important; + padding: 0 !important; + border: 0 !important; break-before: auto !important; } @@ -65,17 +67,8 @@ body { padding-left: 0.6rem !important; } -/* Grille des chiffres clés : WeasyPrint ne gère pas la grille automatique de Material. */ -.md-typeset .grid.cards.wp-figures > ul { - display: grid !important; - grid-template-columns: repeat(2, 1fr) !important; - gap: 0.6rem !important; -} - -.md-typeset .grid.cards.wp-figures > ul > li { - margin: 0 !important; -} - +/* Grille des chiffres clés (trois colonnes, voir print.css) : WeasyPrint ne gère pas la grille + automatique de Material ni ses largeurs minimales. */ .md-typeset .grid.cards.wp-figures, .md-typeset .grid.cards.wp-figures > ul { width: 100% !important; @@ -83,19 +76,11 @@ body { box-sizing: border-box !important; } -.md-typeset .grid.cards.wp-figures > ul { - margin: 0 !important; - padding: 0 !important; - list-style: none !important; -} - .md-typeset .grid.cards.wp-figures > ul > li { - padding: 0.6rem 0.7rem !important; min-width: 0 !important; } .md-typeset .grid.cards.wp-figures .wp-value { - font-size: 1.25rem !important; overflow-wrap: anywhere; } @@ -127,3 +112,9 @@ body { .footnote li > p:first-child { display: inline !important; } + +/* Sommaire : numéro de page de chaque section, précédé de points de conduite. */ +.md-typeset .wp-toc a::after { + content: leader(".") target-counter(attr(href url), page); + color: #64748b; +} From 7efe5e09c2c7c86cf187144656065848f56f402c Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 09:48:29 +0200 Subject: [PATCH 02/11] =?UTF-8?q?feat(portail):=20police=20Inter,=20figure?= =?UTF-8?q?s=20l=C3=A9gend=C3=A9es=20et=20couverture=20du=20livre=20blanc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Police Inter (OFL 1.1, sous-ensemble latin) auto-hébergée pour tout le portail, sans service tiers ; embarquée dans le PDF et ses schémas, dont le rendu ne dépend plus des polices de la machine de génération. - Schémas légendés et numérotés (figure 1, figure 2), ancrés sur #figure-N ; renvoi vers la figure 2 depuis le texte. - Couverture du PDF à fond perdu aux couleurs du logo en version claire, mentions en bas de page. - Signets du PDF : sections, annexes et sommaire au premier niveau, sous-sections repliées, sans le titre et le sous-titre masqués. - Logo vertical sombre sans masque SVG : WeasyPrint ignorait le masque et effaçait l'anneau du sceau. Rendu inchangé dans les navigateurs. - Césure avec un trait d'union ASCII, présent dans la police. Les deux PDF restent conformes PDF/UA-1 (veraPDF). Co-authored-by: Claude --- docs/assets/fonts/inter/OFL.txt | 93 +++++++++++++ .../fonts/inter/inter-latin-300-normal.woff2 | Bin 0 -> 23916 bytes .../fonts/inter/inter-latin-400-italic.woff2 | Bin 0 -> 25040 bytes .../fonts/inter/inter-latin-400-normal.woff2 | Bin 0 -> 23664 bytes .../fonts/inter/inter-latin-600-normal.woff2 | Bin 0 -> 24452 bytes .../fonts/inter/inter-latin-700-italic.woff2 | Bin 0 -> 25868 bytes .../fonts/inter/inter-latin-700-normal.woff2 | Bin 0 -> 24356 bytes .../fonts/inter/inter-latin-800-normal.woff2 | Bin 0 -> 24400 bytes docs/assets/logo-vertical-dark.svg | 12 +- docs/livre-blanc/index.md | 10 +- docs/stylesheets/extra.css | 14 ++ docs/stylesheets/fonts.css | 68 ++++++++++ docs/stylesheets/print.css | 123 ++++++++++-------- docs/white-paper/index.md | 10 +- mkdocs.yml | 4 +- scripts/build_diagrams.py | 10 +- scripts/export_pdf.py | 6 +- scripts/pdf-weasyprint.css | 24 ++++ 18 files changed, 297 insertions(+), 77 deletions(-) create mode 100644 docs/assets/fonts/inter/OFL.txt create mode 100644 docs/assets/fonts/inter/inter-latin-300-normal.woff2 create mode 100644 docs/assets/fonts/inter/inter-latin-400-italic.woff2 create mode 100644 docs/assets/fonts/inter/inter-latin-400-normal.woff2 create mode 100644 docs/assets/fonts/inter/inter-latin-600-normal.woff2 create mode 100644 docs/assets/fonts/inter/inter-latin-700-italic.woff2 create mode 100644 docs/assets/fonts/inter/inter-latin-700-normal.woff2 create mode 100644 docs/assets/fonts/inter/inter-latin-800-normal.woff2 create mode 100644 docs/stylesheets/fonts.css diff --git a/docs/assets/fonts/inter/OFL.txt b/docs/assets/fonts/inter/OFL.txt new file mode 100644 index 0000000..40589da --- /dev/null +++ b/docs/assets/fonts/inter/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/assets/fonts/inter/inter-latin-300-normal.woff2 b/docs/assets/fonts/inter/inter-latin-300-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ece952cf7ef69913a31e68921cee9a56e5667603 GIT binary patch literal 23916 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
4m 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 literal 0 HcmV?d00001 diff --git a/docs/assets/fonts/inter/inter-latin-600-normal.woff2 b/docs/assets/fonts/inter/inter-latin-600-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d1897949fda5c7fc5f04622df43a3fcba5b89d84 GIT binary patch literal 24452 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 literal 0 HcmV?d00001 diff --git a/docs/assets/fonts/inter/inter-latin-700-italic.woff2 b/docs/assets/fonts/inter/inter-latin-700-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..48b6e5b1ca83f066e914e9c2c2a8376364cddade GIT binary patch literal 25868 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≪hYBj#y9}W7RGiEfhm&vfCoo^Q` z)=K6$YeDR%bat!A(srq&j9}pgz{z9K88ilc4HI~^%6(a_sLS^~5FY_lU?6w^wO7`5 zX`WN)Qr-XBmbY@-wQ;JdL20_f z;?tRLwvAnieXE3`AI!g}~ti)b9)Z!<7q`hR5+IqhJPIe;QtY-2E%op7Uwd?cws6%x?}J`Z(M|hFJsd zp7|fysJlwvY~08qX}$OQV<~~&Lno5U6C!b*oBt5FWGB9U%rx#FQ9CcJ9T__dx%x1% zeiZ;cRUn*JUg{Ai?}~>`1vU09Pwo*V`JXpej*E6`;ihfWF-Ba{N8|n;6A1>9K|j^q z^04mC&SmGgaeGl0xYeL7i@SABwq{&UrH$QzSun;mb0=T8E1vZ%Rt=P}CSa^Kvw-Qo zst!#^s74T|PFe6X51MF94l~D-&G;n^&Gb2q+sp~fyd_;`)w2UBHdT~j$j}|=gz(+0 zr%9p^PjCbYhQ3O5#O6}QOe3%fA@U_gvTRUNTQPF(RhAsV&kDyLD8jLaWPP@pVwuR! zNi1ljLOAE-1cD>;$BADGCo{_5mScw%jIh7hg=vY~n1_h5MF0m0L>7#iE)Sjx2>2(f z7Fb1nHQf+NORKSsV2p@&I^v}mN+<(6OPm3StdM|-?m6@hE%-vdP`}fKHiWOp#oguU zAtl}<61%Qsopk7E+DlOgAwg zKbA=43N8Q`Zq0y{g`q0YuFr2OUijXeeg~a{RU-f zIbukI90LFxMnZD_SvVg}moAni%`*nVE9Wnh+(9@Sx+vk)maANZvH=o_z&K;#^62?3 zLjYGnJuCJa*g4EnzNu{SKw*dg7@xue)PQ=!|CqW@*Q&ucAZph3x?uut@$~>NoB>Xt zrGOofcpi>2@Y%da^T9ojv!7xSVSAoa9Sv!KeO|W{7=#Elh{8Mxp#=uubkB(sk%4Lu zKmZH^vW*X-#4a{hoZ1(ngXU+q|4}xJ=X;6GByzI9pC1OH$X+TwQBRwCn|_&++sxY5 z+TPmc+5+1Q+dkILLt%Hbjy@@U^A~mv<@SqxJt4D)ceVjo6>enXw6nIh?%4WoGZY-m zkJY{A?%vP+_1@P_C*JvdzbH-iBPm0A2k6&L$8^&lCs|G|_vo`3_2t!<^%s{iT*xgP z>s`Y3SkqKIxq)yC^sIP5ByIO%A8Jz@|sek1*4HjR7Ej`amjRoWi|g! z%Ovk3P1B$fYPz;@jmy<-+qgdW_pKkAg)7Io4Kw$BM0uX)sq@drDrEWx<>ct@vgFk2 z8l9{t-@D_Dlc8c0XyptbAUyc^kGjJRnB&Ew!5&!Q7COt7rd$NEWWh|jiwrBX)onCo z6Y{SGHgtXb*0 zDpRFQnXh!U^7HXuZ0~DfV62zmrG+4@ZJA~O7HcCSN{;@&gjxV3s2~;$waPv4N=iZ% z;s{Zj82LgPaV!IJ-`%qsAU%4ayp&&-FwCYrVGd$|=YbBw=g5{XP!0=MTzLpSvKU-1 z7huLm2hL_1I4PFYYJ>qKd)Sgzj!^mn+!We6YIF?xZ;x`<%5gtuBq7RSM-q@k0$B^# z@9zom7lw6sGmnJx10y!g0m550^`Z%!)yN6(D!C2OV#ON!3=(6&5l3+@Q8;ix9U29T zYi6@0v<`nFELaj`$U!++Z{wkCH+sYQ4=MzarEnxFp;10E1R#sBN8*Jm0R=3W0$#{4 za7zoxs|wKSI-2s@z>ve7Ql2{_9QfYMHb}HO!E}Hd+C)S$ZRWVdufx$Ats<5Y6$v2y zOhvYsja7aBX!ffwwk4&ucR?RA5EYz^g`AO#{9}wkd>I3omh-Z4RmWnw7 zINB25C!f_Xn*O-en{k0m7TD(?z$ua<1veKN5w8U5f&#pZkN5i)74Byv(PVVPLTL=0^lsCl<8et=Kbt%;nsVV1}xNwWZg)cSwm zF)-C$R%R;}iLNVk9h4q90U+5R5C#y&Sv2LkFQK5u7?6=UgnVS7K;)raO)p4g=0o5K zJ1Xjq@~D@I=W;300UkMIi=G;{$Mz|UGN%J<9=?W>N0<^2G(a^hF>DpCYp(wwb!da) zXV2DV((v2nnyiK&E=n-FKidds$24sDM+!gAcZiP9Ofg1M{M1^BlG<*8PM>TLdE_?| zFzgp%V{~y0#~s|5C}R{T+A9XMnU_*kzb~p)s3=t&1C*gRj2?nQEn;kI5f5eQrcH6k z*WdZL)9_rMMayFIg5y2uK^9EkmM@I0tl+agP|Aw)2S0?a-fXcY4AH5ohqkxUqhW~j zar7x3IhI+W1arJwXnxaedC7caL|dT_TSk|4W^-vnTdB?k+5-CC zO>BNKk`qsr^d)tNdmWMkmGLncaE6i=>~F|V#x>PC13j(YQ2`=PjL1DHrwOA^Ux+z(^>A1-4y%6Ju6uK7P{+c#cu{b56tK>pZ-QCq zVXwk4mN@g@&|v3`Xrp~JQ$8#p7gj5R)_~g`f?LD&>Sb{rdF1%r;Qz_fH* zhk#n!uj8SGmqShq?&g?h8vapv2}__+Wo*(+Plcu;w~^F9ST`+h2@&Vg`p)+;dSZKG z(pvj7Ta_3u{RFC*gbo3Q zfzU{BTH6U*1xD4neOcd0Fw>!kcoCELQDl7a07Dd=-Y1A@8_T&ci2b#(=$7B!!CJAZ7TZM*_hPrz?V~p}gO@=qf7!B^@o;7Jj~%=%o4hV| zy4$&jxdt=!zZI}%FdS}3TC-=vitQp2JPP*h5P087DV~r$vS+da@nMr}63xNd4iAh4cFPPU*xc>P(r5&#N4y4z1z2---uYjc( zvS|@Q`O{0oDB+=Ka2&_JF8qdUyp&LM~21$)%QH4rW_pwi(cb?Gnh{ui{EqY4jOP z`Q6n9oORH8x8DyT?FPVE=bh<#n$spa&wusu&)|`JVdQj}S14TCehsS@9Lc3bWWzO#8-<%V`k zE1s09U%Mt7$N@bs(D6*RK{5Y?P3)J`W4=^7&f+E7sV1z@aQ{AI!WVi*EGyS*7DC#G z#9OLy*kw*2L08|vCHo=7%yqh@G6M|87HE3CI=4*IRWq(Xp8^}GHo1@9SqM5xVbMvw z3Py-&EclZDvw|Q_($R6beM)1!ba$YZ!>)n=N(F*u#5xuG0VJ>*{**OGZ&V8(F_OaQ zK~}F+0GCE^2i^=$RpMD=H~u>a|9n!yCLutj3$_ex8|RQCe)#a7>l<7T>pn+6%eFrN zWQfA+eXhfb61(rqCzuG#rS3a-(QRTf>Qmm^sc$!)Kg@8tG{<1 zF(d(0fkg%-s`3YT=vL&l&2Wy+`V^k_o#sD(%UtNY`biEO`E8!?8&>D*M%yNv)*d5 z#gEwM@7R%%+y{EB5Se51hMVDjr>|aeof5aNy11l!;11!8FPQBJ{Aq`uw840Qbj9!& zFE0e~H|ZmL`u7{|iY`G7?R*ylQOkw}QcUbbGu%oZl^VVfU&=4*v>1LKF1C;h^?u(dR?d;#q;+H!8$4F!NQP=}2*w3XM zDv4rtJ&ipZ441IGom#KnvC6%wHQb=Pg}flqr=s!)X2xKk!L{w5Xbu6Vmbs#Jvn@9) zG;@n|6n^QfC`;6HeBCt{myw&CP5uQWW{gRb=t;BTJf%s+H1fDXJ*y}Cm%nL>eJ9l6 zgM`I3#Ld!$X;AF8)i|6T%)aH;Aw)GB7c@>K^(NRH(c6_h+=M(lu>9r3%T8}W`7;c=FHu5Vb-ksF^RFf$r$iHWbJ#ZP4}5~jF*`C z+KNrJv#-?Q>eu-Ru*8@tlcu%Z^hmq-$|t7E0oESuv*_xnGBUmNi8j7_Z}J zXI?HtA7Zk_=mbUp+|JXt?~}qeJ$E~_{?7CO3`QO%s^KT)A02b$#eQ7u@E4{3)~Aj+ zFpFPy+E4)gV zn_eFYtu^HcUpw#zcEyzrUdDWgSxdjeaR*CRv{0n%$Ig_bh9TDdPCO)vaPhR((#`6i zKMn?(3N}73z!e*4ph!Tz<(?UPITM+jcXJL_q7V*xmM&}gJYHNQ#qUAZ!80^&p|_2H z>bLKSu73=Z)$n)xf`P$U!Lg77Uj?&`mH+w`szFQ_6?>=^u7~j&`1+zx>Hewe{nuo% zZB)dR$rmuOgs%1ed=a_gL{^HQ7&y^@b;2ar{hNr~Eenpw<2Vngw%t@vWBPGWd3iVb zc}mV9Ad|N^h~Q|VBq@PoubZMkPnb6ZZM3c186u>4_5#Z%WmUDEC4|FF5t+N#jPeT4 zFQ2)H<*h@hB@iR5EoxuhzK6at1+NIznfn z?bq{VrMt=Sa16i`tjiU1d1-tYLEU+fSaYV@8y3FN=(MHP z+zuK59j0x^)3u!K&V2hc`qWkPv?C*innACET&T>kakI2PdbScWly)h_#Vh&xQ-n}F zOH6seGPaKRKR-wv7%%&kDLQvrv%db;mhYvw4nbt&4PJM=<{#&~Wc_29t3yIs(~=o2 z%n9jp=4zsQ%dQc6#*D}z^d{YXx-MQ&nkM&(=s38&08@iT$dgDJoyI z)>|JnD~%i)DElYT&{LcRvn$E#Yudo)ljTgt@fd58bDxpkFV34vgEGDiiXb?KKL6$6 zfO(nkWUj&Dh*Vay=Mb-oarQftCL6gd5U{fmt$V+}wP5UbAdFeKYUKXW_vBM^gW-f` zo$X@}0J2T8x3L*@N1{}%Eo`J9DT%CC?Zn@KzQSG?V}1zpe8(7ij$+GiR^qBfYIxsQ z)D&RcbtO@He~|KmMPg!8!9>gk9F15H23GY@$#0PC?`&p-Sn}@f7VTt&b6cvAa~^53 z1kIeDI6H_UmIxhKu(&8I`53!0KTnTLwvPe>JDZMToyh%mJ&wpbZ+DxJhA$nq1O_{NkdOI2!)4nnHs*rb=5T5;RmKzN~*>4 znX}~f_Ug&onv{XEswWj$`telT8w&b?j7X;ARmZU=B&pu4ybZ<}{|?}$$ucR`b3bre z+pZ_CEa{59f+f{W>PY9)<)&4e5sS3~f9XMT$#wf(4xfD-WC%OBHFl_+ea9gULBW`( zUNSC?WM0x5fuOf7Vf|x!z}1K2>ffUKC;Q`~W0|3Vuc2{!yH^M6u36Q}OOCh5=Aa2Qp`8UFQarX#@#TTL z@gpXY1>CWl(q+*$ zSmJ*Bb#5!$NQADWf;6PG;&-#8VJb25k4t@}?fI`+qV1ga{ca)DWm)8nM!=l5IDL8(oM9ObsElnK5@*@={&4vIohey2O($)RN%!sL_w1EIgnpKMhMY$4jM}rZ_i0BR zE!hkijUEbxK&9-z8?CR)drqi2tw$zG9~gTa{1U%nV@XKI4jkq>FYPRxbV8_t2xD=u z#QSAUeX|R8Ug~KMbF~JZ3Z2z1zXH{gmx}j81c1xjA~?Y^0M+VtIq9f*!pc1t z#nI5qhn7thu=r|`Cq>8xsEyYFdqlh)eedM0npGQ8lT}K>p085M*JR6btKSw+2_B?k zsrr#OdsybCZUd*zZP(wnub}naF7suj3aUP}1;$P4%u8}GM-qMon)uxHa{+5k<>~H! z1&$^P7RAiZLC(e0PM z+n<1`29QyIeHT|AMJeIjqTz|$G&rQxRJtFfG?0$${wV72e<~{7V^F3?Pi<}HQS~8A zxH>m-1i?cowj6~O_CHHd1v4_CXeh=fD<_;xtO{jj!!V;BnWE6c!)S2;iQ6{p!e;xS z(S^Pw_Qn9#K)#Ki8B_2CNFoqxY7wEr9|bfd?GrZ>TeUP=)$fmlOem&4*=BrioyEFhpp zZ>sY@ZI^n$GFFVuy;G0D2dl~Zyj|j^lP=sk9fQBQ4Pwqr@MYtZv90{3^wj!-)a}8S zOivN(SFjl{UB7;C`MTmu6#m2RT4~&`D9A<@Tg;&9Q^%VbGgi5F&nvQo`uXPaA7W+F|99W$_ibBEA9e(P+a>Y1$bB1)RxNca)@tMIL589S+1`qN9B% zPJRSGq7@6B=ZAN6a16dTop5mMj!wW&9PHE2>u)LCB3&vJlgq?X z(~5KxbuhUsU{f@}Oa_m1`N|$j5>GcCMlRz~s0^Ni;3Hqk1Ja8j#?`nrnJHLDvPYp1 zMwB?jlidP*xo&v+5j*p)z9aW}b=~&_g}V)_4Ap(p#gR+Ncz>>LY{<=rlq6n=t3Y?f z!^qYCYX~-0lg!}_)WUevKEt|Y5P$E0!zSFD!KVPxCTClpi@?yh z!+iZRx);f<$Hre0j0YmiZBB1apB}sj+>KFj_<6?{=i&XT^G+{-qp{N-K4A;}Pd2c& z(xkttEE`#DHDgqtF}{Xz(5lGsd7Vgz%y+og6fBZ6uKJo~^@?XL4nMh%wR4T@+& z6)^1|JL=0}7>b%5?jrN!a%zi1JQ2`C90**l8aqb+P@zOkj`#HQV}-Sj&x>cRWDL)7 zqk5|ugJOEND&(b`)3aJpjzPY|-R5ACjB(X>%%r~xlnRkW7Tb;LGse~=9kTKcu+RaX z2nYaSrPHrjRri(>_>NEQ@9fGj`Cr*Oe~+lXF;5Gz+K;NF-Km_|npTpK=Nud#2yrHE z;VWBaRJf-meWrbDp5Csi&1#5sg6Rvd7musweb6jgZ&XJ)tkd#7&dBK)6274XkvMX*^}571#bg_Yp7zJ-!7E`1-L0)bIwp@SV1{IBi;6{ zwBz4vvekxj71LM8+O}OHo#-rGy?9B|hI}L=t=@JGgy)$0=6qji9s>Bp?K0!^Sd9}L zUJozZ3wLmSTeeG2vI|r^fen2BJ#_~`%OAP?yGbGd^ZXuwqFSQ{>@TDPNKQQ~x)08V zvkN*#l31zr?3i9STaP8~9AN;x-W=(FoVWtJ`mZL;p|>a6;7&AH zWssOhGuef`^Y~88ojVbCfL7NtQ5@oFnC+lXc7z@sznKVP~1#L=I){(9~93(V7@lgs}%v!ZL<{$D2XAVH&X|Nry- zKOPY$2wnl{ntfgY86oIBqlcp<>gjl+#nE;N~16sg{^Y{Em1cW1Y}sbfp(XFTj`6S%<1)Y zr`N#QDIidn8u((*+M4edY980!fE(Wc3+*@y?G4z!kg9ho)wE`VrNv2%#i|YXX#@Tw zsQl~Z1}h7&>ZRZm#eQlz5?aDMfb!AprNIrf34-lm_T+HYE!bm`O;1i$KX|0U{j zj(xx>P|H!CPHh|w(x4Q3f=Y96^jWI1{94s88e*#&yI?4F6ShT~HVkK@l(Nho;qk9mY14>LIt)T_4i7 z&j=P;cJ!kE`$br@>(9MiFyC5)8Ee~n)syVm?ZU_9)shRBBn_3%vUhCHepH3BF-k#1 z?;(|mjGTQUTkc~*=9o0FOk%81-*%Purv5ah$J0phMSU@Fs5i_U7YN2dI>;pGBbk|F zNYBcs&?RPE?8dvg;@v&Wuz0ubZi1^D!Nc7RPhUKsq=Q)%5?-vwfTxufjQex66goMk ztQDo-2tFiJxBD7f`?#vyO~IM5HMZ$^uY4GZ7xV-rg{6WW+?5z~W$Wro{

VxxxqA?t=~crz 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 - - - - - - + fill-rule="evenodd" /> + + diff --git a/docs/livre-blanc/index.md b/docs/livre-blanc/index.md index adc7711..13b32da 100644 --- a/docs/livre-blanc/index.md +++ b/docs/livre-blanc/index.md @@ -7,7 +7,7 @@ description: "Livre blanc de l'Open Trusted Service Provider Initiative : défai

-![OTSPI](../assets/logo-vertical.svg){ .wp-cover-logo } +![OTSPI](../assets/logo-vertical-dark.svg){ .wp-cover-logo }

Livre blanc

Une infrastructure de services de confiance qualifiés d'utilité publique pour eIDAS 2.0

@@ -380,8 +380,9 @@ Tout éditeur de solution de signature, commercial ou libre, peut s'appuyer sur ### 4.1. Hiérarchie de certification -
+
Hiérarchie de certification qualifiée d'OTSPIL'AC racine OTSPI, hors ligne et sous quorum, certifie l'AC intermédiaire d'horodatage, qui certifie les unités d'horodatage TSU-1 (site A) et TSU-2 (site B). Elle certifiera aussi de futures AC qualifiées de cachet, de signature et d'attestations.AC racine OTSPIhors ligne · air-gap · quorum M-de-NAC intermédiaire Horodatagehors ligne ou en ligne restreinteAC qualifiées futurescachet · signature · attestationsUnité d'horodatage TSU-1HSM en ligne — site AUnité d'horodatage TSU-2HSM en ligne — site B +
Figure 1 — Hiérarchie de certification qualifiée d'OTSPI
@@ -389,11 +390,12 @@ Tout éditeur de solution de signature, commercial ou libre, peut s'appuyer sur - Chaque **unité d'horodatage (TSU)** dispose d'une clé propre, exclusivement réservée à la signature de jetons d'horodatage, générée et conservée dans un module cryptographique certifié. - La période d'utilisation des clés TSU est inférieure à la durée de validité de leur certificat, conformément à l'ETSI EN 319 421, afin de garantir la vérifiabilité des jetons émis en fin de période. - Les futures **AC qualifiées** de cachet, de signature et d'attestations (cf. § 6.1, phase 5) seront rattachées à cette même racine qualifiée, chacune sous une AC intermédiaire dédiée à un seul usage. -- Le futur service de certificats TLS (cf. § 2.4) repose sur **deux racines distinctes** de la racine qualifiée d'horodatage : une **racine WebTrust**, destinée aux magasins de confiance des systèmes d'exploitation et des navigateurs, et une **racine QWAC**, inscrite sur la liste de confiance européenne. Elles appliquent les mêmes principes de gouvernance (air-gap, quorum, cérémonies) et ne partagent aucune clé avec les AC d'horodatage, de cachet ou de signature. +- Le futur service de certificats TLS (cf. § 2.4) repose sur **deux racines distinctes** de la racine qualifiée d'horodatage ([figure 2](#figure-2)) : une **racine WebTrust**, destinée aux magasins de confiance des systèmes d'exploitation et des navigateurs, et une **racine QWAC**, inscrite sur la liste de confiance européenne. Elles appliquent les mêmes principes de gouvernance (air-gap, quorum, cérémonies) et ne partagent aucune clé avec les AC d'horodatage, de cachet ou de signature. -
+
Hiérarchies de certification TLS d'OTSPIDeux racines distinctes : une racine WebTrust pour les magasins des navigateurs, une racine QWAC inscrite sur la liste de confiance européenne. La racine WebTrust certifie une sous-AC DV, qui émet des certificats serveur DV par ACME instantané. Une sous-AC hybride OV / QWAC, à clé unique, est certifiée par la racine WebTrust et, par signature croisée, par la racine QWAC ; elle émet des certificats OV / QWAC.signature croiséeRacine WebTrustmagasins OS et navigateursRacine QWACliste de confiance européenneSous-AC DVWebTrust uniquement · HSM standardSous-AC hybride OV / QWACune clé · deux certificats d'ACCertificats serveur DVusage Web · ACME instantanéCertificats serveur OV / QWACDSP2, eIDAS · ACME avec liaison de compte +
Figure 2 — Hiérarchies de certification TLS d'OTSPI
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 66e0948..68ecc64 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -389,6 +389,20 @@ overflow-x: auto; } +.md-typeset .wp-diagram figcaption { + max-width: 820px; + margin: 0.8em auto 0; + color: var(--md-default-fg-color--light); + font-size: 0.72rem; + font-style: normal; + text-align: center; +} + +.md-typeset .wp-fig-num { + color: var(--md-default-fg-color); + font-weight: 700; +} + .md-typeset .wp-svg { display: block; width: 100%; diff --git a/docs/stylesheets/fonts.css b/docs/stylesheets/fonts.css new file mode 100644 index 0000000..fdbdd91 --- /dev/null +++ b/docs/stylesheets/fonts.css @@ -0,0 +1,68 @@ +/* ========================================================================== + Police Inter (SIL Open Font License 1.1, voir assets/fonts/inter/OFL.txt), + servie par le portail lui-même : aucune requête vers un service tiers. + Sous-ensemble latin (français, anglais) de la distribution Fontsource 5.3.0. + Le PDF du livre blanc l'embarque aussi : son rendu ne dépend plus des polices + installées sur la machine qui le génère. + ========================================================================== */ + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-300-normal.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-400-normal.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-400-italic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-600-normal.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-700-normal.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-700-italic.woff2") format("woff2"); +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("../assets/fonts/inter/inter-latin-800-normal.woff2") format("woff2"); +} + +/* Material compose le texte avec --md-text-font, suivi des polices du système en repli */ +:root { + --md-text-font: "Inter"; +} diff --git a/docs/stylesheets/print.css b/docs/stylesheets/print.css index 2c8a8c1..06a3685 100644 --- a/docs/stylesheets/print.css +++ b/docs/stylesheets/print.css @@ -23,7 +23,7 @@ @bottom-right { content: counter(page) " / " counter(pages); - font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; color: #64748b; } } @@ -32,18 +32,19 @@ @page whitepaper { @top-right { content: string(section); - font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; color: #64748b; } @bottom-left { content: "OTSPI — Livre blanc · document de consultation v0.9 · CC-BY-4.0"; - font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; color: #64748b; } } @page whitepaper:first { + margin: 0; @top-right { content: none; } @bottom-left { content: none; } @bottom-right { content: none; } @@ -53,18 +54,19 @@ @page whitepaper-en { @top-right { content: string(section); - font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; color: #64748b; } @bottom-left { content: "OTSPI — White paper · public consultation v0.9 · CC-BY-4.0"; - font: 8pt Roboto, "Helvetica Neue", Arial, sans-serif; + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; color: #64748b; } } @page whitepaper-en:first { + margin: 0; @top-right { content: none; } @bottom-left { content: none; } @bottom-right { content: none; } @@ -98,6 +100,11 @@ padding: 0 !important; } + /* Espaceur de Material en tête d'article : il décalerait la page de garde à fond perdu */ + .md-content__inner::before { + display: none !important; + } + .md-grid { max-width: none !important; } @@ -161,13 +168,17 @@ page: whitepaper-en; } - .wp-cover { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - min-height: 245mm; - text-align: center; + /* Page de garde à fond perdu, aux couleurs du logo en version claire + (son fond #0b1120 se confond avec celui de la page) */ + .md-typeset .wp-cover { + display: block; + position: relative; + box-sizing: border-box; + height: 297mm; + margin: 0; + padding: 22mm 24mm 20mm; + background: #0b1120; + color: #f8fafc; break-after: page; } @@ -176,38 +187,59 @@ } .md-typeset .wp-cover .wp-cover-logo { - width: 55mm; - margin-bottom: 18mm; + display: block; + width: 58mm; + margin: 0 0 0 -8mm; } .md-typeset .wp-cover .wp-cover-kicker { + margin-top: 32mm; + margin-bottom: 7mm; + color: #38bdf8; font-size: 11pt; font-weight: 700; - letter-spacing: 0.2em; + letter-spacing: 0.24em; text-transform: uppercase; - color: var(--otspi-primary); - margin-bottom: 6mm; } .md-typeset .wp-cover .wp-cover-title { - font-size: 22pt; - font-weight: 700; - line-height: 1.25; - color: #0f172a; max-width: 150mm; - margin-bottom: 14mm; + color: #ffffff; + font-size: 30pt; + font-weight: 800; + line-height: 1.15; + letter-spacing: -0.015em; } + .md-typeset .wp-cover .wp-cover-title::after { + content: ""; + display: block; + width: 28mm; + height: 1.5mm; + margin-top: 11mm; + background: #fbbf24; + } + + /* Mentions ancrées en bas de page (l'ordre de lecture reste celui du document) */ .md-typeset .wp-cover .wp-cover-meta { + position: absolute; + right: 24mm; + bottom: 30mm; + left: 24mm; + padding-top: 6mm; + border-top: 0.5pt solid #334155; + color: #cbd5e1; font-size: 10.5pt; - color: #334155; line-height: 1.7; } .md-typeset .wp-cover .wp-cover-license { - margin-top: 24mm; + position: absolute; + right: 24mm; + bottom: 20mm; + left: 24mm; + color: #94a3b8; font-size: 8.5pt; - color: #64748b; } /* Le titre et le sous-titre écran sont remplacés par la page de garde */ @@ -240,8 +272,10 @@ } /* Typographie du livre blanc */ + /* Trait d'union ASCII pour la césure : le trait typographique (U+2010) manque à la police */ .md-typeset:has(> .wp-cover) { color: #1e293b; + hyphenate-character: "-"; } .md-typeset:has(> .wp-cover) p, @@ -252,15 +286,10 @@ /* Colonnes étroites et page de garde : le justifié y creuserait des blancs */ .md-typeset .wp-cover p, - .md-typeset .grid.cards.wp-figures p, - .md-typeset .grid.cards.wp-figures li { - text-align: center; - hyphens: manual; - } - .md-typeset .grid.cards.wp-figures p, .md-typeset .grid.cards.wp-figures li { text-align: left; + hyphens: manual; } .md-typeset .wp-cover ~ h2 { @@ -362,28 +391,6 @@ text-align: left; } - /* Page de garde : bandeau et filet d'accent */ - .md-typeset .wp-cover { - border-top: 5mm solid var(--otspi-primary); - min-height: 240mm; - } - - .md-typeset .wp-cover .wp-cover-title { - color: #0f2a6b; - font-size: 24pt; - font-weight: 800; - letter-spacing: -0.01em; - } - - .md-typeset .wp-cover .wp-cover-title::after { - content: ""; - display: block; - width: 22mm; - height: 1.2mm; - margin: 9mm auto 0; - background: #ffcc00; - } - /* Sommaire */ .md-typeset .wp-toc h3 { margin: 0 0 8mm; @@ -455,4 +462,14 @@ .md-typeset .wp-svg { min-width: 0; } + + .md-typeset .wp-diagram figcaption { + margin-top: 3mm; + color: #475569; + font-size: 8.5pt; + } + + .md-typeset .wp-fig-num { + color: #0f2a6b; + } } diff --git a/docs/white-paper/index.md b/docs/white-paper/index.md index 37118b5..4c5e3af 100644 --- a/docs/white-paper/index.md +++ b/docs/white-paper/index.md @@ -8,7 +8,7 @@ description: "White paper of the Open Trusted Service Provider Initiative: marke
-![OTSPI](../assets/logo-vertical.svg){ .wp-cover-logo } +![OTSPI](../assets/logo-vertical-dark.svg){ .wp-cover-logo }

White paper

A public-interest qualified trust service infrastructure for eIDAS 2.0

@@ -381,8 +381,9 @@ Any vendor of a signing solution, commercial or free, can rely on the service to ### 4.1. Certification hierarchy -
+
OTSPI qualified certification hierarchyThe offline OTSPI root CA, under a quorum, certifies the time-stamping intermediate CA, which certifies time-stamping units TSU-1 (site A) and TSU-2 (site B). It will also certify future qualified CAs for seals, signatures and attestations.OTSPI root CAoffline · air-gapped · M-of-N quorumTime-stamping intermediate CAoffline or restricted onlineFuture qualified CAsseal · signature · attestationsTime-stamping unit TSU-1online HSM — site ATime-stamping unit TSU-2online HSM — site B +
Figure 1 — OTSPI qualified certification hierarchy
@@ -390,11 +391,12 @@ Any vendor of a signing solution, commercial or free, can rely on the service to - Each **time-stamping unit (TSU)** has its own key, reserved exclusively for signing time-stamp tokens, generated and stored in a certified cryptographic module. - The usage period of TSU keys is shorter than the validity of their certificate, in accordance with ETSI EN 319 421, so that tokens issued at the end of the period remain verifiable. - The future **qualified CAs** for seals, signatures and attestations (see § 6.1, phase 5) will be attached to this same qualified root, each under an intermediate CA dedicated to a single use. -- The future TLS certificate service (see § 2.4) relies on **two roots distinct** from the qualified time-stamping root: a **WebTrust root**, intended for the trust stores of operating systems and browsers, and a **QWAC root**, listed on the European trusted list. They apply the same governance principles (air gap, quorum, ceremonies) and share no key with the time-stamping, seal or signature CAs. +- The future TLS certificate service (see § 2.4) relies on **two roots distinct** from the qualified time-stamping root ([figure 2](#figure-2)): a **WebTrust root**, intended for the trust stores of operating systems and browsers, and a **QWAC root**, listed on the European trusted list. They apply the same governance principles (air gap, quorum, ceremonies) and share no key with the time-stamping, seal or signature CAs. -
+
OTSPI TLS certification hierarchiesTwo separate roots: a WebTrust root for browser stores, and a QWAC root listed on the European trusted list. The WebTrust root certifies a DV sub-CA, which issues DV server certificates through instant ACME. A hybrid OV / QWAC sub-CA, holding a single key, is certified by the WebTrust root and, through cross-signing, by the QWAC root; it issues OV / QWAC certificates.cross-signingWebTrust rootOS and browser storesQWAC rootEuropean trusted listDV sub-CAWebTrust only · standard HSMHybrid OV / QWAC sub-CAone key · two CA certificatesDV server certificatesgeneral Web use · instant ACMEOV / QWAC server certificatesPSD2, eIDAS · ACME with account binding +
Figure 2 — OTSPI TLS certification hierarchies
diff --git a/mkdocs.yml b/mkdocs.yml index f72dab9..e7f5a42 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,7 +37,8 @@ theme: favicon: assets/favicon.svg icon: repo: fontawesome/brands/github - # Polices du système : aucune requête vers Google Fonts (l'adresse IP du visiteur y serait transmise) + # Pas de Google Fonts (l'adresse IP du visiteur y serait transmise) : la police Inter est + # auto-hébergée (stylesheets/fonts.css) font: false features: - navigation.tabs @@ -61,6 +62,7 @@ extra_javascript: - javascripts/analytics.js?v=2 extra_css: + - stylesheets/fonts.css - stylesheets/extra.css - stylesheets/print.css diff --git a/scripts/build_diagrams.py b/scripts/build_diagrams.py index a9cc949..debf1ed 100644 --- a/scripts/build_diagrams.py +++ b/scripts/build_diagrams.py @@ -112,8 +112,10 @@ def tls(t, uid): return "".join(parts) -def figure(svg): - return f'
\n{svg}\n
' +def figure(svg, number, title): + """Enveloppe un schéma dans une figure légendée et numérotée, ancrée sur #figure-N pour les renvois.""" + return (f'
\n{svg}\n' + f'
Figure {number} — {escape(title)}
\n
') def replace_block(text, name, block): @@ -126,8 +128,8 @@ def main(): for lang, path in (("fr", "docs/livre-blanc/index.md"), ("en", "docs/white-paper/index.md")): page = ROOT / path text = page.read_text(encoding="utf-8") - text = replace_block(text, "hierarchy", figure(hierarchy(TEXT[lang], f"{lang}-h"))) - text = replace_block(text, "tls", figure(tls(TEXT[lang], f"{lang}-t"))) + text = replace_block(text, "hierarchy", figure(hierarchy(TEXT[lang], f"{lang}-h"), 1, TEXT[lang]["h_title"])) + text = replace_block(text, "tls", figure(tls(TEXT[lang], f"{lang}-t"), 2, TEXT[lang]["t_title"])) page.write_text(text, encoding="utf-8") print(f"{path} : schémas régénérés") diff --git a/scripts/export_pdf.py b/scripts/export_pdf.py index 0c429e7..a033bce 100644 --- a/scripts/export_pdf.py +++ b/scripts/export_pdf.py @@ -88,15 +88,15 @@ def print_pdf(url, output): .dg-box{fill:#fff;stroke:#b8bcc4;stroke-width:1.5} .dg-root{fill:#e8eefc;stroke:#1a3d8f;stroke-width:2} .dg-future{fill:none;stroke:#6b7280;stroke-width:1.5;stroke-dasharray:6 5} -.dg-t{fill:#1f2937;font-size:12.5px;font-weight:700;font-family:sans-serif} -.dg-s{fill:#4b5563;font-size:12px;font-family:sans-serif} +.dg-t{fill:#1f2937;font-size:12.5px;font-weight:700;font-family:Inter,sans-serif} +.dg-s{fill:#4b5563;font-size:12px;font-family:Inter,sans-serif} .dg-edge,.dg-cross{fill:none;stroke-width:1.8} .dg-edge{stroke:#4b5563} .dg-dash{stroke-dasharray:5 5} .dg-cross{stroke:#1a3d8f;stroke-dasharray:7 5} .dg-arrow{fill:#4b5563} .dg-arrow-cross{fill:#1a3d8f} -.dg-label{fill:#1a3d8f;font-size:12px;font-weight:700;font-family:sans-serif} +.dg-label{fill:#1a3d8f;font-size:12px;font-weight:700;font-family:Inter,sans-serif} """ diff --git a/scripts/pdf-weasyprint.css b/scripts/pdf-weasyprint.css index b04169d..5cd7079 100644 --- a/scripts/pdf-weasyprint.css +++ b/scripts/pdf-weasyprint.css @@ -118,3 +118,27 @@ body { content: leader(".") target-counter(attr(href url), page); color: #64748b; } + +/* Signets du PDF : sections et annexes au premier niveau, sous-sections repliées. Le titre et le + sous-titre masqués n'en produisent pas : la page de garde et le titre du document en tiennent lieu. */ +.wp-cover ~ h1, +.wp-cover ~ h1 + h2 { + bookmark-level: none !important; +} + +.md-typeset .wp-toc h3, +.md-typeset .wp-cover ~ h2 { + bookmark-level: 1; +} + +.md-typeset .wp-cover ~ h2 { + bookmark-state: closed; +} + +.md-typeset .wp-cover ~ h3 { + bookmark-level: 2; +} + +.md-typeset .wp-cover ~ h4 { + bookmark-level: 3; +} From 619b5502159be04ece5c9c789337115612cb7d5e Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 09:54:37 +0200 Subject: [PATCH 03/11] =?UTF-8?q?ci:=20v=C3=A9rification=20des=20pull=20re?= =?UTF-8?q?quests=20(build=20strict,=20PDF,=20PDF/UA-1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mêmes étapes de construction que le déploiement, sans déploiement ni secret : build strict, export des PDF du livre blanc, validation veraPDF, liste des polices embarquées et PDF joints en artefact pour relecture. Co-authored-by: Claude --- .github/workflows/check-pr.yml | 69 ++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/check-pr.yml diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml new file mode 100644 index 0000000..becdeb1 --- /dev/null +++ b/.github/workflows/check-pr.yml @@ -0,0 +1,69 @@ +name: Vérification des pull requests (build et PDF) + +# Mêmes étapes de construction que le déploiement, sans déploiement ni secret : +# le site et les PDF du livre blanc sont validés avant fusion, et les PDF joints en artefact pour relecture. + +on: + pull_request: + branches: ["main"] + +concurrency: + group: "check-pr-${{ github.event.pull_request.number }}" + cancel-in-progress: true + +permissions: + contents: read + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt -r requirements-pdf.txt + sudo apt-get update + sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 poppler-utils + + - name: Build documentation + run: mkdocs build --strict + + - name: Export whitepaper PDF + run: python scripts/export_pdf.py + + - name: Cache veraPDF + uses: actions/cache@v4 + with: + path: ~/.cache/verapdf + key: verapdf-1.30.2 + + - name: Validate PDF/UA-1 + run: bash scripts/check_pdf_ua.sh + + # Polices embarquées : Inter pour le texte ; toute autre police signale un glyphe absent d'Inter + - name: List embedded fonts + run: | + for pdf in site/livre-blanc/otspi-livre-blanc.pdf site/white-paper/otspi-white-paper.pdf; do + echo "== $pdf" + pdffonts "$pdf" + done + + - name: Upload PDF + uses: actions/upload-artifact@v4 + with: + name: livre-blanc-pdf + path: | + site/livre-blanc/otspi-livre-blanc.pdf + site/white-paper/otspi-white-paper.pdf + retention-days: 14 From 89eec4b0e589e04e9bfdc8bdd607571922ab6fcc Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 09:56:33 +0200 Subject: [PATCH 04/11] fix(portail): police de repli Inter pour le texte du logo de couverture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sans Ubuntu Sans ni Liberation Sans (cas du runner GitHub), le texte du logo tombait sur DejaVu Sans, plus large : la signature débordait et était rognée sur la couverture du PDF. WeasyPrint trouve Inter via @font-face ; les navigateurs, qui affichent le SVG comme une image, restent inchangés. Co-authored-by: Claude --- docs/assets/logo-vertical-dark.svg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/assets/logo-vertical-dark.svg b/docs/assets/logo-vertical-dark.svg index f79ceb3..ceab211 100644 --- a/docs/assets/logo-vertical-dark.svg +++ b/docs/assets/logo-vertical-dark.svg @@ -25,10 +25,10 @@ stroke-width="14.40" stroke-linecap="round" stroke-linejoin="round" /> - + OTSPI - + OPEN TRUSTED SERVICE PROVIDER INITIATIVE From c08816df70324b6a1cbcfa524a93ee35b5000f27 Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 11:49:16 +0200 Subject: [PATCH 05/11] =?UTF-8?q?feat(portail):=20charte=20bleu=20nuit=20e?= =?UTF-8?q?t=20page=20d'accueil=20repens=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Palette personnalisée aux couleurs du logo : en-tête et onglets bleu nuit, liens bleus, accent bleu ciel en thème sombre. - Titres sombres et gras sur tout le site, encadrés plus lisibles, cartes plus sobres ; plus de mention « Made with Material for MkDocs ». - Accueil : bandeau pleine largeur (overrides/home.html), engagements illustrés de pictogrammes au lieu d'emojis, cartes de documentation en deux colonnes, encadré [!NOTE] et liste réparés. - Organigramme de gouvernance en SVG local (scripts/build_diagrams.py), lisible dans les deux thèmes : le portail ne charge plus Mermaid depuis un service tiers. - Titres et navigation en casse française, sans emojis. Co-authored-by: Claude --- docs/cadrage/index.md | 6 +- docs/index.md | 134 +++++------- docs/reunions/index.md | 6 +- docs/stylesheets/extra.css | 436 ++++++++++++++++++++++++------------- mkdocs.yml | 39 ++-- overrides/home.html | 30 +++ scripts/build_diagrams.py | 63 +++++- 7 files changed, 457 insertions(+), 257 deletions(-) create mode 100644 overrides/home.html diff --git a/docs/cadrage/index.md b/docs/cadrage/index.md index f03d2d2..59896ee 100644 --- a/docs/cadrage/index.md +++ b/docs/cadrage/index.md @@ -6,7 +6,7 @@ Ce dossier rassemble l'ensemble des documents de cadrage stratégique, réglemen --- -## 🏛️ Le Socle de Conformité Initial (Corpus d'Audit) +## Le socle de conformité initial (corpus d'audit) 1. **[Cadre Général des Politiques de Certification et Pratiques (CP/CPS)](cp-cps-cadre.md)** : - Document maître conforme à la **RFC 3647**, à l'**ETSI EN 319 401**, à l'**ETSI EN 319 411-1 / 411-2** et aux exigences **WebTrust / CA/Browser Forum** ; @@ -28,7 +28,7 @@ Ce dossier rassemble l'ensemble des documents de cadrage stratégique, réglemen --- -## 🧭 Documents Complémentaires de Cadrage +## Documents complémentaires de cadrage - **[Livre blanc](../livre-blanc/index.md)** : vision et modèle d'intérêt général à but non lucratif inspiré de l'ISRG / Let's Encrypt appliqué aux services qualifiés eIDAS. - **[Manifeste pour une identité numérique libre et ouverte](https://www.otspi.org/manifeste.html)** : dix principes ouverts à la signature des personnes et des organisations. @@ -37,7 +37,7 @@ Ce dossier rassemble l'ensemble des documents de cadrage stratégique, réglemen --- -## 🔒 Principes d'Auditabilité et Sécurité +## Principes d'auditabilité et de sécurité - Tous les documents de cadrage normatifs sont publics et consultables en libre accès dans le cadre de la redevabilité publique intégrale ; - Les seules exceptions concernent les secrets cryptographiques matériels (clés sous séquestre HSM) et les embargos temporaires de sécurité sur les vulnérabilités non corrigées (*Coordinated Vulnerability Disclosure*). diff --git a/docs/index.md b/docs/index.md index 7f54fdb..18242f1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,106 +1,95 @@ --- title: "OTSPI — Open Trusted Service Provider Initiative" description: "Portail officiel de gouvernance, statuts, conformité et documentation d'intérêt général pour la confiance numérique européenne." +template: home.html hide: - navigation - toc --- -
+ -:material-shield-check: Association d'intérêt général (loi 1901) en cours de constitution +
-# Open Trusted Service Provider Initiative +
+:material-bank-outline:{ .otspi-feature__icon } -

-Construire, opérer et pérenniser des infrastructures de confiance numérique ouvertes, souveraines et universellement accessibles, conformes aux standards eIDAS 2.0, ETSI et WebTrust sous gouvernance strictement désintéressée. -

+

100 % intérêt général

-
-[:material-book-open-page-variant: Consulter le projet de statuts](statuts/statuts-association.md){ .md-button .md-button--primary } -[:material-draw-pen: Signer le Manifeste](https://www.otspi.org/manifeste.html){ .md-button } -[:material-github: Dépôt GitHub](https://github.com/otspi/organisation){ .md-button target="_blank" } +Gestion désintéressée, bénévolat strict des dirigeants, inaliénabilité des logiciels libres et des marques.
-
+
+:material-certificate-outline:{ .otspi-feature__icon } -
+

eIDAS 2.0 et ETSI

-
-🏛️ -
100% Intérêt Général
-

Gestion désintéressée, bénévolat strict des dirigeants, inaliénabilité des logiciels libres et des marques.

+Services de confiance qualifiés : horodatage, signature, scellement et archivage probatoire sous audit CAB.
-
-🇪🇺 -
eIDAS 2.0 & ETSI
-

Services de confiance qualifiés : horodatage, signature, scellement et archivage probatoire sous audit CAB.

-
+
+:material-scale-balance:{ .otspi-feature__icon } -
-⚖️ -
Séparation des Devoirs
-

Indépendance absolue du Comité des Politiques de Confiance (CPC) vis-à-vis du Bureau exécutif.

-
+

Séparation des devoirs

-
-🔍 -
Redevabilité Intégrale
-

Transparence totale des PV, budgets prévisionnels, rapports d'audit et politiques de certification (CP/CPS).

+Indépendance absolue du Comité des Politiques de Confiance (CPC) vis-à-vis du Bureau exécutif.
+
+:material-magnify-scan:{ .otspi-feature__icon } + +

Redevabilité intégrale

+ +Transparence totale des PV, budgets prévisionnels, rapports d'audit et politiques de certification (CP/CPS).
---- +
-## 📚 Explorer la Documentation et les Textes Fondateurs +## Explorer la documentation et les textes fondateurs -
+
-- :material-scale-balance:{ .lg .middle } __Statuts & Gouvernance__ +- :material-scale-balance:{ .lg .middle } __Statuts et gouvernance__ --- Le projet de statuts constitutifs, soumis au vote de l'assemblée générale constitutive, fondé sur l'intérêt général (CGI art. 200 & 238 bis), la gestion désintéressée et la séparation stricte des devoirs. [:octicons-arrow-right-24: Consulter le projet de statuts](statuts/statuts-association.md) - [:octicons-arrow-right-24: Charte d'Éthique & Déontologie](gouvernance/charte-ethique.md) - [:octicons-arrow-right-24: Organisation Technique & CPC](gouvernance/comite-technique.md) + [:octicons-arrow-right-24: Charte d'éthique et de déontologie](gouvernance/charte-ethique.md) + [:octicons-arrow-right-24: Organisation technique et CPC](gouvernance/comite-technique.md) -- :material-book-open-page-variant:{ .lg .middle } __Règlement Intérieur__ +- :material-book-open-page-variant:{ .lg .middle } __Règlement intérieur__ --- Fonctionnement opérationnel : cursus d'habilitation des Officiers d'Autorité, clés matérielles FIPS/ANSSI et règles de fonctionnement de l'association. - [:octicons-arrow-right-24: Règlement Intérieur](reglement-interieur/reglement-interieur.md) + [:octicons-arrow-right-24: Règlement intérieur](reglement-interieur/reglement-interieur.md) -- :material-certificate:{ .lg .middle } __Socle de Conformité (TSP / PKI)__ +- :material-certificate:{ .lg .middle } __Socle de conformité (TSP / PKI)__ --- Le référentiel d'audit initial conforme aux normes eIDAS, ETSI et WebTrust : Cadre CP/CPS (RFC 3647), Politique de Sécurité (PSSI) et Fin d'Activité. - [:octicons-arrow-right-24: Cadre Général CP/CPS](cadrage/cp-cps-cadre.md) - [:octicons-arrow-right-24: Politique de Sécurité (PSSI ISO 27001)](cadrage/pssi.md) - [:octicons-arrow-right-24: Plan de Fin d'Activité (Termination Plan)](cadrage/termination-plan.md) + [:octicons-arrow-right-24: Cadre général CP/CPS](cadrage/cp-cps-cadre.md) + [:octicons-arrow-right-24: Politique de sécurité (PSSI ISO 27001)](cadrage/pssi.md) + [:octicons-arrow-right-24: Plan de fin d'activité (Termination Plan)](cadrage/termination-plan.md) -- :material-file-document-outline:{ .lg .middle } __Démarches Légales & Fiscales__ +- :material-file-document-outline:{ .lg .middle } __Démarches légales et fiscales__ --- Dossier juridique complet : Procès-Verbal de l'AG Constitutive, demande formelle de rescrit fiscal mécénat DGFIP et guide d'immatriculation. - [:octicons-arrow-right-24: Procès-Verbal Constitutif (Modèle)](administratif/pv-ag-constitutive-modele.md) - [:octicons-arrow-right-24: Dossier de Rescrit Fiscal DGFIP](administratif/rescrit-fiscal-mecenat.md) - [:octicons-arrow-right-24: Guide Préfecture (RNA, SIRET)](administratif/declaration-prefecture.md) + [:octicons-arrow-right-24: Procès-verbal constitutif (modèle)](administratif/pv-ag-constitutive-modele.md) + [:octicons-arrow-right-24: Dossier de rescrit fiscal DGFIP](administratif/rescrit-fiscal-mecenat.md) + [:octicons-arrow-right-24: Guide préfecture (RNA, SIRET)](administratif/declaration-prefecture.md)
---- - -## 🏛️ La Confiance Numérique comme Bien Commun +## La confiance numérique comme bien commun L'association **« Open Trusted Service Provider Initiative » (OTSPI)**, en cours de constitution, a pour but d'intérêt général de lever les barrières économiques, techniques, administratives et éducatives à la sécurité, à la confidentialité et à la confiance numérique dans les communications électroniques mondiales. @@ -110,57 +99,32 @@ L'association **« Open Trusted Service Provider Initiative » (OTSPI)**, en cou * **Gestion strictement désintéressée** : Bénévolat strict des dirigeants, inaliénabilité des dépôts logiciels libres et des marques, absence de distribution d'actifs et réinvestissement intégral des excédents dans la mission d'intérêt général. * **Garantie de continuité opérationnelle** : Un fonds de réserve sanctuarisé garantit l'exécution intégrale du plan de fin d'activité (*Termination Plan*, maintien des listes de révocation CRL/OCSP pendant au moins 10 ans). ---- - -## ⚖️ Architecture de Gouvernance et Ségrégation des Fonctions +## Architecture de gouvernance et ségrégation des fonctions La gouvernance d'OTSPI applique une séparation stricte des devoirs conformément aux normes ETSI EN 319 401 et WebTrust : -```mermaid -flowchart TD - AG["Assemblée Générale (Titulaires & Sympathisants)"] --> CA["Conseil d'Administration (2 à 9 membres)"] - AG -.->|"Confirmation des nominations"| CPC["Comité des Politiques de Confiance (CPC / PMA)"] - CA --> Bureau["Bureau (Direction Opérationnelle - Executive Management)
Président, Trésorier, Secrétaire Général"] - - subgraph Normatif["Autorité Normative Cryptographique (Indépendante)"] - CPC -->|"Avis conforme CP/CPS & Cérémonies"| TSC["Comité Technique & Ingénierie (TSC)"] - CPC -->|"Désignation (1 an)"| RSSI["RSSI / CISO"] - CPC -->|"Habilitation & Contrôle"| OA["Officiers d'Autorité & Key Custodians"] - end - - subgraph Operationnel["Direction Opérationnelle & Exploitation"] - Bureau -->|"Mise en œuvre PSSI & Moyens"| TSC - Bureau -->|"Relations de gouvernance"| ANSSI["Autorités de Contrôle & Auditeurs (CAB)"] - end - - classDef blue fill:#2563eb,stroke:#1d4ed8,color:#fff; - classDef green fill:#059669,stroke:#047857,color:#fff; - classDef orange fill:#d97706,stroke:#b45309,color:#fff; - class AG,CA,Bureau blue; - class CPC,RSSI,OA green; - class TSC,ANSSI orange; -``` + +
+Organisation de la gouvernance d'OTSPIL'assemblée générale élit le conseil d'administration, qui désigne le bureau (direction opérationnelle) ; le bureau assure les relations avec les autorités de contrôle et les auditeurs. L'assemblée générale confirme aussi les nominations au comité des politiques de confiance (CPC), autorité normative indépendante du bureau, qui désigne le RSSI pour un an, habilite et contrôle les officiers d'autorité et rend un avis conforme sur les travaux du comité technique ; le bureau fournit à ce comité ses moyens.DIRECTION OPÉRATIONNELLEAUTORITÉ NORMATIVE INDÉPENDANTEconfirmation des nominationsAssemblée généraletitulaires et sympathisantsConseil d'administration2 à 9 membresBureauprésidence · trésorerie · secrétariatAutorités de contrôleet auditeurs (CAB)Comité des politiques de confianceCPC / PMAComité technique (TSC)avis CPC · moyens du BureauRSSI / CISOdésigné par le CPC, 1 anOfficiers d'autoritéet gardiens de clés +
+ 1. **Direction Opérationnelle (*Executive Management*)** : Assurée par le Bureau issu du Conseil d'Administration. Il porte la responsabilité juridique et financière, alloue les ressources de sécurité et assure les relations de gouvernance. 2. **Comité des Politiques de Confiance (CPC / PMA)** : Organe collégial indépendant garant de la rigueur cryptographique et normative. Il approuve les CP/CPS, valide les cérémonies de clés, supervise l'habilitation des Officiers d'Autorité et désigne le RSSI. **L'appartenance au Bureau est strictement incompatible avec le CPC.** 3. **Officiers d'Autorité & Gardiens de Clés (*Key Custodians*)** : Opérateurs habilités assurant sous contrôle à quatre yeux (*Dual Control*) les cérémonies de clés et disposant d'un pouvoir autonome de **révocation d'urgence** sans délai. ---- - -## 🔍 Redevabilité Publique Intégrale (*Public Accountability*) +## Redevabilité publique intégrale (*Public Accountability*) OTSPI applique un principe de **transparence radicale et d'auditabilité publique** : + - Ordres du jour, débats et comptes-rendus publics des réunions (CA, Bureau, Assemblées Générales, comités techniques) ; - Budgets prévisionnels, comptes annuels certifiés, rapports moraux et rapports d'évaluation d'audit (ETSI / eIDAS / WebTrust) ; - Dépôt public de l'ensemble des sources et des documents de gouvernance sur [GitHub : `otspi/organisation`](https://github.com/otspi/organisation). -> [!NOTE] -> **Réserves de protection légitimes :** -> Conformément à notre projet de statuts, les seules exceptions à la publication intégrale concernent la **protection des données personnelles (RGPD)** de nos membres et votants (données nominatives caviardées), les **secrets cryptographiques matériels** (clés protégées sous HSM) et l'**embargo temporaire de sécurité** lors du traitement coordonné de vulnérabilités critiques (*Coordinated Vulnerability Disclosure — CVD*). - ---- +!!! note "Réserves de protection légitimes" + Conformément à notre projet de statuts, les seules exceptions à la publication intégrale concernent la **protection des données personnelles (RGPD)** de nos membres et votants (données nominatives caviardées), les **secrets cryptographiques matériels** (clés protégées sous HSM) et l'**embargo temporaire de sécurité** lors du traitement coordonné de vulnérabilités critiques (*Coordinated Vulnerability Disclosure — CVD*). -## 📬 Contact & Adresses Officielles +## Contact et adresses officielles - **Contact unique (Informations, Partenariats, Sécurité)** : `contact@otspi.org` *(Pour le signalement de vulnérabilités / CVD : indiquer `[Sécurité]` en objet ou utiliser les [GitHub Private Security Advisories](https://github.com/otspi/organisation/security/advisories))* diff --git a/docs/reunions/index.md b/docs/reunions/index.md index 341658d..7cd1ae1 100644 --- a/docs/reunions/index.md +++ b/docs/reunions/index.md @@ -8,7 +8,7 @@ Toutes les réunions formelles de gouvernance font l'objet d'un ordre du jour pr --- -## 🏛️ Typologie des Réunions +## Typologie des réunions 1. **Assemblées Générales (AG)** : - Assemblée Générale Ordinaire (AGO) : Approbation des comptes, rapport moral, budget, renouvellement du CA, confirmation des membres du CPC. @@ -22,7 +22,7 @@ Toutes les réunions formelles de gouvernance font l'objet d'un ordre du jour pr --- -## 🛡️ Règles de Publication et Protection RGPD / Sécurité +## Règles de publication et protection RGPD / sécurité Avant toute publication publique d'un compte-rendu : @@ -35,7 +35,7 @@ Avant toute publication publique d'un compte-rendu : --- -## 📝 Modèle Type de Compte-Rendu Public +## Modèle type de compte-rendu public ```markdown # Compte-Rendu : [Conseil d'Administration / CPC / AG / TSC] du [AAAA-MM-JJ] diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 68ecc64..bb576cc 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -1,228 +1,364 @@ /* ========================================================================== - OTSPI Custom Styling — Modern, Trustworthy & Accessible + OTSPI — charte du portail + Bleu nuit du logo (#0b1120), bleu institutionnel, bleu ciel et jaune d'accent. ========================================================================== */ :root { + --otspi-navy: #0b1120; + --otspi-navy-2: #111a33; --otspi-primary: #1e40af; --otspi-primary-light: #3b82f6; - --otspi-accent: #0ea5e9; - --otspi-success: #10b981; - --otspi-warning: #f59e0b; + --otspi-sky: #38bdf8; + --otspi-gold: #fbbf24; --otspi-card-bg: #ffffff; - --otspi-card-border: rgba(226, 232, 240, 0.8); - --otspi-card-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.05); - --otspi-card-hover-shadow: 0 12px 28px -4px rgba(30, 64, 175, 0.12); + --otspi-card-border: #e2e8f0; + --otspi-card-shadow: 0 1px 2px rgba(15, 23, 42, 0.04), 0 4px 16px -6px rgba(15, 23, 42, 0.08); + --otspi-card-hover-shadow: 0 10px 28px -8px rgba(30, 64, 175, 0.22); +} + +/* Palette personnalisée de Material (primary: custom, accent: custom) */ +:root > * { + --md-primary-fg-color: #1e40af; + --md-primary-fg-color--light: #3b82f6; + --md-primary-fg-color--dark: #0b1120; + --md-primary-bg-color: #ffffff; + --md-primary-bg-color--light: rgba(255, 255, 255, 0.72); + --md-accent-fg-color: #0369a1; + --md-accent-fg-color--transparent: rgba(3, 105, 161, 0.1); + --md-typeset-a-color: #1d4ed8; } [data-md-color-scheme="slate"] { - --otspi-card-bg: #1e293b; - --otspi-card-border: rgba(51, 65, 85, 0.7); - --otspi-card-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.25); - --otspi-card-hover-shadow: 0 12px 28px -4px rgba(14, 165, 233, 0.15); + --md-hue: 225; + --otspi-card-bg: #161f36; + --otspi-card-border: rgba(148, 163, 184, 0.18); + --otspi-card-shadow: 0 4px 20px -6px rgba(0, 0, 0, 0.4); + --otspi-card-hover-shadow: 0 12px 28px -6px rgba(56, 189, 248, 0.18); +} + +[data-md-color-scheme="slate"] > * { + --md-accent-fg-color: #38bdf8; + --md-accent-fg-color--transparent: rgba(56, 189, 248, 0.12); +} + +/* -------------------------------------------------------------------------- + En-tête et onglets : bleu nuit du logo + -------------------------------------------------------------------------- */ +.md-header, +.md-tabs { + background-color: var(--otspi-navy); +} + +.md-header { + box-shadow: none; + border-bottom: 1px solid rgba(148, 163, 184, 0.14); +} + +.md-header--shadow { + box-shadow: 0 2px 12px rgba(2, 6, 23, 0.35); +} + +.md-header__button.md-logo { + display: flex !important; + align-items: center; + margin-right: 0.5rem; +} + +.md-header__button.md-logo img, +.md-header__button.md-logo svg { + height: 1.6rem !important; + width: auto !important; +} + +.md-tabs__link { + font-weight: 500; + opacity: 0.78; +} + +.md-tabs__item--active .md-tabs__link, +.md-tabs__link:hover { + opacity: 1; +} + +.md-tabs__item--active .md-tabs__link { + color: #ffffff; + box-shadow: inset 0 -2px 0 var(--otspi-sky); +} + +.md-search__form { + background-color: rgba(148, 163, 184, 0.14); + border-radius: 8px; +} + +/* -------------------------------------------------------------------------- + Titres : hiérarchie nette, sans le gris clair et la graisse légère de Material + -------------------------------------------------------------------------- */ +.md-typeset h1 { + color: var(--md-default-fg-color); + font-weight: 800; + line-height: 1.2; + letter-spacing: -0.02em; +} + +.md-typeset h2 { + font-weight: 700; + letter-spacing: -0.01em; +} + +.md-typeset h3 { + font-weight: 700; } /* -------------------------------------------------------------------------- - Hero Section + Accueil — bandeau pleine largeur (overrides/home.html) -------------------------------------------------------------------------- */ +/* Fond uni : le logo, qui porte son propre fond #0b1120, s'y fond sans cadre visible */ .otspi-hero { - text-align: center; - padding: clamp(2rem, 5vw, 3.5rem) 1rem clamp(1.5rem, 4vw, 2.5rem); - margin-bottom: 1.5rem; - position: relative; + background: var(--otspi-navy); + color: #e2e8f0; } -.otspi-badge { - display: inline-flex; +[data-md-color-scheme="slate"] .otspi-hero { + border-bottom: 1px solid rgba(148, 163, 184, 0.16); +} + +.otspi-hero__inner { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 2rem; align-items: center; - gap: 0.5rem; - padding: 0.35rem 0.9rem; - border-radius: 9999px; - font-size: clamp(0.72rem, 2vw, 0.82rem); - font-weight: 600; - letter-spacing: 0.025em; - background-color: rgba(59, 130, 246, 0.1); - color: var(--otspi-primary-light); - border: 1px solid rgba(59, 130, 246, 0.25); - margin-bottom: 1.25rem; + padding: clamp(2.2rem, 6vw, 4rem) 0.8rem clamp(2.4rem, 6vw, 4.2rem); +} + +.otspi-hero__kicker { + margin: 0 0 1rem; + color: var(--otspi-sky); + font-size: 0.68rem; + font-weight: 700; + letter-spacing: 0.16em; text-transform: uppercase; - max-width: 100%; } -.otspi-hero h1 { - font-size: clamp(1.65rem, 5vw + 0.3rem, 2.5rem) !important; - font-weight: 800 !important; - line-height: 1.25 !important; - margin-bottom: 1rem !important; - letter-spacing: -0.02em; +.otspi-hero__title { + margin: 0; + color: #ffffff; + font-size: clamp(1.7rem, 4.2vw, 2.7rem); + font-weight: 800; + line-height: 1.12; + letter-spacing: -0.025em; } -.otspi-hero .subtitle { - font-size: clamp(0.95rem, 2vw + 0.2rem, 1.15rem); - line-height: 1.6; - max-width: 48rem; - margin: 0 auto 1.5rem; - color: var(--md-default-fg-color--light); +.otspi-hero__title::after { + content: ""; + display: block; + width: 3.2rem; + height: 0.22rem; + margin-top: 1.1rem; + border-radius: 1px; + background: var(--otspi-gold); +} + +.otspi-hero__lead { + max-width: 38rem; + margin: 1.2rem 0 0; + color: #cbd5e1; + font-size: clamp(0.85rem, 1.6vw, 0.98rem); + line-height: 1.65; +} + +.otspi-hero__lead strong { + color: #ffffff; } -.otspi-hero-actions { +.otspi-hero__actions { display: flex; - justify-content: center; - gap: 0.85rem; flex-wrap: wrap; - margin-top: 1.25rem; + gap: 0.7rem; + margin-top: 1.8rem; +} + +/* Hors de .md-typeset, Material ne donne aucun style de bouton : on les pose ici */ +.otspi-hero .md-button { + display: inline-block; + margin: 0; + border: 0.1rem solid rgba(226, 232, 240, 0.45); + color: #ffffff; + font-size: 0.72rem; + line-height: 1.4; + text-decoration: none; +} + +.otspi-hero .md-button:hover, +.otspi-hero .md-button:focus-visible { + border-color: #ffffff; + background-color: rgba(255, 255, 255, 0.08); + color: #ffffff; +} + +.otspi-hero .md-button--primary { + border-color: var(--otspi-sky) !important; + background-color: var(--otspi-sky) !important; + color: var(--otspi-navy) !important; + box-shadow: none !important; +} + +.otspi-hero .md-button--primary:hover, +.otspi-hero .md-button--primary:focus-visible { + border-color: #7dd3fc !important; + background-color: #7dd3fc !important; } -@media screen and (max-width: 600px) { - .otspi-hero-actions { - flex-direction: column; - align-items: stretch; - max-width: 300px; - margin: 1.25rem auto 0; +.otspi-hero__logo { + width: 13rem; + height: auto; +} + +@media screen and (max-width: 59.9844em) { + .otspi-hero__inner { + grid-template-columns: minmax(0, 1fr); } - .otspi-hero-actions .md-button { - width: 100%; + + .otspi-hero__logo { + display: none; + } +} + +@media screen and (max-width: 29.9844em) { + .otspi-hero__actions .md-button { + flex: 1 1 100%; text-align: center; - justify-content: center; } } /* -------------------------------------------------------------------------- - Key Stats / Value Pillars + Accueil — quatre engagements -------------------------------------------------------------------------- */ -.otspi-stats-grid { +.otspi-features { display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); - gap: 1.25rem; - margin: 2.5rem 0 3.5rem; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr)); + gap: 1rem; + margin: 0.4rem 0 2.6rem; } -.otspi-stat-card { - background: var(--otspi-card-bg); +.md-typeset .otspi-feature { + padding: 1.2rem 1.2rem 1rem; border: 1px solid var(--otspi-card-border); border-radius: 12px; - padding: 1.5rem 1.25rem; - text-align: center; + background: var(--otspi-card-bg); box-shadow: var(--otspi-card-shadow); - transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease; + font-size: 0.72rem; + line-height: 1.55; } -.otspi-stat-card:hover { - transform: translateY(-3px); - border-color: var(--otspi-primary-light); - box-shadow: var(--otspi-card-hover-shadow); +.md-typeset .otspi-feature p { + margin: 0; + color: var(--md-default-fg-color--light); } -.otspi-stat-icon { - font-size: 1.75rem; - margin-bottom: 0.5rem; - display: inline-block; +.md-typeset .otspi-feature .otspi-feature__icon { + display: inline-flex; + width: 2.2rem; + height: 2.2rem; + margin-bottom: 0.8rem; + padding: 0.45rem; + border-radius: 10px; + background: var(--md-accent-fg-color--transparent); + color: var(--otspi-primary); } -.otspi-stat-title { - font-size: 1.05rem; - font-weight: 700; - margin-bottom: 0.35rem; - color: var(--md-default-fg-color); +.md-typeset .otspi-feature .otspi-feature__icon svg { + width: 100%; + height: 100%; + max-height: none; } -.otspi-stat-desc { +.md-typeset .otspi-feature p.otspi-feature__title { + margin: 0 0 0.35rem; + color: var(--md-default-fg-color); font-size: 0.85rem; - line-height: 1.4; - color: var(--md-default-fg-color--light); - margin: 0; + font-weight: 700; +} + +[data-md-color-scheme="slate"] .md-typeset .otspi-feature .otspi-feature__icon { + color: var(--otspi-sky); +} + +/* Titres de section de l'accueil */ +.md-content:has(.otspi-features) .md-typeset h2 { + margin-top: 2.4rem; + padding-top: 1.6rem; + border-top: 1px solid var(--md-default-fg-color--lightest); +} + +.md-content:has(.otspi-features) .md-typeset .otspi-features + h2 { + border-top: none; + padding-top: 0; +} + +/* Cartes de documentation : deux colonnes au plus, pas de carte orpheline */ +.md-typeset .grid.cards.otspi-docs { + grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr)); } /* -------------------------------------------------------------------------- - Material for MkDocs Cards Customization + Cartes Material -------------------------------------------------------------------------- */ .md-typeset .grid.cards > ul > li { background: var(--otspi-card-bg); border: 1px solid var(--otspi-card-border); - border-radius: 14px; - padding: 1.75rem; + border-radius: 12px; + padding: 1.4rem 1.5rem; box-shadow: var(--otspi-card-shadow); - transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), - box-shadow 0.25s cubic-bezier(0.16, 1, 0.3, 1), - border-color 0.25s ease; - position: relative; + transition: box-shadow 0.2s ease, border-color 0.2s ease; } .md-typeset .grid.cards > ul > li:hover { - transform: translateY(-4px); box-shadow: var(--otspi-card-hover-shadow); border-color: var(--otspi-primary-light); } .md-typeset .grid.cards > ul > li > hr { - margin: 1rem 0; - opacity: 0.2; + margin: 0.8rem 0; + opacity: 0.4; +} + +.md-typeset .grid.cards .lg { + color: var(--otspi-primary); +} + +[data-md-color-scheme="slate"] .md-typeset .grid.cards .lg { + color: var(--otspi-sky); } /* -------------------------------------------------------------------------- - Custom Buttons + Boutons -------------------------------------------------------------------------- */ .md-button { border-radius: 8px !important; font-weight: 600 !important; letter-spacing: 0.01em; - padding: 0.65em 1.5em !important; - transition: all 0.2s ease !important; + padding: 0.6em 1.3em !important; + transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease !important; } .md-button--primary { background-color: var(--otspi-primary) !important; border-color: var(--otspi-primary) !important; - box-shadow: 0 4px 14px rgba(30, 64, 175, 0.25) !important; } .md-button--primary:hover { - background-color: var(--otspi-primary-light) !important; - border-color: var(--otspi-primary-light) !important; - transform: translateY(-1px); - box-shadow: 0 6px 20px rgba(30, 64, 175, 0.35) !important; + background-color: #1e3a8a !important; + border-color: #1e3a8a !important; } /* -------------------------------------------------------------------------- - Mermaid Diagrams & Admonitions + Encadrés : Material les compose plus petit que le corps du texte -------------------------------------------------------------------------- */ -.mermaid { - background: var(--otspi-card-bg); - border: 1px solid var(--otspi-card-border); - border-radius: 12px; - padding: 1.5rem 1rem; - box-shadow: var(--otspi-card-shadow); - margin: 1.5rem 0 !important; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - max-width: 100%; -} - -.md-typeset .admonition { +.md-typeset .admonition, +.md-typeset details { border-radius: 10px; - box-shadow: var(--otspi-card-shadow); -} - -/* -------------------------------------------------------------------------- - Navigation & Header Refinements - -------------------------------------------------------------------------- */ -.md-header { - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.md-header__button.md-logo { - display: flex !important; - align-items: center; - margin-right: 0.5rem; -} - -.md-header__button.md-logo img, -.md-header__button.md-logo svg { - height: 1.6rem !important; - width: auto !important; -} - -.md-tabs { - border-bottom: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: none; + font-size: 0.72rem; } /* -------------------------------------------------------------------------- @@ -308,12 +444,6 @@ color: var(--md-default-fg-color--light); } -/* Encadrés lisibles : Material les compose plus petit que le corps du texte */ -.md-typeset:has(> .wp-cover) .admonition, -.md-typeset:has(> .wp-cover) details { - font-size: 0.72rem; -} - /* Fiche d'identification du document : tableau clé / valeur sans ligne d'en-tête */ .md-typeset .wp-meta thead { display: none; @@ -412,6 +542,23 @@ margin: 0 auto; } +.md-typeset .wp-svg--wide { + max-width: 940px; +} + +/* Regroupements de l'organigramme de gouvernance (accueil) */ +.wp-svg .dg-group { + fill: var(--md-default-fg-color--lightest); + stroke: none; +} + +.wp-svg .dg-glabel { + fill: var(--md-default-fg-color--light); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.08em; +} + .wp-svg .dg-box { fill: var(--md-default-bg-color); stroke: var(--md-default-fg-color--lighter); @@ -535,9 +682,6 @@ border-top-color: #8fb4ff; } -[data-md-color-scheme="slate"] .otspi-badge { - color: #9cc0ff; -} [data-md-color-scheme="slate"] .md-typeset a:not(.md-button):not(.headerlink):not(.md-annotation__index) { color: #8fb4ff; diff --git a/mkdocs.yml b/mkdocs.yml index e7f5a42..708c4c7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,20 +16,21 @@ theme: name: material custom_dir: overrides language: fr + # Couleurs de la charte OTSPI (bleu nuit du logo) : voir docs/stylesheets/extra.css palette: # Mode clair - media: "(prefers-color-scheme: light)" scheme: default - primary: indigo - accent: indigo + primary: custom + accent: custom toggle: icon: material/brightness-7 name: Passer au mode sombre # Mode sombre - media: "(prefers-color-scheme: dark)" scheme: slate - primary: indigo - accent: indigo + primary: custom + accent: custom toggle: icon: material/brightness-4 name: Passer au mode clair @@ -100,6 +101,8 @@ markdown_extensions: permalink: true extra: + # Pas de mention « Made with Material for MkDocs » en pied de page + generator: false social: - icon: fontawesome/brands/github link: https://github.com/otspi/organisation @@ -113,30 +116,30 @@ extra: nav: - Accueil: index.md - - Livre Blanc: + - Livre blanc: - Livre blanc (FR): livre-blanc/index.md - White Paper (EN): white-paper/index.md - Historique des versions: livre-blanc/historique.md - - Statuts & Gouvernance: + - Statuts et gouvernance: - Projet de statuts: statuts/statuts-association.md - - Charte d'Éthique: gouvernance/charte-ethique.md - - Organisation Technique & CPC: gouvernance/comite-technique.md - - Règlement Intérieur: - - Règlement Intérieur: reglement-interieur/reglement-interieur.md - - Démarches Administratives: - - Procès-Verbal Constitutif (Modèle): administratif/pv-ag-constitutive-modele.md - - Demande de Rescrit Fiscal DGFIP: administratif/rescrit-fiscal-mecenat.md + - Charte d'éthique: gouvernance/charte-ethique.md + - Organisation technique et CPC: gouvernance/comite-technique.md + - Règlement intérieur: + - Règlement intérieur: reglement-interieur/reglement-interieur.md + - Démarches administratives: + - Procès-verbal constitutif (modèle): administratif/pv-ag-constitutive-modele.md + - Demande de rescrit fiscal DGFIP: administratif/rescrit-fiscal-mecenat.md - Dossier de constitution: administratif/dossier-constitution.md - Résolution d'amorçage (CPC et Bureau): administratif/resolution-transitoire.md - - Guide Démarches Préfecture (RNA, SIRET): administratif/declaration-prefecture.md - - Socle Technique & Audit (TSP / PKI): + - Démarches en préfecture (RNA, SIRET): administratif/declaration-prefecture.md + - Socle technique et audit (TSP / PKI): - Vue d'ensemble: cadrage/index.md - Cadre CP/CPS (RFC 3647): cadrage/cp-cps-cadre.md - - Politique de Sécurité des SI (PSSI): cadrage/pssi.md - - Plan de Fin d'Activité (Termination Plan): cadrage/termination-plan.md + - Politique de sécurité des SI (PSSI): cadrage/pssi.md + - Plan de fin d'activité (Termination Plan): cadrage/termination-plan.md - Arc d'OID et numéro IANA: cadrage/oid-arc.md - Demandes de devis (audit, HSM, hébergement): cadrage/demandes-de-devis.md - Transparence: - Hébergements: reunions/hebergements.md - Hosting transparency (EN): reunions/hosting.md - - Registre des Réunions & PV: reunions/index.md + - Registre des réunions et PV: reunions/index.md diff --git a/overrides/home.html b/overrides/home.html new file mode 100644 index 0000000..39b6507 --- /dev/null +++ b/overrides/home.html @@ -0,0 +1,30 @@ +{% extends "main.html" %} + +{#- Page d'accueil : bandeau pleine largeur sous l'en-tête, puis le contenu de docs/index.md + sans le titre automatique ni les boutons d'édition. -#} + +{% block hero %} +
+ +
+{% endblock %} + +{% block content %} + {{ page.content }} +{% endblock %} diff --git a/scripts/build_diagrams.py b/scripts/build_diagrams.py index debf1ed..dc1cced 100644 --- a/scripts/build_diagrams.py +++ b/scripts/build_diagrams.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 # SPDX-License-Identifier: EUPL-1.2 -"""Génère les deux schémas du livre blanc (hiérarchie qualifiée, hiérarchies TLS) en SVG intégré, -en français et en anglais, et les insère entre les marqueurs des pages du livre blanc. +"""Génère les schémas du portail en SVG intégré et les insère entre les marqueurs des pages : +les deux schémas du livre blanc (hiérarchie qualifiée, hiérarchies TLS), en français et en anglais, +et l'organigramme de gouvernance de la page d'accueil. Les schémas n'utilisent aucun script : ils remplacent des blocs Mermaid, dont la bibliothèque (environ 950 Ko, chargée depuis un service tiers) ralentissait fortement la page. @@ -112,6 +113,58 @@ def tls(t, uid): return "".join(parts) +GOVERNANCE = { + "title": "Organisation de la gouvernance d'OTSPI", + "desc": "L'assemblée générale élit le conseil d'administration, qui désigne le bureau (direction opérationnelle) ; " + "le bureau assure les relations avec les autorités de contrôle et les auditeurs. L'assemblée générale confirme " + "aussi les nominations au comité des politiques de confiance (CPC), autorité normative indépendante du bureau, " + "qui désigne le RSSI pour un an, habilite et contrôle les officiers d'autorité et rend un avis conforme sur les " + "travaux du comité technique ; le bureau fournit à ce comité ses moyens.", + "ag": ("Assemblée générale", "titulaires et sympathisants"), + "ca": ("Conseil d'administration", "2 à 9 membres"), + "bureau": ("Bureau", "présidence · trésorerie · secrétariat"), + "cab": ("Autorités de contrôle", "et auditeurs (CAB)"), + "cpc": ("Comité des politiques de confiance", "CPC / PMA"), + "tsc": ("Comité technique (TSC)", "avis CPC · moyens du Bureau"), + "rssi": ("RSSI / CISO", "désigné par le CPC, 1 an"), + "oa": ("Officiers d'autorité", "et gardiens de clés"), + "left": "Direction opérationnelle", + "right": "Autorité normative indépendante", + "confirm": "confirmation des nominations", +} + + +def governance(t, uid): + parts = [ + f'', + f'{escape(t["title"])}{escape(t["desc"])}', + defs(uid), + '', + f'{escape(t["left"].upper())}', + '', + f'{escape(t["right"].upper())}', + f'', + f'', + f'{escape(t["confirm"])}', + f'', + f'', + f'', + f'', + f'', + f'', + box(330, 10, 240, 64, t["ag"], "dg-root"), + box(40, 110, 240, 64, t["ca"], "dg-box"), + box(30, 230, 260, 64, t["bureau"], "dg-box"), + box(30, 366, 260, 64, t["cab"], "dg-box"), + box(500, 230, 260, 64, t["cpc"], "dg-root"), + box(342, 366, 186, 64, t["tsc"], "dg-box"), + box(538, 366, 186, 64, t["rssi"], "dg-box"), + box(734, 366, 186, 64, t["oa"], "dg-box"), + '', + ] + return "".join(parts) + + def figure(svg, number, title): """Enveloppe un schéma dans une figure légendée et numérotée, ancrée sur #figure-N pour les renvois.""" return (f'
\n{svg}\n' @@ -133,6 +186,12 @@ def main(): page.write_text(text, encoding="utf-8") print(f"{path} : schémas régénérés") + home = ROOT / "docs/index.md" + text = replace_block(home.read_text(encoding="utf-8"), "governance", + f'
\n{governance(GOVERNANCE, "home-g")}\n
') + home.write_text(text, encoding="utf-8") + print("docs/index.md : organigramme régénéré") + if __name__ == "__main__": main() From b5d232f625687b8454f5741098d4570d29059f83 Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 11:52:06 +0200 Subject: [PATCH 06/11] chore(portail): retrait de la configuration Mermaid Plus aucune page n'utilise Mermaid depuis le passage de l'organigramme de l'accueil en SVG local. Co-authored-by: Claude --- docs/stylesheets/print.css | 1 - mkdocs.yml | 6 +----- scripts/export_pdf.py | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/stylesheets/print.css b/docs/stylesheets/print.css index 06a3685..3ed4482 100644 --- a/docs/stylesheets/print.css +++ b/docs/stylesheets/print.css @@ -145,7 +145,6 @@ .md-typeset .admonition, .md-typeset details, .md-typeset pre, - .md-typeset .mermaid, .md-typeset tr, .md-typeset img { break-inside: avoid; diff --git a/mkdocs.yml b/mkdocs.yml index 708c4c7..90031b7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -82,11 +82,7 @@ markdown_extensions: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.details - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.superfences - pymdownx.highlight: anchor_linenums: true - pymdownx.inlinehilite diff --git a/scripts/export_pdf.py b/scripts/export_pdf.py index a033bce..291ccde 100644 --- a/scripts/export_pdf.py +++ b/scripts/export_pdf.py @@ -71,7 +71,7 @@ def print_pdf(url, output): f"--user-data-dir={profile}", "--no-pdf-header-footer", "--generate-pdf-document-outline", - # Laisse le temps au rendu des diagrammes Mermaid + # Laisse le temps au chargement complet de la page (polices, scripts) "--virtual-time-budget=20000", "--run-all-compositor-stages-before-draw", f"--print-to-pdf={output}", From ec6f21a815da2da315c72bdee58d21e9abdde5b5 Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 12:06:20 +0200 Subject: [PATCH 07/11] =?UTF-8?q?docs(portail):=20titres=20des=20pages=20d?= =?UTF-8?q?e=20documentation=20en=20casse=20fran=C3=A7aise?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Titres et intertitres du cadrage, de la PSSI, du plan de fin d'activité, de la charte, de l'organisation technique, du guide préfecture, des réunions et du bulletin d'adhésion. Les textes juridiques soumis au vote (statuts, règlement intérieur, PV, rescrit, résolution) sont inchangés : leurs majuscules y marquent des termes définis. Les ancres, générées en minuscules, ne changent pas. Co-authored-by: Claude --- docs/adhesion/bulletin-adhesion.md | 10 ++++---- docs/administratif/declaration-prefecture.md | 14 ++++++------ docs/cadrage/cp-cps-cadre.md | 18 +++++++-------- docs/cadrage/index.md | 2 +- docs/cadrage/pssi.md | 24 ++++++++++---------- docs/cadrage/termination-plan.md | 18 +++++++-------- docs/gouvernance/charte-ethique.md | 16 ++++++------- docs/gouvernance/comite-technique.md | 12 +++++----- docs/reunions/index.md | 10 ++++---- 9 files changed, 62 insertions(+), 62 deletions(-) diff --git a/docs/adhesion/bulletin-adhesion.md b/docs/adhesion/bulletin-adhesion.md index 99d263a..b3a6156 100644 --- a/docs/adhesion/bulletin-adhesion.md +++ b/docs/adhesion/bulletin-adhesion.md @@ -11,7 +11,7 @@ Les demandes d'adhésion et dossiers complétés sont à transmettre à l'adress --- -## 1. Collèges et Conditions d'Adhésion +## 1. Collèges et conditions d'adhésion Conformément aux Articles 5, 5 bis et 5 quater des Statuts : @@ -34,10 +34,10 @@ Conformément aux Articles 5, 5 bis et 5 quater des Statuts : --- -## 2. Formulaire pour Personne Physique +## 2. Formulaire pour personne physique ```markdown -### Demande d'adhésion — Personne Physique +### Demande d'adhésion — personne physique - **Nom légal** : - **Prénom(s)** : @@ -75,10 +75,10 @@ Signature : --- -## 3. Formulaire pour Personne Morale +## 3. Formulaire pour personne morale ```markdown -### Demande d'adhésion — Personne Morale +### Demande d'adhésion — personne morale - **Raison sociale de l'organisation** : - **Forme juridique** (ex. Association, Fondation, SA, SAS, Établissement Public) : diff --git a/docs/administratif/declaration-prefecture.md b/docs/administratif/declaration-prefecture.md index 23c4359..b4ffae0 100644 --- a/docs/administratif/declaration-prefecture.md +++ b/docs/administratif/declaration-prefecture.md @@ -1,4 +1,4 @@ -# Guide des Démarches Administratives et Juridiques +# Guide des démarches administratives et juridiques **Création et Immatriculation de l'Association « OTSPI » (Loi 1901)** *« Open Trusted Service Provider Initiative »* @@ -9,7 +9,7 @@ Ce document récapitule la procédure légale et administrative pour enregistrer --- -## Étape 1 : Rédaction et Signature des Documents Constitutifs +## Étape 1 : rédaction et signature des documents constitutifs Avant de procéder à la déclaration, réunir les documents suivants paraphés et signés : 1. **Les Statuts** : [statuts-association.md](../statuts/statuts-association.md) complétés avec l'adresse du siège social dans la Métropole de Lyon, datés du jour de l'assemblée générale constitutive et signés par les dirigeants fondateurs (Président(e) et Trésorier(e)). @@ -18,7 +18,7 @@ Avant de procéder à la déclaration, réunir les documents suivants paraphés --- -## Étape 2 : Déclaration en Préfecture (Télédéclaration e-création) +## Étape 2 : déclaration en préfecture (télédéclaration e-création) La déclaration se réalise de manière dématérialisée sur le portail officiel de l'administration française : @@ -34,7 +34,7 @@ La déclaration se réalise de manière dématérialisée sur le portail officie --- -## Étape 3 : Récépissé de Déclaration et Numéro RNA +## Étape 3 : récépissé de déclaration et numéro RNA - Dans un délai généralement compris entre **24 heures et 5 jours ouvrés**, la Préfecture du Rhône / Métropole de Lyon valide le dossier. - L'administration délivre un **Récépissé de Déclaration de Création**. @@ -42,7 +42,7 @@ La déclaration se réalise de manière dématérialisée sur le portail officie --- -## Étape 4 : Publication au Journal Officiel (JOAFE) +## Étape 4 : publication au Journal officiel (JOAFE) - La publication au **Journal Officiel des Associations et Fondations d'Entreprise (JOAFE)** est automatique et gratuite. - La préfecture transmet directement l'avis de publication à la Direction de l'Information Légale et Administrative (DILA). @@ -52,7 +52,7 @@ La déclaration se réalise de manière dématérialisée sur le portail officie --- -## Étape 5 : Obtention des Numéros SIREN et SIRET (INSEE) +## Étape 5 : obtention des numéros SIREN et SIRET (INSEE) Pour ouvrir un compte bancaire associatif, souscrire aux polices de garantie financière et d'assurance responsabilité civile professionnelle, employer du personnel ou recevoir des financements et mécénats, l'association doit disposer d'un numéro SIRET. @@ -66,7 +66,7 @@ Pour ouvrir un compte bancaire associatif, souscrire aux polices de garantie fin --- -## Étape 6 : Ouverture du Compte Bancaire et Fonds de Réserve +## Étape 6 : ouverture du compte bancaire et fonds de réserve Une fois les identifiants officiels obtenus : - Ouverture du compte courant d'exploitation auprès d'un établissement bancaire ; diff --git a/docs/cadrage/cp-cps-cadre.md b/docs/cadrage/cp-cps-cadre.md index a4d28ed..e5b2ce8 100644 --- a/docs/cadrage/cp-cps-cadre.md +++ b/docs/cadrage/cp-cps-cadre.md @@ -1,4 +1,4 @@ -# Cadre Général des Politiques de Certification et Pratiques (CP/CPS) +# Cadre général des politiques de certification et pratiques (CP/CPS) ## Conforme à la RFC 3647, ETSI EN 319 401, ETSI EN 319 411-1 / 411-2 et WebTrust **Association « Open Trusted Service Provider Initiative » (OTSPI)** @@ -25,7 +25,7 @@ Le présent document définit les Politiques de Certification (*Certificate Poli --- -## 2. Répertoires de Publication et Référentiels +## 2. Répertoires de publication et référentiels ### 2.1. Répertoires publics OTSPI maintient un répertoire accessible publiquement, de façon continue (24h/24, 7j/7), neutre et gratuite, contenant : @@ -39,7 +39,7 @@ La disponibilité des services de publication de révocation (CRL/OCSP) fait l'o --- -## 3. Identification et Authentification (I&A) +## 3. Identification et authentification (I&A) ### 3.1. Enregistrement initial - **Officiers d'Autorité et Gardiens de clés** : Identification civile formelle en présence physique ou par PVID qualifié, vérification du casier judiciaire, serment déontologique (Article 5 du Règlement Intérieur). @@ -50,7 +50,7 @@ Tous les accès administratifs et d'émission requièrent des clés matérielles --- -## 4. Exigences Opérationnelles du Cycle de Vie des Certificats +## 4. Exigences opérationnelles du cycle de vie des certificats ### 4.1. Demande et émission de certificats Toute demande de certificat suit un processus automatisé ou validé par un Officier d'Autorité selon le profil d'usage. L'émission est signée exclusivement au sein d'un module matériel de sécurité (HSM) qualifié. @@ -62,7 +62,7 @@ Toute demande de certificat suit un processus automatisé ou validé par un Offi --- -## 5. Contrôles de Sécurité Physique, Environnementale et Procédurale +## 5. Contrôles de sécurité physique, environnementale et procédurale ### 5.1. Sécurité physique des sites d'hébergement Les composants serveurs et modules HSM sont hébergés au sein de datacenters certifiés ISO/IEC 27001 et qualifiés SecNumCloud (ou équivalent européen souverain), situés exclusivement sur le territoire de l'Union Européenne : @@ -75,7 +75,7 @@ Toute opération sur les HSM ou sur les clés racines (génération, sauvegarde, --- -## 6. Contrôles Techniques de Sécurité et Cycle de Vie des Clés +## 6. Contrôles techniques de sécurité et cycle de vie des clés ### 6.1. Modules matériels de sécurité (HSM) - Les clés privées racines et intermédiaires sont générées et stockées exclusivement au sein de modules HSM certifiés **Common Criteria EAL 4+ (profil de protection EN 419 221-5)** ou **FIPS 140-2 / 140-3 Niveau 3**. @@ -94,7 +94,7 @@ Conformément aux référentiels ETSI TS 119 312 et aux recommandations de l'ANS --- -## 7. Profils de Certificats, de CRL et d'Horodatage +## 7. Profils de certificats, de CRL et d'horodatage 1. **Profils X.509 v3** : Conformes aux normes IETF RFC 5280 et profils ETSI EN 319 412 (parties 1 à 5). 2. **Profils d'horodatage qualifié** : Conformes à la RFC 3161 et ETSI EN 319 421 / 422. @@ -102,7 +102,7 @@ Conformément aux référentiels ETSI TS 119 312 et aux recommandations de l'ANS --- -## 8. Audit de Conformité et Évaluation +## 8. Audit de conformité et évaluation 1. **Audits internes périodiques** : Réalisés sous la responsabilité de l'Auditeur Interne indépendant nommé en coordination avec le CPC. 2. **Audits externes d'accréditation** : Conduits au moins tous les deux (2) ans (avec audits de surveillance annuels) par un organisme d'évaluation de la conformité (*Conformity Assessment Body - CAB*) accrédité selon la norme ISO/IEC 17065 et ETSI EN 319 403 / 403-1. @@ -110,7 +110,7 @@ Conformément aux référentiels ETSI TS 119 312 et aux recommandations de l'ANS --- -## 9. Dispositions Légales, Responsabilités et Droit Applicable +## 9. Dispositions légales, responsabilités et droit applicable 1. **Inaliénabilité des clés et séquestre** : Les clés privées sont insaisissables et sous séquestre technique exclusif (Article 8 ter des Statuts). 2. **Garanties financières et RC Pro** : Couverture par le fonds de réserve opérationnelle (Article 12 bis des Statuts) et police d'assurance responsabilité civile professionnelle souscrite par l'association. diff --git a/docs/cadrage/index.md b/docs/cadrage/index.md index 59896ee..8ef9f25 100644 --- a/docs/cadrage/index.md +++ b/docs/cadrage/index.md @@ -1,4 +1,4 @@ -# Documents de Cadrage Stratégique et Socle de Conformité Initial (TSP / PKI) +# Documents de cadrage stratégique et socle de conformité initial (TSP / PKI) **Association « Open Trusted Service Provider Initiative » (OTSPI)** diff --git a/docs/cadrage/pssi.md b/docs/cadrage/pssi.md index d332ab3..a5d17d4 100644 --- a/docs/cadrage/pssi.md +++ b/docs/cadrage/pssi.md @@ -1,4 +1,4 @@ -# Politique de Sécurité des Systèmes d'Information (PSSI) +# Politique de sécurité des systèmes d'information (PSSI) ## Conforme aux normes ISO/IEC 27001 et ETSI EN 319 401 **Association « Open Trusted Service Provider Initiative » (OTSPI)** @@ -6,7 +6,7 @@ --- -## 1. Objectifs, Périmètre et Engagement de la Direction +## 1. Objectifs, périmètre et engagement de la direction ### 1.1. Objectifs de la PSSI La présente Politique de Sécurité des Systèmes d'Information (PSSI) a pour objet de garantir : @@ -19,16 +19,16 @@ La PSSI s'applique à : - L'ensemble des systèmes d'information, réseaux, serveurs, conteneurs et modules matériels HSM ; - Tous les administrateurs, membres du Bureau, membres du CPC, Officiers d'Autorité, Gardiens de clés et salariés ou prestataires intervenant sur l'infrastructure. -### 1.3. Engagement de la Direction Opérationnelle +### 1.3. Engagement de la direction opérationnelle Le Bureau de l'association (*Executive Management* au sens de l'ETSI EN 319 401) s'engage à allouer les ressources humaines, matérielles et financières nécessaires à l'application et au contrôle continu de cette politique. --- -## 2. Organisation de la Sécurité et Rôles Clés +## 2. Organisation de la sécurité et rôles clés Conformément à la séparation stricte des fonctions imposée par l'ETSI et WebTrust : -### 2.1. Le Responsable de la Sécurité des Systèmes d'Information (RSSI / CISO) +### 2.1. Le responsable de la sécurité des systèmes d'information (RSSI / CISO) - **Nomination et indépendance** : Nommé par le Comité des Politiques de Confiance (CPC) pour un mandat d'un (1) an renouvelable (Article 8 bis.3 des Statuts). - **Missions** : * Piloter le Système de Management de la Sécurité de l'Information (SMSI) ; @@ -36,21 +36,21 @@ Conformément à la séparation stricte des fonctions imposée par l'ETSI et Web * Superviser la gestion des incidents et coordonner la divulgation des vulnérabilités (CVD) ; * Disposer d'une ligne de reporting direct auprès du Bureau et du CPC, en totale indépendance des équipes d'exploitation courante. -### 2.2. L'Auditeur Interne Indépendant +### 2.2. L'auditeur interne indépendant - Désigné en concertation entre le CPC et le Conseil d'Administration. - Ne peut exercer aucune fonction au sein du Bureau, ni aucune tâche opérationnelle d'administration système ou d'Officier d'Autorité. - Réalise des audits de conformité semestriels et supervise l'audit contradictoire des scellés des Gardiens de clés. -### 2.3. Les Équipes d'Exploitation et d'Ingénierie +### 2.3. Les équipes d'exploitation et d'ingénierie - Chargées de l'administration système, du déploiement des briques logicielles libres (TSA, PKI, validateurs) et de la maintenance opérationnelle. - Opèrent sous le principe du moindre privilège (*Least Privilege*) et ne possèdent aucun accès direct aux clés privées racines en clair. -### 2.4. Les Officiers d'Autorité et Gardiens de Clés +### 2.4. Les officiers d'autorité et gardiens de clés - Rôles de confiance soumis à habilitation préalable par le CPC, assermentation éthique et vérification d'identité (Articles 5 et 7 du Règlement Intérieur). --- -## 3. Gestion des Actifs et Contrôles d'Accès +## 3. Gestion des actifs et contrôles d'accès ### 3.1. Classification des informations Les actifs d'information sont classifiés en 4 niveaux : @@ -66,7 +66,7 @@ Les actifs d'information sont classifiés en 4 niveaux : --- -## 4. Sécurité Physique et Opérationnelle +## 4. Sécurité physique et opérationnelle ### 4.1. Hébergement des infrastructures - Les modules matériels de sécurité (HSM) et serveurs d'autorité sont implantés dans des centres de données hautement sécurisés situés dans l'Union Européenne, qualifiés SecNumCloud ou certifiés ISO 27001. @@ -79,7 +79,7 @@ Les actifs d'information sont classifiés en 4 niveaux : --- -## 5. Gestion des Incidents de Sécurité et Continuité d'Activité +## 5. Gestion des incidents de sécurité et continuité d'activité ### 5.1. Détection et journalisation (*Logging & Monitoring*) - Journalisation centralisée et horodatée des événements de sécurité sur un serveur de logs dédié en écriture seule (WORM / *Write Once Read Many*) ; @@ -97,6 +97,6 @@ Les actifs d'information sont classifiés en 4 niveaux : --- -## 6. Révision et Amélioration Continue +## 6. Révision et amélioration continue La présente PSSI fait l'objet d'une revue annuelle obligatoire par le RSSI, le Bureau et le CPC, ainsi qu'à la suite de tout incident majeur ou évolution réglementaire substantielle. diff --git a/docs/cadrage/termination-plan.md b/docs/cadrage/termination-plan.md index 4bb39bd..ddff6b5 100644 --- a/docs/cadrage/termination-plan.md +++ b/docs/cadrage/termination-plan.md @@ -1,12 +1,12 @@ -# Plan de Fin d'Activité et de Cessation des Services de Confiance -## (*Termination Plan* conforme à l'article 24.2.e du Règlement eIDAS et à l'ETSI EN 319 401 § 7.12) +# Plan de fin d'activité et de cessation des services de confiance +## (*Termination Plan* conforme à l'article 24.2.e du règlement eIDAS et à l'ETSI EN 319 401 § 7.12) **Association « Open Trusted Service Provider Initiative » (OTSPI)** *Approuvé par le Bureau et le Comité des Politiques de Confiance (CPC).* --- -## 1. Contexte, Objet et Cadre Légal +## 1. Contexte, objet et cadre légal Conformément à l'**article 24 paragraphe 2 point e) du Règlement (UE) n° 910/2014 (eIDAS)** et à la clause 7.12 de la norme **ETSI EN 319 401**, tout prestataire de services de confiance qualifié doit maintenir un plan à jour garantissant la continuité ou la cessation ordonnée de ses activités en cas de liquidation, de faillite ou d'arrêt programmé de service. @@ -18,7 +18,7 @@ Le présent document formalise le **Plan de Fin d'Activité (*Termination Plan*) --- -## 2. Déclenchement du Plan de Fin d'Activité +## 2. Déclenchement du plan de fin d'activité Le plan de fin d'activité est déclenché dans les cas suivants : - Décision volontaire de cessation de service votée par l'Assemblée Générale Extraordinaire (Article 10 et 11 des Statuts) ; @@ -27,7 +27,7 @@ Le plan de fin d'activité est déclenché dans les cas suivants : --- -## 3. Procédure Opérationnelle de Notification et Délais +## 3. Procédure opérationnelle de notification et délais Dès la décision ou le constat de cessation d'activité : @@ -42,7 +42,7 @@ Dès la décision ou le constat de cessation d'activité : --- -## 4. Révocation des Autorités et Révocation des Certificats +## 4. Révocation des autorités et révocation des certificats 1. **Arrêt immédiat des nouvelles émissions** : Dès la date d'effet de la fin de service, aucune nouvelle clé ou certificat ne peut être émis. 2. **Génération d'une CRL finale complète** : @@ -54,7 +54,7 @@ Dès la décision ou le constat de cessation d'activité : --- -## 5. Maintien des Annuaires de Révocation et Validateurs (CRL / OCSP) +## 5. Maintien des annuaires de révocation et validateurs (CRL / OCSP) Même après l'arrêt d'émission, l'accès public aux données d'état de révocation doit être assuré pour toute la durée de validité résiduelle des certificats émis : 1. **Périmètre temporel** : Les listes de révocation finales (CRL) et validateurs d'état restent consultables publiquement pendant au moins **dix (10) ans** suivant la cessation de l'activité. @@ -63,7 +63,7 @@ Même après l'arrêt d'émission, l'accès public aux données d'état de révo --- -## 6. Archivage Probatoire à Long Terme des Journaux d'Audit (10 à 30 ans) +## 6. Archivage probatoire à long terme des journaux d'audit (10 à 30 ans) Conformément à l'ETSI EN 319 401 et aux exigences réglementaires de conservation de la preuve électronique : 1. **Données à archiver** : @@ -77,7 +77,7 @@ Conformément à l'ETSI EN 319 401 et aux exigences réglementaires de conservat --- -## 7. Convention de Séquestre Financier et Fonds de Garantie (Article 12 bis des Statuts) +## 7. Convention de séquestre financier et fonds de garantie (article 12 bis des statuts) Pour garantir que la fin d'activité ne sera pas compromise par une défaillance financière : 1. **Sanctuarisation du Fonds de Réserve Opérationnelle** : diff --git a/docs/gouvernance/charte-ethique.md b/docs/gouvernance/charte-ethique.md index 08596b0..923d90b 100644 --- a/docs/gouvernance/charte-ethique.md +++ b/docs/gouvernance/charte-ethique.md @@ -1,11 +1,11 @@ -# Charte d'Éthique, de Déontologie et de Transparence Publique +# Charte d'éthique, de déontologie et de transparence publique **Association « Open Trusted Service Provider Initiative » (OTSPI)** *Organisation d'Intérêt Général et à Gestion Désintéressée* --- -## 1. Vision et Raison d'Être : La Confiance Numérique comme Bien Commun +## 1. Vision et raison d'être : la confiance numérique comme bien commun L'association **« Open Trusted Service Provider Initiative » (OTSPI)** a pour but d'intérêt général de lever les barrières économiques, techniques, administratives et éducatives à la sécurité, à la confidentialité et à la confiance numérique dans les communications électroniques mondiales. @@ -15,32 +15,32 @@ L'association est régie par les principes d'**intérêt général**, de **gesti --- -## 2. Principes Directeurs d'Ordre Public Interne +## 2. Principes directeurs d'ordre public interne -### A. Redevabilité Publique Intégrale (*Full Public Accountability*) +### A. Redevabilité publique intégrale (*Full Public Accountability*) - **Transparence des processus** : Toutes les réunions statutaires, délibérations du Conseil d'Administration, résolutions normatives, documents de cadrage, feuilles de route (*roadmaps*), budgets prévisionnels et comptes financiers sont publiés en libre accès public (*open access*). - **Code source et spécifications ouvertes** : Tous les logiciels d'infrastructure sont sous licence libre ou ouverte. Les rapports d'évaluation d'audit de conformité (normes ETSI EN 319 401, EN 319 411 / 421 / 422, WebTrust, eIDAS) sont rendus publics. - **Les deux seules réserves protégées** : 1. **Protection stricte de la vie privée et conformité RGPD** : Anonymisation ou pseudonymisation préalable des données personnelles des membres, votants, donateurs et contributeurs avant publication (Règlement UE 2016/679). 2. **Sécurité opérationnelle et divulgation coordonnée de vulnérabilités (*Coordinated Vulnerability Disclosure*)** : Confidentialité temporaire sous embargo des rapports de vulnérabilités le temps de la correction et du déploiement, et secret technique absolu des clés privées et secrets matériels protégés au sein des modules HSM qualifiés. -### B. Gestion Strictement Désintéressée et Inaliénabilité +### B. Gestion strictement désintéressée et inaliénabilité - **Bénévolat intégral des mandats** : Conformément à l'Article 12 des Statuts, les fonctions d'administrateurs au Conseil d'Administration et de membres du Bureau sont exercées à titre strictement bénévole. Aucun membre ne perçoit de rémunération, dividende ou avantage matériel direct ou indirect. - **Séparation étanche avec les salariés** : Les éventuels salariés ou prestataires techniques de l'association ne peuvent siéger ni au Bureau ni au Conseil d'Administration. - **Inaliénabilité perpétuelle (Article 13 des Statuts)** : L'association s'interdit perpétuellement toute transformation lucrative. Ses dépôts logiciels libres, marques et infrastructures sont inaliénables. En cas de dissolution, l'actif net subsistant après exécution complète du plan de terminaison d'activité (*Termination Plan*) est obligatoirement dévolu à un organisme d'intérêt général ou d'utilité publique poursuivant des missions analogues. -### C. Ségrégation des Fonctions et Intégrité Normative +### C. Ségrégation des fonctions et intégrité normative - **Indépendance de l'autorité normative (Article 8 bis des Statuts)** : Le Comité des Politiques de Confiance (CPC / PMA) assure la garantie normative et cryptographique en toute indépendance de la gestion administrative ou des pressions commerciales. - **Incompatibilité de gouvernance** : L'appartenance au Bureau exécutif est strictement incompatible avec les fonctions de membre du CPC ou d'auditeur interne. - **Prévention des conflits d'intérêts** : Tout administrateur, membre du CPC ou Officier d'Autorité déclare publiquement ses liens d'intérêt et s'abstient de prendre part au vote en cas de délibération susceptible de créer un conflit d'intérêts. -### D. Neutralité, Égalité d'Accès et Souveraineté +### D. Neutralité, égalité d'accès et souveraineté - **Universalité et non-discrimination (Article 12 quater des Statuts)** : L'accès aux services de confiance et briques logicielles édités par l'association est universel, neutre et non discriminatoire, dans le respect strict des sanctions légales et embargos applicables. - **Indépendance technologique** : L'association veille à la neutralité et à l'interopérabilité de ses infrastructures, face aux risques d'enfermement propriétaire (*vendor lock-in*) et de dépendance vis-à-vis de juridictions extraterritoriales intrusives. - **Minimisation des données (*Privacy by Design*)** : L'architecture privilégie systématiquement la protection de la vie privée, le traitement d'empreintes cryptographiques (*hashes*) et le refus absolu de tout profilage ou exploitation commerciale des métadonnées des utilisateurs. --- -## 3. Déclaration Publique d'Engagement +## 3. Déclaration publique d'engagement Tout administrateur, membre du Bureau, membre du CPC et Officier d'Autorité souscrit formellement à cette charte dès sa prise de fonction et s'engage à œuvrer au service exclusif de l'intérêt général et de la confiance numérique collective. diff --git a/docs/gouvernance/comite-technique.md b/docs/gouvernance/comite-technique.md index 94cffdb..8e07efe 100644 --- a/docs/gouvernance/comite-technique.md +++ b/docs/gouvernance/comite-technique.md @@ -1,10 +1,10 @@ -# Organisation Technique et Comité des Politiques de Confiance (CPC) +# Organisation technique et Comité des politiques de confiance (CPC) **Association « Open Trusted Service Provider Initiative » (OTSPI)** --- -## 1. Architecture de la Gouvernance Technique +## 1. Architecture de la gouvernance technique La gouvernance technique de l'association repose sur une séparation stricte des rôles entre l'autorité normative cryptographique et les comités d'ingénierie logicielle et opérationnelle : @@ -32,7 +32,7 @@ La gouvernance technique de l'association repose sur une séparation stricte des --- -## 2. Le Comité des Politiques de Confiance (CPC / PMA) +## 2. Le Comité des politiques de confiance (CPC / PMA) Conformément à l'**Article 8 bis des Statuts**, le CPC est l'organe collégial indépendant faisant office d'**Autorité de Gestion des Politiques (*Policy Management Authority - PMA*)** : - **Garantie d'indépendance** : Strictement dissocié de la direction exécutive (incompatibilité absolue avec le Bureau) ; @@ -45,7 +45,7 @@ Conformément à l'**Article 8 bis des Statuts**, le CPC est l'organe collégial --- -## 3. Le Comité de Pilotage Technique (TSC — Technical Steering Committee) +## 3. Le Comité de pilotage technique (TSC — Technical Steering Committee) Le **TSC** rassemble les ingénieurs, mainteneurs de code et experts en systèmes distribués assurant le développement et l'exploitation quotidienne des briques logicielles libres : - **Ingénierie logicielle** : Développement des composants d'horodatage qualifié (TSA), PKI, protocoles d'émission et de validation (RFC 3161, ACME, REST/JSON, CMP, OCSP) ; @@ -58,7 +58,7 @@ Le **TSC** rassemble les ingénieurs, mainteneurs de code et experts en système --- -## 4. Politique de Sécurité et Signalement de Vulnérabilités +## 4. Politique de sécurité et signalement de vulnérabilités La sécurité de l'infrastructure de confiance est assurée sous la coordination directe du RSSI et du CPC : - **Signalement confidentiel** : @@ -70,7 +70,7 @@ La sécurité de l'infrastructure de confiance est assurée sous la coordination --- -## 5. Environnements et Qualification +## 5. Environnements et qualification Les services opèrent sur deux environnements strictement cloisonnés : 1. **Environnement Bac à Sable (Staging / Test)** : diff --git a/docs/reunions/index.md b/docs/reunions/index.md index 7cd1ae1..a087ed5 100644 --- a/docs/reunions/index.md +++ b/docs/reunions/index.md @@ -1,4 +1,4 @@ -# Réunions et Comptes-Rendus Publics (*Public Accountability*) +# Réunions et comptes-rendus publics (*Public Accountability*) **Association « Open Trusted Service Provider Initiative » (OTSPI)** @@ -47,20 +47,20 @@ Avant toute publication publique d'un compte-rendu : - **Participants** : [Liste des membres avec respect de la vie privée RGPD] - **Quorum constaté** : [Pourcentage et conformité statutaire] -### 1. Ordre du Jour +### 1. Ordre du jour 1. Point de situation opérationnelle et technique 2. Examen de conformité réglementaire et audits 3. Résolutions soumises au vote -### 2. Synthèse des Débats +### 2. Synthèse des débats [Résumé factuel et transparent des échanges] -### 3. Décisions et Votes +### 3. Décisions et votes - **Résolution 1** : [Description de la décision] - *Vote des titulaires* : Pour (X) / Contre (Y) / Abstention (Z) - *Faculté de refus des sympathisants* : Opposition exprimée (Oui/Non, suffrages) - *Résultat* : Adopté / Rejeté -### 4. Prochaines Échéances +### 4. Prochaines échéances - [Actions planifiées et responsables désignés] ``` From a1107db72a4d8c3ee2630765d4d846415c599ce6 Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 12:08:15 +0200 Subject: [PATCH 08/11] =?UTF-8?q?feat(portail):=20page=20404=20bilingue,?= =?UTF-8?q?=20image=20de=20partage=20par=20d=C3=A9faut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Page 404 (servie aussi pour les 403) en français et en anglais, avec les liens vers les rubriques principales, à la place du « 404 - Not found » de Material. - Image Open Graph par défaut (1200 × 630) aux couleurs de la couverture du livre blanc, générée par scripts/build_og_image.py : toutes les pages ont désormais un aperçu de partage ; le livre blanc garde le sien. - Pied de page en bleu nuit, comme l'en-tête. Co-authored-by: Claude --- docs/assets/og/og-portail.png | Bin 0 -> 60520 bytes docs/stylesheets/extra.css | 49 +++++++++++++++++++++ overrides/404.html | 20 +++++++++ overrides/main.html | 14 +++--- scripts/build_og_image.py | 78 ++++++++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 docs/assets/og/og-portail.png create mode 100644 overrides/404.html create mode 100644 scripts/build_og_image.py diff --git a/docs/assets/og/og-portail.png b/docs/assets/og/og-portail.png new file mode 100644 index 0000000000000000000000000000000000000000..73b250fa8cb61ac9065a2c0a8019295a1523a1f7 GIT binary patch literal 60520 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

f9XTE*5 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 literal 0 HcmV?d00001 diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index bb576cc..08f6873 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -90,6 +90,12 @@ border-radius: 8px; } +/* Pied de page aux couleurs de l'en-tête */ +:root > * { + --md-footer-bg-color: #0b1120; + --md-footer-bg-color--dark: #070b16; +} + /* -------------------------------------------------------------------------- Titres : hiérarchie nette, sans le gris clair et la graisse légère de Material -------------------------------------------------------------------------- */ @@ -300,6 +306,49 @@ grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr)); } +/* -------------------------------------------------------------------------- + Page d'erreur 404 (overrides/404.html) + -------------------------------------------------------------------------- */ +.md-typeset .otspi-404 { + max-width: 34rem; + margin: 1rem 0 3rem; +} + +.md-typeset .otspi-404__code { + margin: 0; + color: var(--otspi-primary); + font-size: 3.2rem; + font-weight: 800; + line-height: 1; + letter-spacing: -0.04em; +} + +[data-md-color-scheme="slate"] .md-typeset .otspi-404__code { + color: var(--otspi-sky); +} + +.md-typeset .otspi-404 h1 { + margin: 0.6rem 0 0.8rem; +} + +.md-typeset .otspi-404__en { + color: var(--md-default-fg-color--light); +} + +.md-typeset .otspi-404__links { + margin-top: 1.4rem; + padding: 1rem 1.2rem; + border: 1px solid var(--otspi-card-border); + border-radius: 12px; + margin-left: 0; + background: var(--otspi-card-bg); + list-style: none; +} + +.md-typeset .otspi-404__links li { + margin: 0.35em 0; +} + /* -------------------------------------------------------------------------- Cartes Material -------------------------------------------------------------------------- */ diff --git a/overrides/404.html b/overrides/404.html new file mode 100644 index 0000000..93cdedb --- /dev/null +++ b/overrides/404.html @@ -0,0 +1,20 @@ +{% extends "main.html" %} + +{#- Page d'erreur servie pour les 404 et les 403 (deploy/o2switch/htaccess) : bilingue, puisque + le visiteur peut venir de la version anglaise du livre blanc. -#} + +{% block content %} +

+{% endblock %} diff --git a/overrides/main.html b/overrides/main.html index 90c9ee1..53bb72d 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -2,23 +2,27 @@ {% block extrahead %} {{ super() }} - {% if page and page.meta and page.meta.image %} + {#- Image de partage : celle de la page si elle en déclare une (livre blanc), sinon l'image par + défaut du portail (scripts/build_og_image.py) -#} + {% if page and page.meta is defined %} {% set og_title = page.meta.title or page.title %} {% set og_desc = page.meta.description or config.site_description %} - + {% set og_image = page.meta.image or (config.site_url ~ "assets/og/og-portail.png") %} + {% set og_image_alt = page.meta.image_alt or "OTSPI, Open Trusted Service Provider Initiative : portail de l'association" %} + - + - + - + {% endif %} {% endblock %} diff --git a/scripts/build_og_image.py b/scripts/build_og_image.py new file mode 100644 index 0000000..68b31dd --- /dev/null +++ b/scripts/build_og_image.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: EUPL-1.2 +"""Génère l'image de partage par défaut du portail (Open Graph, 1200 × 630 px) avec Chrome headless. + +Elle sert aux pages sans image propre (voir overrides/main.html) ; les pages du livre blanc gardent +la leur. Mise en page aux couleurs de la couverture du livre blanc, police Inter du portail. + +Usage : + python3 scripts/build_og_image.py # écrit docs/assets/og/og-portail.png + +La variable d'environnement CHROME permet d'imposer le binaire du navigateur. +""" + +import os +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +OUTPUT = ROOT / "docs/assets/og/og-portail.png" +FONTS = ROOT / "docs/assets/fonts/inter" +LOGO = ROOT / "docs/assets/logo-vertical-dark.svg" + +HTML = """ + + +
+

Portail de l'association

+

Open Trusted Service Provider Initiative

+
+

Statuts, gouvernance, livre blanc et socle de conformité des services de confiance eIDAS 2.0

+

about.otspi.org

+
+ +""" + + +def find_chrome(): + if os.environ.get("CHROME"): + return os.environ["CHROME"] + for candidate in ("google-chrome", "google-chrome-stable", "chromium", "chromium-browser"): + path = shutil.which(candidate) + if path: + return path + sys.exit("Chrome ou Chromium introuvable : définir la variable d'environnement CHROME.") + + +def main(): + OUTPUT.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory() as work: + page = Path(work) / "og.html" + page.write_text(HTML.format(fonts=FONTS.as_uri(), logo=LOGO.as_uri()), encoding="utf-8") + subprocess.run( + [find_chrome(), "--headless=new", "--disable-gpu", "--hide-scrollbars", f"--user-data-dir={work}/profile", + "--window-size=1200,630", "--virtual-time-budget=3000", f"--screenshot={OUTPUT}", page.as_uri()], + check=True, capture_output=True, timeout=120, + ) + print(f"Image générée : {OUTPUT.relative_to(ROOT)}") + + +if __name__ == "__main__": + main() From c16560d3b3c380b37f6a1fc99aa0538135e38af3 Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 12:12:14 +0200 Subject: [PATCH 09/11] =?UTF-8?q?feat(portail):=20statuts,=20r=C3=A8glemen?= =?UTF-8?q?t=20int=C3=A9rieur=20et=20charte=20en=20PDF=20balis=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/export_pdf.py exporte aussi le projet de statuts, le règlement intérieur et la charte d'éthique. Pour ne pas modifier ces textes, il ajoute au HTML une page de garde (charte du livre blanc) et un sommaire paginé des titres, datés du dernier commit de la source. - Gabarit de page otspidoc : pied de page propre à chaque document, en-tête courant de section, titres enchaînés sans saut de page, signets limités aux titres et articles. - Icône de téléchargement PDF à côté des actions de page, pour les pages qui déclarent `pdf:` dans leurs métadonnées. - Validation veraPDF et artefact des PR étendus aux cinq PDF. Les cinq PDF sont conformes PDF/UA-1 (veraPDF). Co-authored-by: Claude --- .github/workflows/check-pr.yml | 13 +-- docs/gouvernance/charte-ethique.md | 4 + .../reglement-interieur.md | 4 + docs/statuts/statuts-association.md | 1 + docs/stylesheets/print.css | 42 +++++++ overrides/partials/actions.html | 28 +++++ scripts/check_pdf_ua.sh | 7 +- scripts/export_pdf.py | 107 ++++++++++++++++-- scripts/pdf-weasyprint.css | 19 ++++ 9 files changed, 209 insertions(+), 16 deletions(-) create mode 100644 overrides/partials/actions.html diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml index becdeb1..e8ad59e 100644 --- a/.github/workflows/check-pr.yml +++ b/.github/workflows/check-pr.yml @@ -1,7 +1,8 @@ name: Vérification des pull requests (build et PDF) # Mêmes étapes de construction que le déploiement, sans déploiement ni secret : -# le site et les PDF du livre blanc sont validés avant fusion, et les PDF joints en artefact pour relecture. +# le site et les PDF du portail (livre blanc, statuts, règlement intérieur, charte) sont validés +# avant fusion, et les PDF joints en artefact pour relecture. on: pull_request: @@ -39,7 +40,7 @@ jobs: - name: Build documentation run: mkdocs build --strict - - name: Export whitepaper PDF + - name: Export PDF run: python scripts/export_pdf.py - name: Cache veraPDF @@ -54,7 +55,7 @@ jobs: # Polices embarquées : Inter pour le texte ; toute autre police signale un glyphe absent d'Inter - name: List embedded fonts run: | - for pdf in site/livre-blanc/otspi-livre-blanc.pdf site/white-paper/otspi-white-paper.pdf; do + for pdf in $(find site -name 'otspi-*.pdf' | sort); do echo "== $pdf" pdffonts "$pdf" done @@ -62,8 +63,6 @@ jobs: - name: Upload PDF uses: actions/upload-artifact@v4 with: - name: livre-blanc-pdf - path: | - site/livre-blanc/otspi-livre-blanc.pdf - site/white-paper/otspi-white-paper.pdf + name: portail-pdf + path: site/**/otspi-*.pdf retention-days: 14 diff --git a/docs/gouvernance/charte-ethique.md b/docs/gouvernance/charte-ethique.md index 923d90b..01d2c79 100644 --- a/docs/gouvernance/charte-ethique.md +++ b/docs/gouvernance/charte-ethique.md @@ -1,3 +1,7 @@ +--- +pdf: otspi-charte-ethique.pdf +--- + # Charte d'éthique, de déontologie et de transparence publique **Association « Open Trusted Service Provider Initiative » (OTSPI)** diff --git a/docs/reglement-interieur/reglement-interieur.md b/docs/reglement-interieur/reglement-interieur.md index 25037fa..7326263 100644 --- a/docs/reglement-interieur/reglement-interieur.md +++ b/docs/reglement-interieur/reglement-interieur.md @@ -1,3 +1,7 @@ +--- +pdf: otspi-reglement-interieur.pdf +--- + # Règlement Intérieur de l'Association OTSPI ## « Open Trusted Service Provider Initiative » diff --git a/docs/statuts/statuts-association.md b/docs/statuts/statuts-association.md index c26b6a9..9380e73 100644 --- a/docs/statuts/statuts-association.md +++ b/docs/statuts/statuts-association.md @@ -2,6 +2,7 @@ title: "STATUTS DE L'ASSOCIATION OTSPI" author: "Membres Fondateurs" date: "Projet — non encore adopté" +pdf: otspi-projet-de-statuts.pdf --- # STATUTS DE L'ASSOCIATION diff --git a/docs/stylesheets/print.css b/docs/stylesheets/print.css index 3ed4482..f101cac 100644 --- a/docs/stylesheets/print.css +++ b/docs/stylesheets/print.css @@ -72,6 +72,29 @@ @bottom-right { content: none; } } +/* Gabarit des textes juridiques exportés en PDF (statuts, règlement intérieur, charte) : la page de + garde est ajoutée par scripts/export_pdf.py et porte la mention du pied de page (data-footer). */ +@page otspidoc { + @top-right { + content: string(section); + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; + color: #64748b; + } + + @bottom-left { + content: string(doc-footer); + font: 8pt Inter, "Helvetica Neue", Arial, sans-serif; + color: #64748b; + } +} + +@page otspidoc:first { + margin: 0; + @top-right { content: none; } + @bottom-left { content: none; } + @bottom-right { content: none; } +} + @media print { html { -webkit-print-color-adjust: exact; @@ -167,6 +190,24 @@ page: whitepaper-en; } + body:has(.doc-cover) { + page: otspidoc; + } + + .md-typeset .doc-cover { + string-set: doc-footer attr(data-footer); + } + + /* Texte juridique : les titres s'enchaînent sans saut de page, l'en-tête courant suit les sections */ + .md-typeset .doc-cover ~ h2 { + break-before: auto; + margin-top: 9mm; + } + + .md-typeset .doc-cover ~ .doc-section { + string-set: section content(); + } + /* Page de garde à fond perdu, aux couleurs du logo en version claire (son fond #0b1120 se confond avec celui de la page) */ .md-typeset .wp-cover { @@ -391,6 +432,7 @@ } /* Sommaire */ + .md-typeset .wp-toc h2, .md-typeset .wp-toc h3 { margin: 0 0 8mm; padding-bottom: 2.5mm; diff --git a/overrides/partials/actions.html b/overrides/partials/actions.html new file mode 100644 index 0000000..58b7c11 --- /dev/null +++ b/overrides/partials/actions.html @@ -0,0 +1,28 @@ +{#- + Actions de page de Material (partials/actions.html), précédées d'un lien de téléchargement + lorsque la page déclare sa version PDF dans ses métadonnées (`pdf:`, voir scripts/export_pdf.py). +-#} +{% if page.meta and page.meta.pdf %} + + {% include ".icons/material/file-pdf-box.svg" %} + +{% endif %} +{% if page.edit_url %} + {% if "content.action.edit" in features %} + + {% set icon = config.theme.icon.edit or "material/file-edit-outline" %} + {% include ".icons/" ~ icon ~ ".svg" %} + + {% endif %} + {% if "content.action.view" in features %} + {% if "/blob/" in page.edit_url %} + {% set part = "blob" %} + {% else %} + {% set part = "edit" %} + {% endif %} + + {% set icon = config.theme.icon.view or "material/file-eye-outline" %} + {% include ".icons/" ~ icon ~ ".svg" %} + + {% endif %} +{% endif %} diff --git a/scripts/check_pdf_ua.sh b/scripts/check_pdf_ua.sh index 48ce042..3c5d966 100755 --- a/scripts/check_pdf_ua.sh +++ b/scripts/check_pdf_ua.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # SPDX-License-Identifier: EUPL-1.2 -# Valide au format PDF/UA-1 les PDF du livre blanc générés dans ./site avec veraPDF. +# Valide au format PDF/UA-1 les PDF du portail générés dans ./site avec veraPDF. # Retourne un code d'erreur si un PDF n'est pas conforme. # # veraPDF (licence GPLv3 et MPL 2.0) est téléchargé en version épinglée, vérifié par empreinte SHA-256, @@ -38,7 +38,10 @@ fi if [ "$#" -gt 0 ]; then files=("$@") else - files=(site/livre-blanc/otspi-livre-blanc.pdf site/white-paper/otspi-white-paper.pdf) + files=(site/livre-blanc/otspi-livre-blanc.pdf site/white-paper/otspi-white-paper.pdf + site/statuts/statuts-association/otspi-projet-de-statuts.pdf + site/reglement-interieur/reglement-interieur/otspi-reglement-interieur.pdf + site/gouvernance/charte-ethique/otspi-charte-ethique.pdf) fi status=0 diff --git a/scripts/export_pdf.py b/scripts/export_pdf.py index 291ccde..06e53d4 100644 --- a/scripts/export_pdf.py +++ b/scripts/export_pdf.py @@ -1,7 +1,10 @@ #!/usr/bin/env python3 -"""Génère les PDF de référence du livre blanc (français et anglais) à partir du site MkDocs construit. +"""Génère les PDF de référence du portail à partir du site MkDocs construit : le livre blanc (français et +anglais), le projet de statuts, le règlement intérieur et la charte d'éthique. Le site est servi localement puis imprimé ; la mise en page est portée par docs/stylesheets/print.css. +Le livre blanc porte sa page de garde et son sommaire dans sa source ; pour les textes juridiques, qu'on ne +modifie pas pour les besoins de l'impression, le script les ajoute au HTML avant l'impression (WeasyPrint). Deux moteurs sont disponibles : - weasyprint (par défaut) : PDF balisés, quasi conformes à PDF/UA-1 (voir requirements-pdf.txt) ; @@ -17,6 +20,7 @@ import argparse import base64 +import datetime import functools import http.server import os @@ -27,15 +31,55 @@ import tempfile import threading import urllib.request +from html import escape from pathlib import Path CHROME_CANDIDATES = ("google-chrome", "google-chrome-stable", "chromium", "chromium-browser") -# Pages exportées : répertoire de la page dans le site construit → nom du PDF +ROOT = Path(__file__).resolve().parent.parent + +# Pages exportées : répertoire de la page dans le site construit → PDF. Les textes juridiques reçoivent une +# page de garde (cover) et un sommaire des titres de niveau `section` ; `source` date la version. DOCUMENTS = { - "livre-blanc/": "otspi-livre-blanc.pdf", - "white-paper/": "otspi-white-paper.pdf", + "livre-blanc/": {"pdf": "otspi-livre-blanc.pdf"}, + "white-paper/": {"pdf": "otspi-white-paper.pdf"}, + "statuts/statuts-association/": { + "pdf": "otspi-projet-de-statuts.pdf", + "source": "docs/statuts/statuts-association.md", + "section": 3, + "cover": { + "kicker": "Projet de statuts", + "title": "Statuts de l'association Open Trusted Service Provider Initiative (OTSPI)", + "status": "Projet soumis à l'assemblée générale constitutive, non encore adopté", + "footer": "OTSPI — Projet de statuts, non adopté · CC-BY-4.0", + }, + }, + "reglement-interieur/reglement-interieur/": { + "pdf": "otspi-reglement-interieur.pdf", + "source": "docs/reglement-interieur/reglement-interieur.md", + "section": 2, + "cover": { + "kicker": "Règlement intérieur", + "title": "Règlement intérieur de l'association Open Trusted Service Provider Initiative (OTSPI)", + "status": "Projet, en application de l'article 14 du projet de statuts", + "footer": "OTSPI — Règlement intérieur, projet · CC-BY-4.0", + }, + }, + "gouvernance/charte-ethique/": { + "pdf": "otspi-charte-ethique.pdf", + "source": "docs/gouvernance/charte-ethique.md", + "section": 2, + "cover": { + "kicker": "Charte", + "title": "Charte d'éthique, de déontologie et de transparence publique", + "status": "Association en cours de constitution", + "footer": "OTSPI — Charte d'éthique · CC-BY-4.0", + }, + }, } +MONTHS = ("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", + "novembre", "décembre") + class QuietHandler(http.server.SimpleHTTPRequestHandler): def log_message(self, *args): @@ -129,7 +173,53 @@ def hoist_link_wrappers(html): ) -def print_weasyprint(url, output): +def version_date(source): + """Date du dernier commit du fichier source, en toutes lettres (date du jour à défaut).""" + result = subprocess.run(["git", "log", "-1", "--format=%cs", "--", source], cwd=ROOT, capture_output=True, text=True) + day = datetime.date.fromisoformat(result.stdout.strip()) if result.stdout.strip() else datetime.date.today() + return f"{day.day} {MONTHS[day.month - 1]} {day.year}" + + +def plain(fragment): + """Texte brut d'un fragment HTML de titre, sans le lien permanent « ¶ ».""" + return re.sub(r"<[^>]+>", "", re.sub(r'', "", fragment, flags=re.S)).strip() + + +def add_cover(html, doc): + """Ajoute une page de garde et un sommaire paginé à un texte juridique, sans toucher à sa source. + + La page de garde précède le titre de niveau 1 ; le sommaire suit ce titre (et son sous-titre), pour que + le premier titre du PDF reste de niveau 1. Les titres de section et de sous-section reçoivent les + classes doc-section et doc-sub, qui règlent l'en-tête courant et les signets (voir print.css). + """ + cover, level = doc["cover"], doc["section"] + start = html.index("", start) + len("") + subtitle = re.match(r"\s*", html[head_end:], re.S) + if subtitle: + head_end += subtitle.end() + + body = html[head_end:] + entries = [(m.group(1), plain(m.group(2))) for m in re.finditer(rf']*>(.*?)', body, re.S)] + body = re.sub(rf'' + '

' + f'

{escape(cover["kicker"])}

' + f'

{escape(cover["title"])}

' + f'

Open Trusted Service Provider Initiative (OTSPI)
{escape(cover["status"])}' + f'
Version du {version_date(doc["source"])}

' + '

Licence Creative Commons Attribution 4.0 International · contact@otspi.org

' + "
" + ) + toc = '

Sommaire

" + return html[:start] + page + html[start:head_end] + toc + body + + +def print_weasyprint(url, output, doc): """Imprime une page en PDF/UA-1 avec WeasyPrint ; renvoie None en cas de succès, sinon un message.""" try: import weasyprint @@ -139,6 +229,8 @@ def print_weasyprint(url, output): try: with urllib.request.urlopen(url) as response: html = hoist_link_wrappers(svg_to_img(response.read().decode("utf-8"))) + if "cover" in doc: + html = add_cover(html, doc) weasyprint.HTML(string=html, base_url=url).write_pdf(str(output), stylesheets=[override], pdf_variant="pdf/ua-1", pdf_identifier=True) except Exception as error: # noqa: BLE001 - toute erreur de rendu doit faire échouer l'export return str(error) @@ -158,7 +250,8 @@ def main(): httpd = serve(site) try: - for page_path, pdf_name in DOCUMENTS.items(): + for page_path, doc in DOCUMENTS.items(): + pdf_name = doc["pdf"] if not (site / page_path / "index.html").is_file(): sys.exit(f"Page introuvable : {site / page_path / 'index.html'} (lancer avec --build)") output = site / page_path / pdf_name @@ -168,7 +261,7 @@ def main(): result = print_pdf(url, output) error = result.stderr if result.returncode != 0 else None else: - error = print_weasyprint(url, output) + error = print_weasyprint(url, output, doc) if error or not output.is_file() or output.stat().st_size == 0: sys.stderr.write((error or "") + "\n") sys.exit(f"Échec de la génération du PDF : {pdf_name}") diff --git a/scripts/pdf-weasyprint.css b/scripts/pdf-weasyprint.css index 5cd7079..5f4ff95 100644 --- a/scripts/pdf-weasyprint.css +++ b/scripts/pdf-weasyprint.css @@ -126,6 +126,7 @@ body { bookmark-level: none !important; } +.md-typeset .wp-toc h2, .md-typeset .wp-toc h3, .md-typeset .wp-cover ~ h2 { bookmark-level: 1; @@ -142,3 +143,21 @@ body { .md-typeset .wp-cover ~ h4 { bookmark-level: 3; } + +/* Textes juridiques (page de garde ajoutée par export_pdf.py) : signets limités aux sections + (titres) et à leurs sous-sections (articles), quel que soit leur niveau de titre. */ +.md-typeset .doc-cover ~ h2, +.md-typeset .doc-cover ~ h3, +.md-typeset .doc-cover ~ h4, +.md-typeset .doc-cover ~ h5 { + bookmark-level: none; +} + +.md-typeset .doc-cover ~ .doc-section { + bookmark-level: 1; + bookmark-state: closed; +} + +.md-typeset .doc-cover ~ .doc-sub { + bookmark-level: 2; +} From 88c1fbc87e5bdb651639c4643177a75d3b3b19bd Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 12:18:04 +0200 Subject: [PATCH 10/11] =?UTF-8?q?ci:=20contr=C3=B4le=20d'accessibilit?= =?UTF-8?q?=C3=A9=20des=20pages=20(WCAG=202=20AA,=20axe)=20et=20correction?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/check_a11y.js contrôle toutes les pages du sitemap avec pa11y (moteur axe) ; seules les violations confirmées font échouer la CI, les cas qu'axe ne sait pas trancher (texte des schémas SVG) sont listés. - Étape ajoutée au workflow des pull requests, avec le Chrome du runner. - Corrections : gris de coloration syntaxique et texte secondaire des schémas assombris (#4b5563, au-dessus de 4,5:1) ; blocs de code défilants rendus focalisables au clavier. Co-authored-by: Claude --- .github/workflows/check-pr.yml | 16 ++++++- .gitignore | 1 + docs/javascripts/a11y.js | 12 +++++ docs/stylesheets/extra.css | 10 ++++- mkdocs.yml | 2 +- scripts/check_a11y.js | 82 ++++++++++++++++++++++++++++++++++ 6 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 scripts/check_a11y.js diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml index e8ad59e..a6c944e 100644 --- a/.github/workflows/check-pr.yml +++ b/.github/workflows/check-pr.yml @@ -1,4 +1,4 @@ -name: Vérification des pull requests (build et PDF) +name: Vérification des pull requests (build, accessibilité et PDF) # Mêmes étapes de construction que le déploiement, sans déploiement ni secret : # le site et les PDF du portail (livre blanc, statuts, règlement intérieur, charte) sont validés @@ -40,6 +40,20 @@ jobs: - name: Build documentation run: mkdocs build --strict + # Accessibilité des pages HTML (WCAG 2 AA, moteur axe) : Chrome du runner, sans téléchargement + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Check accessibility (pa11y, axe) + env: + PUPPETEER_SKIP_DOWNLOAD: "true" + CHROME: /usr/bin/google-chrome + run: | + npm install --no-save --no-audit --no-fund pa11y@9 + node scripts/check_a11y.js site + - name: Export PDF run: python scripts/export_pdf.py diff --git a/.gitignore b/.gitignore index 5501d95..a0c6888 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__/ *.py[cod] .venv/ .DS_Store +node_modules/ diff --git a/docs/javascripts/a11y.js b/docs/javascripts/a11y.js index 564f130..af7d089 100644 --- a/docs/javascripts/a11y.js +++ b/docs/javascripts/a11y.js @@ -19,3 +19,15 @@ document.addEventListener("DOMContentLoaded", function () { } }); }); + +// Rend accessibles au clavier les blocs de code qui défilent horizontalement (règle axe +// scrollable-region-focusable) : ils deviennent focalisables et portent le nom « Code ». +document.addEventListener("DOMContentLoaded", function () { + document.querySelectorAll("pre > code").forEach(function (code) { + if (code.scrollWidth > code.clientWidth && !code.hasAttribute("tabindex")) { + code.setAttribute("tabindex", "0"); + code.setAttribute("role", "region"); + code.setAttribute("aria-label", "Code"); + } + }); +}); diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 08f6873..3ecfb54 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -26,6 +26,11 @@ --md-accent-fg-color: #0369a1; --md-accent-fg-color--transparent: rgba(3, 105, 161, 0.1); --md-typeset-a-color: #1d4ed8; + /* Gris de coloration syntaxique et texte secondaire des schémas : le gris clair de Material + (#0000008a) reste sous 4,5:1 sur le fond des blocs de code et des boîtes teintées */ + --md-code-hl-generic-color: #4b5563; + --md-code-hl-comment-color: #4b5563; + --otspi-muted: #4b5563; } [data-md-color-scheme="slate"] { @@ -37,6 +42,7 @@ } [data-md-color-scheme="slate"] > * { + --otspi-muted: #b4bcc8; --md-accent-fg-color: #38bdf8; --md-accent-fg-color--transparent: rgba(56, 189, 248, 0.12); } @@ -602,7 +608,7 @@ } .wp-svg .dg-glabel { - fill: var(--md-default-fg-color--light); + fill: var(--otspi-muted); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; @@ -634,7 +640,7 @@ } .wp-svg .dg-s { - fill: var(--md-default-fg-color--light); + fill: var(--otspi-muted); font-size: 12px; } diff --git a/mkdocs.yml b/mkdocs.yml index 90031b7..3fbb9f9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -59,7 +59,7 @@ theme: - content.action.view extra_javascript: - - javascripts/a11y.js + - javascripts/a11y.js?v=2 - javascripts/analytics.js?v=2 extra_css: diff --git a/scripts/check_a11y.js b/scripts/check_a11y.js new file mode 100644 index 0000000..8099080 --- /dev/null +++ b/scripts/check_a11y.js @@ -0,0 +1,82 @@ +#!/usr/bin/env node +// SPDX-License-Identifier: EUPL-1.2 +// Contrôle d'accessibilité (WCAG 2 AA, moteur axe) de toutes les pages du site construit, listées par +// son sitemap.xml. Le site est servi localement par ce script. +// +// axe distingue les violations confirmées des cas qu'il ne sait pas trancher (texte des schémas SVG, +// libellés tronqués…) : seules les premières font échouer le contrôle, les secondes sont listées. +// +// Usage : +// npm install --no-save pa11y@9 +// node scripts/check_a11y.js [site] +// +// La variable d'environnement CHROME permet d'imposer le navigateur (sinon celui de Puppeteer). + +const fs = require("fs"); +const http = require("http"); +const path = require("path"); +const pa11y = require("pa11y"); + +const SITE = path.resolve(process.argv[2] || "site"); +const TYPES = { + ".html": "text/html; charset=utf-8", ".css": "text/css", ".js": "text/javascript", ".json": "application/json", + ".svg": "image/svg+xml", ".png": "image/png", ".woff2": "font/woff2", ".xml": "application/xml", + ".pdf": "application/pdf", +}; + +function serve() { + const server = http.createServer((req, res) => { + let file = path.join(SITE, decodeURIComponent(new URL(req.url, "http://x").pathname)); + if (!file.startsWith(SITE)) { + res.writeHead(403).end(); + return; + } + if (fs.existsSync(file) && fs.statSync(file).isDirectory()) file = path.join(file, "index.html"); + fs.readFile(file, (error, data) => { + if (error) { + res.writeHead(404).end(); + return; + } + res.writeHead(200, { "Content-Type": TYPES[path.extname(file)] || "application/octet-stream" }).end(data); + }); + }); + return new Promise((resolve) => server.listen(0, "127.0.0.1", () => resolve(server))); +} + +(async () => { + const sitemap = fs.readFileSync(path.join(SITE, "sitemap.xml"), "utf-8"); + const pages = [...sitemap.matchAll(/([^<]+)<\/loc>/g)].map((m) => new URL(m[1]).pathname); + const server = await serve(); + const base = `http://127.0.0.1:${server.address().port}`; + const launch = { args: ["--no-sandbox"] }; + if (process.env.CHROME) launch.executablePath = process.env.CHROME; + + let confirmed = 0; + const review = new Map(); + try { + for (const page of pages) { + const result = await pa11y(base + page, { runners: ["axe"], standard: "WCAG2AA", timeout: 60000, chromeLaunchConfig: launch }); + for (const issue of result.issues) { + const context = issue.context.replace(/\s+/g, " ").slice(0, 90); + if (issue.runnerExtras && issue.runnerExtras.needsFurtherReview) { + review.set(`${issue.code} : ${page}`, (review.get(`${issue.code} : ${page}`) || 0) + 1); + continue; + } + confirmed += 1; + console.log(`ÉCHEC ${page} — ${issue.code} : ${issue.message.split(" (")[0]}\n ${issue.selector}\n ${context}`); + } + } + } finally { + server.close(); + } + + if (review.size) { + console.log("\nÀ examiner (axe n'a pas pu trancher, sans effet sur le résultat) :"); + for (const [key, count] of review) console.log(` ${key} (${count})`); + } + console.log(`\n${pages.length} pages contrôlées, ${confirmed} violation(s) confirmée(s).`); + process.exit(confirmed ? 1 : 0); +})().catch((error) => { + console.error(error); + process.exit(2); +}); From c1bb196f2966070256cd83b5fe65355d4d6a8c64 Mon Sep 17 00:00:00 2001 From: Philippe Vienne Date: Sun, 27 Sep 2026 12:40:11 +0200 Subject: [PATCH 11/11] =?UTF-8?q?fix(portail):=20listes=20des=20statuts=20?= =?UTF-8?q?et=20du=20r=C3=A8glement=20int=C3=A9rieur=20rendues=20en=20list?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Treize listes suivaient directement leur phrase d'introduction : Markdown les fusionnait avec elle en un seul paragraphe (« 1. … ; 2. … »), sur le site comme dans les PDF. Correction de forme uniquement : seules des lignes vides sont ajoutées, aucun mot n'est modifié. Co-authored-by: Claude --- docs/reglement-interieur/reglement-interieur.md | 6 ++++++ docs/statuts/statuts-association.md | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/docs/reglement-interieur/reglement-interieur.md b/docs/reglement-interieur/reglement-interieur.md index 7326263..4178994 100644 --- a/docs/reglement-interieur/reglement-interieur.md +++ b/docs/reglement-interieur/reglement-interieur.md @@ -13,6 +13,7 @@ pdf: otspi-reglement-interieur.pdf ## Préambule Le présent Règlement Intérieur opérationnalise les principes généraux fixés dans les Statuts de l'Association **« Open Trusted Service Provider Initiative » (OTSPI)**. Il définit les règles précises relatives : + - À la qualification des membres, à la vérification d'identité civile et à la gestion des équipements cryptographiques matériels ; - Au cursus d'habilitation, au serment éthique et au régime des Officiers d'Autorité et des Gardiens de clés (*Key Custodians*) ; - À la ségrégation stricte des devoirs entre la direction opérationnelle (Bureau) et l'autorité normative (CPC / PMA) ; @@ -25,6 +26,7 @@ Le présent Règlement Intérieur opérationnalise les principes généraux fix ### Article 1 — Collèges et catégories de membres Conformément à l'Article 5 des Statuts, l'association comprend : + 1. **Membres sympathisants** : Personnes physiques ou morales soutenant les buts de l'association, à jour de cotisation. Ils disposent d'une voix consultative et exercent la faculté de refus collective prévue aux Articles 9 et 11 des Statuts. 2. **Membres titulaires** : Personnes physiques ou personnes morales dûment représentées participant de manière substantielle et active à la gouvernance, à la conformité ou aux opérations critiques. Ils disposent d'une voix délibérative pleine et entière. 3. **Membres bienfaiteurs** : Personnes morales apportant une contribution annuelle significative supérieure à cinq mille euros (5 000 € / an) sous forme de dons financiers, de mécénat matériel (serveurs, HSMs) ou de prise en charge locative. Ce statut honorifique n'ouvre aucun droit de vote (ni délibératif ni consultatif) afin de garantir la stricte neutralité et l'indépendance de l'infrastructure. @@ -32,6 +34,7 @@ Conformément à l'Article 5 des Statuts, l'association comprend : ### Article 2 — Vérification formelle de l'identité civile des membres titulaires Conformément à l'Article 5 quater des Statuts, aucune voix délibérative ne peut être exercée sous statut pseudonyme ou anonyme : + 1. **Procédure de contrôle d'identité préalable** : - Tout candidat personne physique au statut titulaire (ou tout représentant physique désigné par une personne morale membre titulaire) doit présenter une pièce d'identité officielle en cours de validité (carte nationale d'identité, passeport ou titre de séjour émis par un État souverain). - La vérification est effectuée soit en présentiel par un membre du Bureau ou un Officier d'Autorité, soit par un moyen de vérification d'identité à distance conforme au référentiel d'exigences PVID (Prestataire de Vérification d'Identité à Distance) de l'ANSSI ou équivalent eIDAS de niveau substantiel ou élevé. @@ -62,6 +65,7 @@ Conformément à l'Article 5 quater des Statuts, aucune voix délibérative ne p ### Article 5 — Cursus d'évaluation et habilitation des Officiers d'Autorité L'Officier d'Autorité exerce un rôle de confiance critique au sens des normes ETSI EN 319 401 et WebTrust. + 1. **Critères d'éligibilité** : - Être membre titulaire ou contributeur de l'association depuis au moins six (6) mois (sauf durant la phase d'amorçage de 24 mois visée à l'Article 5 bis.3 des Statuts) ; - Avoir une identité civile vérifiée et un casier judiciaire vierge (bulletin n°3 ou équivalent international de moins de 3 mois) ; @@ -106,6 +110,7 @@ L'Officier d'Autorité exerce un rôle de confiance critique au sens des normes ### Article 8 — Étanchéité de gouvernance et incompatibilités Conformément à l'Article 8 bis des Statuts : + 1. **Incompatibilité absolue** : Les fonctions de membre du Bureau (Président, Trésorier, Secrétaire Général) sont strictement incompatibles avec celles de membre du Comité des Politiques de Confiance (CPC) et avec celles d'Auditeur Interne indépendant. 2. **Rôle des administrateurs du CA** : Les membres du Conseil d'Administration n'exerçant pas de fonction exécutive au Bureau peuvent siéger au CPC, sous réserve de s'abstenir lors de tout vote du Conseil d'Administration portant sur la ratification ou le contrôle des décisions du CPC. 3. **Désignation du RSSI (CISO)** : Le RSSI est nommé par le CPC pour un mandat d'un (1) an renouvelable. Il rapporte techniquement au CPC et fonctionnellement au Bureau. @@ -139,6 +144,7 @@ Conformément à l'Article 8 bis des Statuts : ### Article 11 — Plafonds d'engagement de dépenses autonomes du Bureau Afin de concilier réactivité opérationnelle et contrôle budgétaire de l'Assemblée et du Conseil d'Administration : + 1. **Dépenses courantes autonomes du Bureau** : Le Président et le Trésorier peuvent engager conjointement les dépenses d'exploitation courante (abonnements d'infrastructure d'hébergement, télécoms, petit matériel, frais de mission justifiés) dans la limite d'un plafond de **cinq mille euros (5 000 €) hors taxes par opération**, dans le cadre du budget annuel voté. 2. **Autorisation préalable obligatoire du Conseil d'Administration** : Requiert une délibération préalable du Conseil d'Administration : - Tout investissement matériel unitaire ou contrat de prestation excédant **cinq mille euros (5 000 €) HT** ; diff --git a/docs/statuts/statuts-association.md b/docs/statuts/statuts-association.md index 9380e73..7a4d2b8 100644 --- a/docs/statuts/statuts-association.md +++ b/docs/statuts/statuts-association.md @@ -27,6 +27,7 @@ L’association est régie par les principes d'une **gestion désintéressée** L’association a pour vocation de promouvoir, concevoir, opérer et pérenniser des infrastructures critiques de confiance numérique ouvertes, souveraines, transparentes et universellement accessibles. À ce titre, l’association a notamment pour missions, directes ou indirectes, en France et à l'international : + 1. **L'opération et la fourniture de services de confiance :** concevoir, déployer, opérer et maintenir des infrastructures et services de confiance numérique (notamment la gestion des identités, les infrastructures à clés publiques, l'émission de certificats, l'horodatage électronique qualifié, le scellement, la signature numérique, l'archivage probatoire et la préservation ou validation de preuves cryptographiques) ; 2. **L'obtention et le maintien d'accréditations, de qualifications et de certifications :** instruire et pérenniser toute démarche d'évaluation, d'audit technique ou de qualification auprès des autorités publiques compétentes, des organismes de normalisation, des consortiums de l'industrie et des programmes de confiance des éditeurs de plateformes ; 3. **La conception et la diffusion de technologies ouvertes :** concevoir, maintenir et publier sous licences libres ou ouvertes des spécifications, protocoles, briques logicielles et architectures matérielles vérifiables concourant à la transparence des chaînes de confiance ; @@ -50,6 +51,7 @@ La durée de l'association est illimitée. #### Article 5 — Catégories de membres L'association se compose de : + * **Membres sympathisants :** personnes physiques ou morales adhérant aux buts de l'association, à jour de leur cotisation annuelle. Ils participent aux travaux et aux Assemblées Générales avec voix consultative, et disposent de la faculté de refus collective prévue aux présents statuts ; * **Membres titulaires :** personnes physiques ou personnes morales dûment représentées, participant de façon substantielle et active à la gouvernance, à la conformité ou aux opérations critiques de l'association. Ils disposent d'une voix délibérative pleine et entière sur l'ensemble des scrutins ; * **Membres bienfaiteurs :** personnes morales apportant un soutien financier, matériel ou de mise à disposition de locaux/infrastructures significatif (défini par le Règlement Intérieur, supérieur à 5 000 € par an). Cette qualité honorifique n'ouvre aucun droit de vote au sein des Assemblées Générales, préservant l'indépendance de l'association ; @@ -92,6 +94,7 @@ Les fondateurs initiaux, signataires des statuts constitutifs, disposent de plei #### Article 6 — Perte de la qualité de membre La qualité de membre de l'association se perd par : + 1. **La démission :** adressée par écrit au Conseil d'Administration, prenant effet à sa réception ; 2. **Le non-paiement de la cotisation :** * **Régime de droit commun :** Le défaut de paiement de la cotisation annuelle à l'échéance fixée par le Règlement Intérieur, demeuré infructueux trente (30) jours calendaires après mise en demeure par voie électronique, entraîne la **radiation automatique d'office** de l'association. Pour un membre titulaire n'exerçant aucun mandat statutaire ni rôle de confiance actif, le défaut de régularisation emporte la perte immédiate de la qualité de membre titulaire et de ses droits de vote délibératifs. @@ -173,6 +176,7 @@ L’Assemblée Générale comprend tous les membres de l'association. Elle se r #### Article 10 — Domaine réservé de l'Assemblée Générale Relèvent de la compétence exclusive de l'Assemblée Générale, sans délégation possible : + 1. L’élection et la révocation des administrateurs, ainsi que la fixation du nombre de sièges ; 2. L’approbation annuelle des comptes financiers, l'affectation du résultat et le vote du budget prévisionnel ; 3. L’autorisation préalable de tout emprunt ou engagement financier pluriannuel excédant les seuils fixés par le Règlement Intérieur ; @@ -186,6 +190,7 @@ Relèvent de la compétence exclusive de l'Assemblée Générale, sans délégat #### Article 11 — Assemblée Générale Extraordinaire (Régime ordinaire) L'Assemblée Générale Extraordinaire est seule compétente pour modifier les présents statuts ou prononcer la dissolution de l'association, sous réserve des dispositions intangibles prévues aux Articles 8 ter et 13. + 1. **Quorum :** Participation d'au moins **soixante-quinze pour cent (75 %)** des membres titulaires. 2. **Unanimité des votants :** Aucune modification ne peut être adoptée sans recueillir le vote favorable de **cent pour cent (100 %) des membres titulaires participant au scrutin**. 3. **Contrôle global :** Même approuvée à l'unanimité des titulaires votants, la révision est rejetée si la majorité simple des suffrages exprimés par l'ensemble des membres (titulaires et sympathisants réunis prenant part au scrutin) émet un vote d'opposition. @@ -208,6 +213,7 @@ L'Assemblée Générale Extraordinaire est seule compétente pour modifier les p #### Article 11 ter — Régime de la Reconnaissance d'Utilité Publique (RUP) Dans l'hypothèse où l'association viendrait à être reconnue d'utilité publique par décret en Conseil d'État : + * Les clauses et règles de tutelle prévues par les statuts types approuvés par le Conseil d'État se substituent de plein droit aux stipulations des Articles 11 et 11 bis pour les révisions statutaires ; * Le contrôle de légalité, l'approbation préalable par décret ministériel et l'avis conforme du Conseil d'État constituent dès lors le garant institutionnel de l'inaliénabilité des missions d'intérêt général de l'association. @@ -251,6 +257,7 @@ Par dérogation légale impérative, l'association applique les restrictions tec #### Article 13 bis — Continuité d’infrastructure et association successeur Par dérogation aux règles ordinaires de liquidation, l’Assemblée Générale Extraordinaire statuant selon les règles de l'Article 11 peut décider du transfert de tout ou partie des infrastructures, dépôts logiciels, marques et qualifications vers une nouvelle personne morale sans but lucratif (*association successeur*), à la condition expresse et préalable que celle-ci : + * Soit constituée sous forme non lucrative (loi 1901 ou équivalent européen) ; * Reprenne textuellement dans ses statuts les mêmes clauses d'inaliénabilité, d'interdiction de transformation lucrative et d'engagement envers les licences libres ; * S'engage formellement à assurer la continuité intégrale des obligations souscrites auprès des autorités de contrôle et des programmes de confiance internationaux.