3 votes

Comment envelopper la clé Microsoft RSA dans le HSM ?

J'ai besoin d'envelopper une RSAPrivateKey dans un HSM, de sorte qu'elle puisse être envoyée à un CA Microsoft pour l'archivage de la clé et je ne suis pas sûr de l'approche à adopter.

Le problème est que le format de clé RSA de Microsoft est propriétaire et ne semble pas être pris en charge par pkcs11 ou le HSM nCipher que ma société utilise.

http://msdn.microsoft.com/en-us/library/cc250013.aspx

S'il s'agissait simplement d'une RSAPrivateKey, il serait simple de générer la paire de clés dans le HSM, de charger la clé d'enveloppement dans le HSM, d'envelopper la RSAPrivateKey et d'extraire les octets de la clé enveloppée. Mais comme ce format de clé n'est pas pris en charge, je dois adopter une approche différente.

Ma première idée a été d'étendre RSAPrivateKey et de surcharger la méthode getEncoded() pour retourner ce format de clé propriétaire. J'utilise le wrapper IAIK pkcs11 qui fournit une API de haut niveau pour pkcs11 en Java et il y a un certain support pour créer des types de clés définis par le vendeur. Cependant, l'interface pour les clés définies par le fournisseur semble n'exister que comme une commodité pour étendre les types de clés intégrés dans le code client et ne permet pas réellement de modifier l'encodage des clés dans le HSM.

La deuxième idée était d'utiliser un objet de données pkcs11 et de le traiter simplement comme le blob de la clé, puis de le chiffrer avec la clé enveloppante. Le même problème se pose ici : pour copier les octets de la clé privée dans l'objet de données, il semble que je doive extraire les octets de la clé privée dans le code de l'application, puis créer l'objet de données à partir de là, ce qui va à l'encontre de l'intérêt de disposer des clés dans le HSM.

Je cherche des alternatives à ces approches ou peut-être y a-t-il une fonctionnalité de pkcs11 que j'ai négligée et qui me permettrait de le faire ? Tout commentaire serait apprécié.

2voto

Duncan Points 22780

Je suis d'accord pour dire que cela ressemble à un format de données qui n'est pas supporté par les HSMs de nShield (cela peut valoir la peine de vérifier cela avec le système de gestion des données de nShield). équipe de soutien cependant).

En supposant que ce soit le cas, il n'y a qu'un seul moyen de le faire en toute sécurité : il faut utiliser une API de niveau beaucoup plus bas pour charger la clé privée et la transmettre à un code sur mesure exécuté dans le HSM (en utilisant la technologie CodeSafe), qui exposerait le matériau de la clé, le traduirait dans le format nécessaire et l'envelopperait avec la clé enveloppante.

Toute autre approche entraînera une exposition des clés sur l'hôte. De plus, si vous avez généré votre clé avec des permissions raisonnables (par défaut), vous ne pouvez de toute façon pas exposer la clé sans écrire un code sur mesure qui utilise votre jeu de cartes d'administrateur.

Je vous suggère de contacter l'équipe d'assistance à ce sujet. Vous pourriez même être mis en relation avec des consultants sympathiques, toussant, qui pourraient vous aider.

0voto

Thijs Points 99

Ce que vous voulez probablement faire, c'est utiliser un wrapper PKCS#11. Je suis un peu confus si vous interagissez avec le HSM depuis Java (puisque vous mentionnez IAIK) ou depuis .Net puisque vous voulez exporter vers un RSAPrivateKey de Microsoft. Quoi qu'il en soit, un wrapper PKCS11 (IAIK pour Java, NCryptoki pour .Net) vous permettra de communiquer avec le HSM à l'aide de PKCS#11 v2.30 Si vous n'êtes pas en mesure de répondre à toutes les questions, assurez-vous de vérifier la version supportée dans les spécifications de votre wrapper et de votre HSM, car il peut y avoir des incompatibilités entre les versions.

PKCS#11 vous permet de générer une paire de clés RSA dans votre HSM à l'aide de la fonction C_GenerateKeyPair. Vous devrez spécifier un mécanisme (RSA_PKCS_KEY_PAIR_GEN) et fournir deux modèles, un pour la clé privée et un pour la clé publique. Assurez-vous que l'attribut CKA_WRAP de la clé privée est défini sur true.

Pour charger la clé enveloppante dans le HSM, la fonction C_CreateObject peut être utilisée en combinaison avec un modèle.

Vous pouvez ensuite utiliser la fonction C_WrapKey pour envelopper la clé RSA privée avec la clé que vous avez importée dans le HSM. Utilisez d'abord les fonctions C_FindObjectsInit, C_FindObjects et C_FindObjectsFinal pour récupérer les handles de la clé à envelopper et de la clé d'enveloppement. Appelez ensuite la fonction C_WrapKey avec le mécanisme approprié et les deux handles.

0voto

owlstead Points 22329

S'il s'agit d'un format propriétaire non pris en charge, vous devrez peut-être exécuter un code propriétaire dans le HSM pour y parvenir. De nombreux HSM vous permettent d'exécuter du code propriétaire, mais vous aurez besoin de l'aide du fournisseur du HSM pour pouvoir charger le code en premier lieu. En outre, l'exécution de votre propre code dans un HSM peut entraîner une rupture de la certification de sécurité (FIPS ou critères communs).

Sinon, vous devrez récupérer la clé privée du HSM, la mettre au bon format dans un environnement sécurisé et l'emballer en utilisant les fonctions de cryptage normales du HSM. Bien entendu, la clé privée sera alors exposée à l'extérieur du HSM.

Vous pouvez également demander à Microsoft s'il a une solution préférée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X