Importer et exporter des clés sur OVHcloud KMS avec BYOK
Découvrez comment importer et exporter en toute sécurité du matériel de clé chiffré avec OVHcloud KMS grâce à l'encapsulation RSA asymétrique (BYOK)
Objectif
Bring Your Own Key (BYOK) vous permet d'importer et d'exporter du matériel cryptographique avec OVHcloud Key Management Service (KMS) sans l'envoyer en clair. Une paire de clés RSA de transport protège le matériel en transit : la clé publique l'encapsule et seul le détenteur de la clé privée peut le désencapsuler.
Ce guide vous explique comment importer et exporter une clé avec OVHcloud KMS en utilisant l'encapsulation de clé RSA asymétrique (BYOK).
Le BYOK via KMIP n'est pas encore disponible. Ce guide couvre uniquement l'API REST régionale, la CLI OKMS et le SDK Go.
Les clés avec le niveau de protection HSM suivent des règles supplémentaires, que ce soit comme clés de transport ou comme clés importées ou exportées. Reportez-vous à la section « Utiliser le BYOK avec des clés HSM ».
Prérequis
- Disposer d'un compte client OVHcloud.
- Avoir commandé un OVHcloud KMS.
- Avoir configuré une méthode d'authentification pour le plan de données OKMS (jeton d'accès personnel, compte de service ou certificat d'accès).
- Pouvoir appliquer une politique IAM sur votre domaine OKMS ; les actions BYOK requises sont listées dans la section « Configurer IAM pour le BYOK ».
- Optionnel : avoir installé la CLI OKMS (version 0.6.0 ou ultérieure) ou le SDK Go pour les exemples en onglets.
En pratique
Comprendre la cérémonie d'encapsulation RSA
La cérémonie implique deux environnements et un opérateur :
- Destination (Dst) : votre domaine OKMS, où la clé importée est stockée.
- Source (Src) : le système qui détient actuellement le matériel de clé (un autre KMS, une application ou un outil tel qu'OpenSSL).
- Operator : l'entité disposant des autorisations nécessaires pour accéder à la fois au domaine OKMS et à la source de la clé à importer. Il peut s'agir d'une personne utilisant le CLI OKMS ou d'un service passant par l'API.
- Générez une paire de clés RSA de transport sur OVHcloud KMS avec les opérations
wrapKeyetunwrapKey. - Exportez la clé de transport publique depuis OVHcloud KMS.
- Importez la clé de transport publique dans l'environnement source.
- Sur la source, exportez le matériel de clé encapsulé (chiffré) avec la clé de transport en utilisant
RSA-OAEPouRSA-OAEP-256. - Sur la destination, importez la clé encapsulée avec
POST /api/{okmsId}/v1/servicekeyet une charge utilewrappedKeys. Le KMS désencapsule le ciphertext avec la clé de transport privée et stocke la clé de service résultante.
Les clés ainsi importées ont never_extractable défini à false, car le matériel existait en dehors du KMS avant l'import. Pour extraire ultérieurement une clé sous forme encapsulée, importez-la avec extractable défini à true (il ne peut pas être activé ensuite) et suivez la section « Exporter une clé encapsulée ». Consultez la section « Attributs de sensibilité des clés de service » pour obtenir la liste complète des attributs.
Deux valeurs de votre domaine OKMS sont nécessaires pour suivre ce guide : son endpoint régional et son okmsId. Les appels à l'API REST les portent tous deux dans l'URL, tandis que le CLI OKMS et le SDK Go les lisent dans leur configuration. Les deux sont renvoyés par l'appel API suivant :
Ils figurent également dans l'onglet Informations générales du .
Préférez cette cérémonie à l'import de clé en clair lorsque la clé doit rester digne de confiance pendant le transit.
Configurer IAM pour le BYOK
Appliquez une politique à la ressource de votre domaine OKMS. Son URN est affiché dans l'onglet Informations générales du . Remplacez <identity_urn> et <okms_urn> par vos valeurs. Créez les politiques via l'espace client OVHcloud ou l'API OVHcloud.
Import BYOK — lire, créer ou importer des clés de service et désencapsuler avec une clé de transport :
Export BYOK — importer une clé de transport publique, mettre à jour l'extractibilité et encapsuler une clé pour l'export :
Pour l'import, serviceKey/unwrapKey doit être autorisé sur la clé de transport RSA référencée par wrappingKeyId. Pour l'export, importez d'abord la clé de transport publique de destination (create / import), puis autorisez serviceKey/wrapKey sur cette clé de transport et serviceKey/get sur la clé exportée. serviceKey/update est requis pour définir extractable à false après l'export.
Créer la clé de transport RSA sur le KMS de destination
Créez une clé RSA dédiée à l'encapsulation. Pour la cérémonie d'import, définissez à la fois wrapKey et unwrapKey sur cette clé ; elles sont mutuellement exclusives avec sign et verify.
Tailles de clé RSA prises en charge : 2048, 3072 ou 4096 bits.
SOFTWARE est le niveau de protection par défaut, vous n'avez donc pas besoin de le définir.
Conservez l'id de la clé renvoyée — vous en avez besoin comme wrappingKeyId lors de l'import.
Obtenir la clé de transport publique
Exportez la partie publique de la clé de transport et transmettez-la à l'environnement source. Ne partagez jamais la clé privée — elle reste à l'intérieur du KMS de destination.
La réponse inclut le matériel de clé publique dans le tableau keys (JWK).
Encapsuler le matériel de clé source
Sur l'environnement source, chiffrez le matériel de clé avec la clé RSA publique de destination.
Cette étape se déroule en dehors d'OVHcloud KMS : utilisez une bibliothèque JOSE sur l'environnement source.
Algorithmes d'encapsulation pris en charge (RFC 7518) :
keyFormatType décrit le format du matériel de clé en clair avant encapsulation et après désencapsulation. Le ciphertext est toujours une chaîne JWE Compact Serialization (l'algorithme d'encapsulation est porté dans l'en-tête JWE).
Après encapsulation avec la clé publique de destination, envoyez le ciphertext JWE Compact Serialization obtenu dans la requête d'import. Pour un exemple en Go de cette étape d'encapsulation, reportez-vous à la section « Exemple de bout en bout en Go ».
Importer la clé encapsulée
Appelez POST /api/{okmsId}/v1/servicekey avec un tableau wrappedKeys au lieu de keys en clair.
Chaque entrée de wrappedKeys :
Vous pouvez importer une clé uniquement publique (class devient PUBLIC_KEY) ou une clé privée (le KMS reconstruit la partie publique ; class devient KEY_PAIR). Le matériel symétrique est stocké comme SECRET_KEY.
Actions IAM sur cet appel : okms:apikms:serviceKey/create, okms:apikms:serviceKey/import et okms:apikms:serviceKey/unwrapKey sur la clé de transport.
Valeurs de keyFormatType : RAW, JWK, PKCS1 ou PKCS8.
Vérifier la clé importée
Confirmez que la clé existe et correspond au type et aux opérations attendus.
Vérifiez que :
- l'état (
state) de la clé estactive(ou activez-la si votre workflow l'exige). type,sizeetoperationscorrespondent à ce que vous attendez.- les attributs de sensibilité sous
attributesreflètent une clé importée (never_extractablevautfalse).
Vous pouvez ensuite utiliser la clé pour encrypt, decrypt, sign ou verify, comme documenté dans le guide « Utiliser votre OVHcloud Key Management Service (KMS) ».
Exporter une clé encapsulée
L'export sécurisé est l'inverse de l'import : OVHcloud KMS chiffre le matériel de clé avec une clé de transport RSA et ne renvoie qu'un ciphertext JWE. La clé de transport privée doit résider dans l'environnement de destination — ici le système externe qui reçoit la clé, et non OVHcloud KMS — afin que seul cet environnement puisse désencapsuler le matériel.
Comprendre la cérémonie d'export
- Générez une paire de clés RSA de transport sur l'environnement de destination (un autre KMS ou un outil qui recevra la clé).
- Importez la clé de transport publique de destination dans OVHcloud KMS avec l'opération
wrapKey. Cette clé est lewrappingKeyIdutilisé au moment de l'export. - Sur OVHcloud KMS, exportez la clé de service encapsulée par cette clé de transport. La clé doit avoir été créée ou importée avec
extractabledéfini àtrue. Définissez ensuiteextractableàfalselorsque c'est possible. - Transférez le ciphertext vers la destination et désencapsulez-le avec la clé de transport privée de destination.
Ne générez pas la paire de clés de transport d'export sur OVHcloud KMS. Si la clé de transport privée restait dans OVHcloud KMS, la destination ne pourrait pas désencapsuler le ciphertext. Seule la partie publique est importée dans OVHcloud KMS pour l'encapsulation.
La clé de transport référencée par wrappingKeyId doit être une clé RSA dans le même domaine OKMS, avec l'usage wrapKey. Pour exporter une clé stockée dans le HSM, reportez-vous à la section « Utiliser le BYOK avec des clés HSM ». Les clés sensibles (matériel AES/oct et RSA/EC privé) ne peuvent être extraites qu'après encapsulation — l'extraction en clair n'est pas prise en charge pour ces clés.
Importer la clé de transport publique de destination dans OVHcloud KMS
Enregistrez la clé publique de destination pour qu'OVHcloud KMS puisse encapsuler la clé exportée avec elle. Importez-la comme clé RSA uniquement publique avec wrapKey (sans matériel privé).
Conservez l'id de la clé renvoyée comme wrappingKeyId.
Activer l'extraction
La clé que vous exportez doit être extractible, et cela se décide à la création ou à l'import de la clé. Ensuite, extractable peut uniquement passer de true à false : une fois défini à false, il ne peut plus jamais être remis à true. Une clé créée ou importée sans extractable défini à true ne pourra donc jamais être exportée. Cette règle s'applique aussi bien aux clés SOFTWARE qu'aux clés HSM.
Activer l'extraction réduit le périmètre de protection de la clé, et une clé créée avec extractable défini à true a définitivement never_extractable défini à false. Ne créez une clé extractible que si vous prévoyez de la migrer.
Définissez extractable à true lors de la création de la clé :
Pour un import, définissez "extractable": true dans le corps de la requête (API REST), ajoutez --extractable (CLI OKMS) ou passez okms.WithExtractable(true) (SDK Go).
Lorsque la clé n'a plus besoin d'être exportée, par exemple après un export encapsulé réussi (reportez-vous à la section « Exporter la clé encapsulée par la clé de transport »), désactivez l'extraction. Cette opération est irréversible. Action IAM : okms:apikms:serviceKey/update.
Exporter la clé encapsulée par la clé de transport
Appelez GET /api/{okmsId}/v1/servicekey/{keyId} avec les paramètres de requête d'encapsulation ci-dessous. Lorsque ces paramètres sont présents, l'API renvoie wrappedKeys au lieu de keys en clair.
Actions IAM : okms:apikms:serviceKey/get sur la clé exportée, et okms:apikms:serviceKey/wrapKey sur la clé de transport.
Exemple de réponse :
Désencapsuler le ciphertext sur la destination
Transférez le ciphertext vers l'environnement de destination. Désencapsulez-le avec la clé de transport privée de destination (la contrepartie de la clé publique que vous avez importée dans OVHcloud KMS).
- Si la destination est un autre domaine OKMS, importez-y le matériel encapsulé avec
wrappedKeyscomme dans la section « Importer la clé encapsulée », en utilisant l'identifiant de la clé de transport de ce domaine commewrappingKeyId. - Si la destination est un système externe, utilisez son API native de désencapsulation ou d'import, avec la clé de transport privée, le même
keyFormatTypeet le même algorithme d'encapsulation qu'à l'export.
Utiliser le BYOK avec des clés HSM
Avec le niveau de protection HSM, le matériel de clé est encapsulé et désencapsulé à l'intérieur du HSM : il n'apparaît jamais en clair dans OVHcloud KMS. Le format JWE est le même que pour les clés SOFTWARE (RSA-OAEP ou RSA-OAEP-256 avec A256GCM).
Le niveau de protection HSM n'est pas disponible dans toutes les régions. Pour vérifier sa disponibilité dans la région de votre domaine OKMS, consultez la liste protectionLevel renvoyée pour cette région par l'appel API suivant :
La clé de transport doit être stockée dans le HSM dès que la clé importée ou exportée y est stockée, comme le résume le tableau ci-dessous :
Les imports dans le HSM décrits ci-dessous ne sont présentés qu'avec l'API REST.
Créer une clé de transport HSM
Pour importer une clé dans le HSM, créez la clé de transport avec le niveau de protection HSM :
Exportez ensuite sa clé publique et encapsulez le matériel de clé sur la source, comme décrit dans les sections « Obtenir la clé de transport publique » et « Encapsuler le matériel de clé source ».
Importer une clé dans le HSM
Comme le HSM n'expose jamais le matériel désencapsulé, OVHcloud KMS ne peut pas déduire le type de clé. La requête d'import diffère de celle d'un import SOFTWARE :
- Définissez
protectionLevelàHSM. La clé de transport doit elle aussi être une cléHSM. - Déclarez
type:oct,RSAouEC. Ne définissez passizenicurvepourRSAetEC: le HSM les lit à partir de la clé. Pouroct,sizeest facultatif (128,192ou256). - Ne définissez pas
keyFormatTypedanswrappedKeys. Le texte en clair encapsulé dans le JWE doit correspondre aux octets bruts de la clé pour une cléoct, et à la clé privée en PKCS#8 (DER) pour une cléRSAouEC. - Clés prises en charge : AES
128,192ou256bits, RSA2048,3072ou4096bits, ECP-256,P-384ouP-521. Une clé publique seule ne peut pas être importée encapsulée dans le HSM : seul l'import en clair est possible.
Une clé de transport HSM peut aussi désencapsuler une clé SOFTWARE : dans ce cas, suivez la section « Importer la clé encapsulée » avec keyFormatType.
Exporter une clé depuis le HSM
Seules les clés symétriques (oct) peuvent être exportées depuis le HSM : le HSM ne libère jamais les clés privées RSA ou EC. Comme pour une clé SOFTWARE, la clé doit avoir été créée ou importée avec extractable défini à true, ce qui ne peut pas être activé ensuite (reportez-vous à la section « Activer l'extraction »).
La clé de transport doit être stockée dans le HSM. Importez la clé de transport publique de destination avec le niveau de protection HSM :
Exportez ensuite la clé en définissant wrappedKeyFormat à RAW : le HSM encapsule toujours les octets bruts de la clé, donc la charge utile du JWE déchiffré est la clé AES elle-même (32 octets pour une clé de 256 bits).
Sur la destination, déchiffrez le JWE avec la clé de transport privée, comme décrit dans la section « Désencapsuler le ciphertext sur la destination ».
Exemple de bout en bout en Go
Les exemples suivants déroulent les deux cérémonies sur une paire de clés RSA, en utilisant le SDK Go pour les appels à OVHcloud KMS et go-jose pour les opérations JWE réalisées en dehors d'OVHcloud KMS. Les deux exemples encodent le matériel de clé en PKCS#8 (DER), ce qui correspond à la valeur PKCS8 de keyFormatType.
Importer une clé générée localement
Le programme génère la clé avec la bibliothèque standard Go, l'encapsule localement avec la clé de transport publique, puis l'importe. Le matériel de clé n'est jamais envoyé en clair à OVHcloud KMS.
L'algorithme de chiffrement du contenu JWE (enc) doit être A256GCM.
Exporter une clé et déchiffrer le JWE
La destination (ici, le programme local) génère la paire de clés de transport, importe uniquement sa partie publique dans OVHcloud KMS, puis déchiffre, avec la partie privée, le JWE exporté.
Aller plus loin
Utiliser votre OVHcloud Key Management Service (KMS)
Méthodes d'authentification OKMS
Premiers pas avec OVHcloud Key Management Service (KMS)
Échangez avec notre communauté d'utilisateurs.