Comme nous l'avons vu précédemment dans les autres chapitres, sur un appareil DCI (player, encodeur), vous avez un certificat (publique) qui va servir à la gestion cryptographique de certains éléments comme les KDM, les PKL ou les CPL, entre autres.
Malgré son indépendance toute relative, nous avons remarqué que ce certificat était lié à un autre certificat, son "créateur", son direct parent et appelé un Issuer : c'est le signataire de ce certificat enfant, c'est lui qui l'a créé et signé.
Ce certificat parent - qui donc a un droit de création de certificat - fait partie d'une Autorité de Certification (Certificate Authority ou abbrégé en CA).
Cette hiérarchie est appelée une chaîne de certification (ou Certificate Chain).
Une chaîne de certification appartient à un "constructeur" : un constructeur peut être un constructeur d'un player, d'un encodeur ou tout type de matériel physique, ou même un développeur de logiciel lié au cinéma numérique, ou encore tout autre type d'entité ayant besoin de gérer une chaîne de certification qui sera utile dans le workflow DCI.
Pour chaque matériel, chaque constructeur va générer des certificats pour chacune de ses machines. Ainsi, par un exemple pour un player DCI, le constructeur va créer un certificat publique pour permettre à des laboratoires de créer des KDM pour cette machine (échange sécurisé) ou pour un encodeur de créer un certificat afin de valider les parties signer d'un KDM, d'une PKL ou d'une CPL avec le certificat d'un encodeur.
A la fin de tout ceci, à la question "à qui appartient cette chaîne de certification", vous pourrez enfin dire "à moi" :)
Si nous devions résumer, une chaîne de certification respecte une règle en ayant trois parties majeures distinctes :
La chaîne de certification débute par un certificat tout en haut de la hiérarchie, certificat appelé Root Certificate. C'est le premier certificat qui a été créé dans la hiérarchie et c'est lui qui va chapoter les certificats en lien direct avec lui-même, juste en dessous.
┌────────────┐
│ Root │
└─────┬──────┘
┌───────────────┼─────────────────┐
│ │ │
┌───────▼────┐ ┌──────▼─────┐ ┌───────▼────┐
│ Certificat │ │ Certificat │ │ Certificat │
└────────────┘ └────────────┘ └────────────┘
Ce certificat n'est pas lié à un matériel.
Le certificat parent va permettre la création de sous-branches directes appelées Certificats Intermédiaires (ou Intermediates Certificates). Ces certificats ont le droit de gérer et créer des certificats directement en dessous d'eux. Les certificats en dessous peuvent être, soit des certificats intermédaires avec les mêmes pouvoirs, soit des certificats avec des droits plus restreints appelés Leaf Certificate.
┌─────────────┐ ╮
│ Root │ │
└───────┬─────┘ │
┌───────────────┼─────────────────────┐ │
│ │ │ │
┌──────────▼───┐ ┌─────▼────────┐ ┌───────▼──────┐ │
│ Intermediate │ │ Intermediate │ │ Intermediate │ Niveau 1 │
└──────────┬───┘ └──────┬───────┘ └───────┬──────┘ │-- Authority
│ │ │ │
┌──────────▼───┐ ┌──────▼───────┐ ┌───────▼──────┐ │
│ Intermediate │ │ Intermediate │ │ Intermediate │ Niveau 2 │
└──────────┬───┘ └──────┬───────┘ └───────┬──────┘ │
│ │ │ │
┌──────────▼───┐ ┌──────▼───────┐ ┌───────▼──────┐ │
│ Intermediate │ │ Intermediate │ │ Intermediate │ Niveau 3 │
└──────────┬───┘ └──────┬───────┘ └───────┬──────┘ ╯
. . .
. . .
Il n'y a aucune limite (en dehors du PathLen) aux nombres de niveaux dans les certificats intermédiaires.
Ce type de certificat n'est pas lié à un matériel.
Enfin, en bout de hiérarchie, ces certificats sont appelés Leaf Certificates (feuille en français). Ces certificats ne font pas partie de l'Autorité de Certification car ils n'ont pas le droit de créer des certificats enfants. Ces certificats sont utilisés pour et dans les appareils DCI, tels que des players, des encodeurs, etc.
┌────────────┐ ╮
│ Root │ │
└──────┬─────┘ │
│ │-- Authority
┌───────▼──────┐ │
│ Intermediate │ │
└───────┬──────┘ ╯
│
┌────▼────┐
│ Leaf │
└─────────┘
Ce type de certificat est lié à un matériel.
Voici un exemple parmi d'autres d'une hiérarchie de certificats avec une multitude de certificats intermédiaires et de certificats leafs :
▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅ ╮
█ █ │
█ Root █ │
█ █ │
█▅▅▅▅▅▅▅▅▅▅▅▅▅█ │
╔═════════════╬═════════════════════╗ │
║ ║ ║ │
▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅ ▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅ ▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅ │
█ █ █ █ █ █ │-- Certificate Authority (CA)
█ Intermediate █ █ Intermediate █ █ Intermediate █ │
█ A █ █ B █ █ C █ │
█▅▅▅▅▅▅▅▅▅▅▅▅▅▅█ █▅▅▅▅▅▅▅▅▅▅▅▅▅▅█ █▅▅▅▅▅▅▅▅▅▅▅▅▅▅█ │
│ │ ║ │
┌───────────▼──┐ ┌──▼───────────┐ ▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅ │
│ Leaf │ │ Leaf │ █ █ │
└──────1───────┘ └──────2───────┘ █ Intermediate █ │
█ D █ │
█▅▅▅▅▅▅▅▅▅▅▅▅▅▅█ ╯
┌──────────┼──────────────┐
│ │ │
┌────────▼───┐ ┌────▼───────┐ ┌────▼──────┐
│ Leaf │ │ Leaf │ │ Leaf │
└──────3─────┘ └──────4─────┘ └─────5─────┘
Ainsi :
Les certificats Root, Intermediate A, B, C, et D font tous parties de l'Autorité de Certification. Tous les certificats Leafs en sont exclus.
Pour des raisons de logistique, vous retrouverez assez souvent cette chaîne de certificat dans une PKL (signée) ou une CPL (signée) ou dans un KDM (toujours signée).
Cette chaîne de certificat se trouvera toujours dans la partie Signature -> KeyInfo : le certificat au format PEM dans la partie X509Certificate et l'identité de son parent (Issuer) dans la partie X509IssuerSerial.
Voici un exemple d'une Signature (certaines parties sont tronquées pour apporter plus de lisibilités) :
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
(...)
</ds:SignedInfo>
<!--
C'est ici que sont stockés les certificats
utilisés pour la création du document
(PKL, CPL ou KDM)
-->
<ds:KeyInfo>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>39</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEfzCCA2egAwIBAgIBJzANBgkqhkiG9w0BAQsFADCBgjEh(...)
(...)qfoeTGQ2Vin9a+udU9/jrSFAvHU2lT8neer722G+CzP/zjFD</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=RQ/53RmuLsbzgfPXGlRYmJruwMs=,CN=.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>2</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEdjCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQsFADB/MSEw(...)
(...)4zsyE0AGuj2nDstRBWLRy+5SlCByTIKp/PL/</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=pkCB9j5KrAjndhcBkc3fOdfL/BQ=,CN=.PRODUCTS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>4</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEdDCCA1ygAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBhDEh(...)
(...)AAVM+A/J+q+14LJqcElnzHkvNTv2Qvp5+g==</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=,CN=.ROOT.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>2</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEdjCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBgDEh(...)
(...)tIY/GaHgNIVKoTRvgq7YXTVnvGqgolL1zwDx</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=,CN=.ROOT.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>1</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEcjCCA1qgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgDEh(...)
(...)Bw/YZzykpHYmuzBxLriBb5TYsWziILI=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
Leurs présences à la fin d'une PKL, d'une CPL ou d'un KDM permettent au destinataire de pouvoir valider de bout en bout la signature des documents, mais attention à l'usurpation de chaîne de certification : rien ne garantit que les différents certificats ajoutés appartiennent au dit-constructeur, il faudra donc vérifier avec la base de certificats du constructeur ou au moins son certificat publique racine.
Les certificats se tiennent par des liens hiérarchiques par le biais de certains champs stockés dans le certificat : via certains champs du bloc Metadonnées et via certains champs du bloc x509v3 Extensions :
Déjà, nous avons vu qu'un certificat va adresser son parent via le champ Issuer. L'Issuer est le Subject du certificat parent :
Parent (Intermediate certificate)
+----------------------------------------------------------------------------------------------------------------------------------------------+
| Issuer : dnQualifier = "RQ/53RmuLsbzgfPXGlRYmJruwMs=", CN=.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM |
╭───|─── Subject : dnQualifier = "+LLvuYNO4YBJSp9Jjmlv8oippzQ=", CN=.DC.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM |
│ +----------------------------------------------------------------------------------------------------------------------------------------------+
│
│ Parent (Intermediate certificate)
│ +-------------------------------------------------------------------------------------------------------------------------------------
╰───|─── Issuer : dnQualifier = "+LLvuYNO4YBJSp9Jjmlv8oippzQ=", CN=.DC.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM |
| Subject : dnQualifier = "SQFYSSqWwjefppqasMJmfdmS6lI=", CN=CS.DMSJP2K-80119.DC.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM |
+------------------------------------------------------------------------------------------------------------------------------------------------+
Nous avons également un lien hiérarchique dans la partie x509v3 Extensions avec l'Authority Key Identifier. Ainsi les différents champs de l'Authority Key Identifier du certificat enfant font références aux champs Issuer, Subject Key Identifier et SerialNumber du certificat parent :
Parent (Intermediate certificate) +------------------------------------------------------------------------------------------------------------------------------------- ╭──────────|──Serial Number: 2 (0x2) ╭──────────|──Issuer : dnQualifier = "RQ/53RmuLsbzgfPXGlRYmJruwMs=", CN=.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM │ |X509v3 Subject Key Identifier : │ ╔═════|══F8:B2:EF:B9:83:4E:E1:80:49:4A:9F:49:8E:69:6F:F2:88:A9:A7:34 │ ║ +------------------------------------------------------------------------------------------------------------------------------------- │ ║ │ ║ Enfant (Leaf Certificate) │ ║ +------------------------------------------------------------------------------------------------------------------------------------- │ ║ |X509v3 Authority Key Identifier : │ ╚═════|══keyid : F8:B2:EF:B9:83:4E:E1:80:49:4A:9F:49:8E:69:6F:F2:88:A9:A7:34 ╰──────────|──DirName : /dnQualifier=RQ/53RmuLsbzgfPXGlRYmJruwMs=/CN=.DMS.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM ╰──────────|──serial:02 +--------------------------------------------------------------------------------------------------------------------------------------
Le champ Subject Key Identifier et l'attribut dnQualifier sont les empreintes du certificat. Pour plus d'informations, reportez-vous au chapitre Subject Key Identifier ou au chapitre Public Key Thumbprint - dnQualifier
Chaque certificat fait lien avec son prédécesseur jusqu'au certificat racine.
Un exemple avec une chaîne de certificats Doremi avec 3 intermédiaires, un certificat racine et un certificat leaf :
# 1er X509Certificate (encoder) - leaf certificate ╭---------------------------------- Issuer : dnQualifier = "+LLvuYNO4YBJSp9Jjmlv8oippzQ=", CN=.DC.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM | Subject : dnQualifier = "SQFYSSqWwjefppqasMJmfdmS6lI=", CN=CS.DMSJP2K-80119.DC.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM | Serial Number: 643 (0x283) | --- | X509v3 Subject Key Identifier : | 49:01:58:49:2A:96:C2:37:9F:A6:9A:9A:B0:C2:66:7D:D9:92:EA:52 | X509v3 Authority Key Identifier : | ╔══════════ keyid : F8:B2:EF:B9:83:4E:E1:80:49:4A:9F:49:8E:69:6F:F2:88:A9:A7:34 | ╭────────────────║────────── DirName : /dnQualifier=RQ/53RmuLsbzgfPXGlRYmJruwMs=/CN=.DMS.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM | │ ║ ╭────── serial:02 | │ ║ │ | │ ║ │ # 2eme X509Certificate (dc) - intermediate certificate | ╭-------╰────────────────║───│── Issuer : dnQualifier = "RQ/53RmuLsbzgfPXGlRYmJruwMs=", CN=.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM ╰--|------------------------║---│-- Subject : dnQualifier = "+LLvuYNO4YBJSp9Jjmlv8oippzQ=", CN=.DC.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM | ║ ╰── Serial Number: 2 (0x2) | ║ --- | ║ X509v3 Subject Key Identifier : | ╚══════════ F8:B2:EF:B9:83:4E:E1:80:49:4A:9F:49:8E:69:6F:F2:88:A9:A7:34 | X509v3 Authority Key Identifier : | ╔══════════ keyid : 45:0F:F9:DD:19:AE:2E:C6:F3:81:F3:D7:1A:54:58:98:9A:EE:C0:CB | ╭────────────║────────── DirName : /dnQualifier=pkCB9j5KrAjndhcBkc3fOdfL/BQ=/CN=.PRODUCTS.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM | │ ║ ╭────── serial:04 | │ ║ │ | │ ║ │ # 3eme X509Certificate (dms) - intermediate certificate | ╭--------╰────────────║───│── Issuer : dnQualifier = "pkCB9j5KrAjndhcBkc3fOdfL/BQ=", CN=.PRODUCTS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM ╰--|---------------------║---│-- Subject : dnQualifier = "RQ/53RmuLsbzgfPXGlRYmJruwMs=", CN=.DMS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM | ║ ╰── Serial Number: 4 (0x4) | ║ --- | ║ X509v3 Subject Key Identifier : | ╚══════════ 45:0F:F9:DD:19:AE:2E:C6:F3:81:F3:D7:1A:54:58:98:9A:EE:C0:CB | X509v3 Authority Key Identifier: | ╔══════════ keyid : A6:40:81:F6:3E:4A:AC:08:E7:76:17:01:91:CD:DF:39:D7:CB:FC:14 | ╭────────║────────── DirName : /dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=/CN=.ROOT.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM | │ ║ ╭────── serial:02 | │ ║ │ | │ ║ │ # 4eme X509Certificate (product) - intermediate certificate | ╭---------╰────────║───│── Issuer : dnQualifier = "a/wUIHLuFW7RKXpNQGmQ966xOv8=", CN=.ROOT.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM ╰--|------------------║---│-- Subject : dnQualifier = "pkCB9j5KrAjndhcBkc3fOdfL/BQ=", CN=.PRODUCTS.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM | ║ ╰── Serial Number: 2 (0x2) | ║ --- | ║ X509v3 Subject Key Identifier: | ╚══════════ A6:40:81:F6:3E:4A:AC:08:E7:76:17:01:91:CD:DF:39:D7:CB:FC:14 | X509v3 Authority Key Identifier: | ╔══════════ keyid : 6B:FC:14:20:72:EE:15:6E:D1:29:7A:4D:40:69:90:F7:AE:B1:3A:FF | ╭────────║────────── DirName : /dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=/CN=.ROOT.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM | │ ║ ╭────── serial:01 | │ ║ │ | │ ║ │# 5eme X509Certificate (root) - root certificate | ╰────────║───│── Issuer : dnQualifier = "a/wUIHLuFW7RKXpNQGmQ966xOv8=", CN=.ROOT.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM ╰------------------║---│-- Subject : dnQualifier = "a/wUIHLuFW7RKXpNQGmQ966xOv8=", CN=.ROOT.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM ║ ╰── Serial Number: 1 (0x1) ║ --- ║ X509v3 Subject Key Identifier: ╚══════════ 6B:FC:14:20:72:EE:15:6E:D1:29:7A:4D:40:69:90:F7:AE:B1:3A:FF X509v3 Authority Key Identifier: keyid : 6B:FC:14:20:72:EE:15:6E:D1:29:7A:4D:40:69:90:F7:AE:B1:3A:FF DirName : /dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=/CN=.ROOT.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM serial:01
Si vous avez remarqué, le certificat racine s'auto-adresse. Il est lui-même son propre père, son Subject et son Issuer seront les mêmes :
╭──────────────Issuer : dnQualifier = "a/wUIHLuFW7RKXpNQGmQ966xOv8=", CN=.ROOT.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM ╭──────────────Subject : dnQualifier = "a/wUIHLuFW7RKXpNQGmQ966xOv8=", CN=.ROOT.DC2.SMPTE, OU=DC.DOREMILABS.COM, O=DC2.SMPTE.DOREMILABS.COM │ (...) │ X509v3 Subject Key Identifier: │╔═════════ 6B:FC:14:20:72:EE:15:6E:D1:29:7A:4D:40:69:90:F7:AE:B1:3A:FF │║ X509v3 Authority Key Identifier: │╚═════════ keyid : 6B:FC:14:20:72:EE:15:6E:D1:29:7A:4D:40:69:90:F7:AE:B1:3A:FF ╰──────────────────DirName : /dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=/CN=.ROOT.DC2.SMPTE/OU=DC.DOREMILABS.COM/O=DC2.SMPTE.DOREMILABS.COM
On appelle cela un certificat self-signed et la norme oblige à finaliser la chaîne de certificat avec un certificat self-signed : A complete certificate chain (..) ends with a self-signed (CA root) certificate. et A CA Root certificate that is not self-signed shall be cause to fail this test. -- CTP