Tous les produits
Search
Centre de documentation

Key Management Service:Importer le matériel de clé pour une clé asymétrique

Dernière mise à jour :Aug 10, 2026

Lorsque vous créez une clé asymétrique avec une source de matériel de clé externe, KMS ne génère pas de matériel de clé. Vous devez importer votre propre matériel de clé. Cette rubrique décrit la procédure d'importation du matériel de clé pour une clé asymétrique.

Important

Si votre instance de gestion logicielle des clés ou votre instance de gestion matérielle des clés ne prend pas en charge l'importation de matériel de clé, ou si l'importation échoue, contactez le support technique d'Alibaba Cloud pour mettre à niveau votre instance.

Fonctionnalités

Dans les secteurs réglementés, les audits de conformité exigent souvent que vous prouviez la garde exclusive du matériel de clé cryptographique. Lorsque vous créez une clé asymétrique avec une source de matériel de clé externe, Key Management Service (KMS) ne génère pas de matériel de clé : vous fournissez et importez le vôtre. Ce processus est connu sous le nom de Bring Your Own Key (BYOK).

Type de gestion des clés

Importer du matériel de clé asymétrique

Clé par défaut

  • Customer master key : Non pris en charge

  • Service key : Non pris en charge

Clé protégée par logiciel

Pris en charge

Clé protégée par matériel

Pris en charge

Remarques sur l'utilisation

  • Après la première importation du matériel de clé, la clé est liée à ce matériel et n'autorise plus l'importation d'un autre matériel de clé.

  • Vous pouvez importer plusieurs fois le même matériel de clé dans une clé KMS selon vos besoins, mais vous ne pouvez pas importer différents matériels de clé dans une seule clé KMS.

  • Si le matériel de clé d'une clé expire ou est supprimé, vous pouvez importer à nouveau le même matériel de clé pour rendre la clé à nouveau disponible. Le matériel de clé ne peut pas être exporté après son importation. Stockez-le correctement.

Portée

Une instance KMS est achetée et activée. Pour plus d'informations, consultez Acheter et activer une instance KMS.

Importer le matériel de clé dans la console KMS

Étape 1 : Créer une clé asymétrique avec une source de matériel de clé externe

Avant d'importer le matériel de clé, créez une clé asymétrique avec une source de matériel de clé externe.

Clé protégée par logiciel

  1. Connectez-vous à la console Key Management Service. Dans la barre de navigation supérieure, sélectionnez une région. Dans le volet de navigation de gauche, choisissez Resource > Keys.

  2. Sous l'onglet Customer Master Keys, sélectionnez une instance de gestion logicielle des clés dans la liste déroulante Instance ID, puis cliquez sur Create Key.

  3. Dans le panneau Create Key, configurez les paramètres, puis cliquez sur OK.

    Paramètre

    Description

    Key Type

    Sélectionnez Asymmetric Key.

    Key Specifications

    Spécifications de clé asymétrique : RSA_2048, RSA_3072, RSA_4096, EC_P256 et EC_P256K.

    Key Usage

    Utilisation de la clé. Valeurs possibles :

    • Encrypt/Decrypt : chiffre et déchiffre les données.

    • Sign/Verify : génère et vérifie les signatures numériques.

    Key Alias

    Alias de la clé. Les lettres, chiffres, traits de soulignement (_), tirets (-) et barres obliques (/) sont acceptés.

    Tags

    Les tags de la clé, qui permettent de classer les clés. Chaque tag se compose d'une paire clé-valeur.

    Remarque
    • Format d'une clé de tag et d'une valeur de tag : Une clé de tag ou une valeur de tag peut comporter jusqu'à 128 caractères et contenir des lettres, des chiffres, des barres obliques (/), des barres obliques inverses (\), des traits de soulignement (_), des tirets (-), des points (.), des signes plus (+), des signes égal (=), des deux-points (:), des arobases (@) et des espaces.

    • Une clé de tag ne peut pas commencer par aliyun ni par acs:.

    • Chaque clé prend en charge jusqu'à 20 paires clé-valeur de tag.

    Description

    Description de la clé.

    Advanced Settings

    • Policy Settings : Pour plus d'informations, consultez Présentation des politiques de clé.

    • Key Material Origin : Sélectionnez External (Import Key Material).

      Remarque

      Lisez attentivement et sélectionnez I understand the methods and implications of using external key material.

Clé protégée par matériel

  1. Connectez-vous à la console Key Management Service. Dans la barre de navigation supérieure, sélectionnez une région. Dans le volet de navigation de gauche, choisissez Resource > Keys.

  2. Sous l'onglet Customer Master Keys, sélectionnez une instance de gestion matérielle des clés dans la liste déroulante Instance ID, puis cliquez sur Create Key.

  3. Dans le panneau Create Key, configurez les paramètres, puis cliquez sur OK.

    Paramètre

    Description

    Key Type

    Sélectionnez Asymmetric Key.

    Key Specifications

    Spécifications de clé asymétrique : RSA_2048, RSA_3072, RSA_4096, EC_P256, EC_P256K

    Key Usage

    Utilisation de la clé. Valeurs possibles :

    • Encrypt/Decrypt : chiffre et déchiffre les données.

    • Sign/Verify : génère et vérifie les signatures numériques.

    Key Alias

    Alias de la clé. Les lettres, chiffres, traits de soulignement (_), tirets (-) et barres obliques (/) sont acceptés.

    Tags

    Les tags de la clé, qui permettent de classer les clés. Chaque tag se compose d'une paire clé-valeur.

    Remarque
    • Format d'une clé de tag et d'une valeur de tag : Une clé de tag ou une valeur de tag peut comporter jusqu'à 128 caractères et contenir des lettres, des chiffres, des barres obliques (/), des barres obliques inverses (\), des traits de soulignement (_), des tirets (-), des points (.), des signes plus (+), des signes égal (=), des deux-points (:), des arobases (@) et des espaces.

    • Une clé de tag ne peut pas commencer par aliyun ni par acs:.

    • Chaque clé prend en charge jusqu'à 20 paires clé-valeur de tag.

    Description

    Description de la clé.

    Advanced Settings

    • Policy Settings : Pour plus d'informations, consultez Présentation des politiques de clé.

    • Key Material Origin : Sélectionnez External (Import Key Material).

      Remarque

      Lisez attentivement et sélectionnez I understand the methods and implications of using external key material.

Étape 2 : Télécharger une clé publique de chiffrement et un jeton d'importation

Les paramètres d'importation du matériel de clé incluent une clé publique de chiffrement et un jeton d'importation. La clé publique de chiffrement sert à chiffrer le matériel de clé et à le protéger pendant le processus d'importation. Le jeton d'importation autorise l'importation.

  1. Recherchez la clé cible, cliquez sur Actions dans la colonne Details. Sur la page des détails de la clé, dans la section Key Material, cliquez sur Obtain Parameters for Import.

  2. Dans la boîte de dialogue Obtain Parameters to Import Key Material, sélectionnez le Public Key Type et l'Encryption Algorithm, puis cliquez sur Next.

    Type de gestion des clés

    Spécifications de clé

    Type de clé publique de chiffrement

    Algorithme de chiffrement

    Clé protégée par logiciel

    • RSA_2048

    • RSA_3072

    • EC_P256

    • EC_P256K

    RSA_2048

    RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD

    Clé protégée par matériel

    • RSA_2048

    • RSA_3072

    • RSA_4096

    • EC_P256

    • EC_P256K

    RSA_2048

    RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD

  3. Téléchargez la clé publique de chiffrement et le jeton d'importation, puis conservez-les en toute sécurité.

    • Public Key Format :

      • DER Format : Le fichier téléchargé est nommé WrappingPublicKey**.bin par défaut.

      • PEM Format : Le fichier téléchargé est nommé WrappingPublicKey**.pem par défaut.

    • Import Token : Le fichier téléchargé est nommé ImportToken***.txt par défaut.

      Important
      • Un jeton d'importation est valide pendant 24 heures et peut être réutilisé durant cette période. Après expiration, vous devez obtenir un nouveau jeton d'importation et une nouvelle clé publique.

      • La clé publique de chiffrement et le jeton d'importation doivent être utilisés par paire. Vous ne pouvez pas utiliser une clé publique de chiffrement issue d'un téléchargement avec un jeton d'importation issu d'un autre.

Étape 3 : Chiffrer le matériel de clé à l'aide de la clé publique de chiffrement

Générez et chiffrez le matériel de clé dans votre environnement système. Les clés suivantes interviennent dans le processus. Consultez le tableau ci-dessous pour plus de détails.

Clé

Objectif

Fournisseur

Remarques

Target Asymmetric Key (TAK)

La clé asymétrique cible à importer.

Votre environnement système ou outil (comme une infrastructure de gestion des clés hors ligne KMI ou un module de sécurité matériel hors ligne HSM).

  • TAKpub : partie clé publique

  • TAKpriv : partie clé privée

Import Wrapping Key (IWK)

La clé de chiffrement utilisée pour importer la TAK.

Alibaba Cloud KMS.

  • IWKpub : partie clé publique

    Remarque

    Il s'agit de la clé publique de chiffrement que vous avez téléchargée depuis la console KMS.

  • IWKpriv : partie clé privée

Ephemeral Symmetric Key (ESK)

Une clé symétrique transitoire utilisée pour chiffrer directement TAKpriv.

Votre système ou outil dans l'environnement source. Détruisez-la immédiatement après l'exportation de la TAK.

Sans objet

  1. Créez une clé privée de clé asymétrique cible (TAKpriv). La spécification de clé doit correspondre à celle sélectionnée lors de la création de la clé asymétrique. Si vous disposez déjà d'une clé privée de clé asymétrique cible (TAKpriv), ignorez cette étape.

    Remarque

    Le format de TAKpriv doit respecter les normes suivantes : les clés privées RSA sont encodées selon la RFC 3447, les clés privées ECC selon la RFC 5915, puis encapsulées au format PKCS#8 conformément à la RFC 5208.

  2. Créez une clé symétrique éphémère (ESK).

  3. Utilisez la clé publique de chiffrement d'importation (IWKpub) pour chiffrer la clé symétrique éphémère (ESK) afin d'obtenir le texte chiffré de la clé symétrique éphémère (Cipher(ESK)).

  4. Utilisez la clé symétrique éphémère (ESK) pour chiffrer la clé privée de clé asymétrique cible (TAKpriv) afin d'obtenir le texte chiffré de la clé privée (Cipher(TAKpriv)).

  5. Assemblez les données résultantes au format Cipher(ESK)||Cipher(TAKpriv) pour obtenir le matériel de clé chiffré.

Exemple : Utiliser OpenSSL pour générer du matériel de clé pour l'algorithme RSA_2048

  1. Créez une clé privée de clé asymétrique cible pour l'algorithme RSA_2048 et convertissez-la au format PKCS#8.

    openssl genrsa -out TakPrivPkcs1.pem 2048
    openssl pkcs8 -topk8 -inform PEM -in TakPrivPkcs1.pem -outform der -nocrypt -out TakPrivPkcs8.bin
  2. Créez une clé symétrique éphémère (ESK) pour l'algorithme AES_256.

    openssl rand -out EskAes256.bin 32
  3. Utilisez la clé publique de chiffrement d'importation (IWKpub) pour chiffrer la clé symétrique éphémère (ESK) afin d'obtenir le texte chiffré de la clé symétrique éphémère (Cipher(ESK)). Le chiffrement standard RSAES OAEP est utilisé, où MGF1 et l'algorithme de hachage sont SHA256.

    openssl pkeyutl -encrypt -pubin -inkey PublicKey.pem  -in EskAes256.bin  -pkeyopt \
    rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 -out \
    CipherEsk.bin
    Remarque

    Remplacez PublicKey.pem par le nom du fichier de clé publique téléchargé depuis la console KMS.

  4. Utilisez la clé symétrique éphémère (ESK) pour chiffrer la clé privée de clé asymétrique cible (TAKpriv) afin de générer le texte chiffré de la clé privée (Cipher(TAKpriv)). Le mode de chiffrement est ECB et le mode de remplissage est PKCS#7 Padding.

    xxd -l 32  -c 32 -ps EskAes256.bin | xargs -I {} openssl enc  -aes-256-ecb -e  -K {} -in \
    TakPrivPkcs8.bin -nosalt -out CipherTakPriv.bin
  5. Assemblez les données résultantes au format Cipher(ESK) || Cipher(TAKpriv), puis effectuez un encodage Base64.

    cat CipherEsk.bin CipherTakPriv.bin > EncryptedKeyMaterial.bin
    openssl enc -e -base64 -A -in EncryptedKeyMaterial.bin -out EncryptedKeyMaterial_base64.txt
    Remarque

    EncryptedKeyMaterial_base64.txt est le fichier de matériel de clé pouvant être importé dans KMS.

Étape 4 : Importer le matériel de clé

Sur la page des détails de la clé, cliquez sur Import Key Material. Dans la boîte de dialogue Import Wrapped Key Material, effectuez les configurations, puis cliquez sur OK.

Paramètre

Description

Wrapped Key Material

Téléchargez le fichier de matériel de clé généré à l'étape 3 : Chiffrer le matériel de clé à l'aide de la clé publique de chiffrement.

Import Token

Téléchargez le fichier de jeton obtenu à l'étape 2 : Télécharger une clé publique de chiffrement et un jeton d'importation.

Key Material Expired On

Vous pouvez sélectionner Never Expire ou spécifier une date d'expiration personnalisée.

Important

Si vous définissez une date d'expiration pour le matériel de clé, KMS supprime le matériel expiré après cette date et vous ne pouvez plus l'utiliser. Pour le restaurer, vous pouvez importer à nouveau le même matériel de clé.

Une fois le matériel de clé importé avec succès, le statut de la clé passe de Pending Import à Enabling.

Importer le matériel de clé à l'aide du SDK Alibaba Cloud

Vous pouvez utiliser le SDK Alibaba Cloud pour créer des clés RSA et ECC dans KMS et importer du matériel de clé. L'exemple de code Java suivant illustre le processus.

Remarque

Une paire AccessKey pour un compte Alibaba Cloud dispose des autorisations pour toutes les opérations API. Nous vous recommandons d'utiliser un utilisateur RAM pour appeler les opérations API ou effectuer des opérations de maintenance courantes. Pour prévenir les risques de sécurité, n'intégrez pas votre AccessKey ID et votre AccessKey Secret en dur dans le code de votre projet. L'intégration en dur des identifiants peut entraîner des fuites compromettant toutes les ressources de votre compte.

Cette rubrique fournit un exemple de configuration des variables d'environnement ALIBABA_CLOUD_ACCESS_KEY_ID et ALIBABA_CLOUD_ACCESS_KEY_SECRET pour l'authentification d'identité.

Installer le SDK

Ajoutez la dépendance Maven à votre projet pour télécharger automatiquement le package d'installation Java depuis le référentiel Maven. Utilisez Alibaba Cloud SDK V2.0.

 <dependency>
 <groupId>com.aliyun</groupId>
 <artifactId>kms20160120</artifactId>
 <version>1.4.0</version>
 </dependency>
 <dependency>
 <groupId>com.aliyun</groupId>
 <artifactId>tea</artifactId>
 <version>1.3.2</version>
 </dependency>
package com.aliyun;

import java.security.InvalidAlgorithmParameterException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.interfaces.ECPrivateKey;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.MGF1ParameterSpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource.PSpecified;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

import com.aliyun.kms20160120.models.*;
import com.aliyun.kms20160120.Client;
import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class BringYourOwnAsymmetricKeySample {
    private final static String dedicatedKmsInstanceId = "<yourKmsInstanceId>";
    // The public endpoint of KMS.
    private final static String endpoint = "kms.<regionId>.aliyuncs.com";
    private final Client kmsClient;
    private final String SM2PKE_SM4_ECB = "SM2PKE_SM4_ECB";
    private final String RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD = "RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD";
    private static Provider BC = new BouncyCastleProvider();
    private static X9ECParameters x9ECParameters = GMNamedCurves.getByName("sm2p256v1");
    private static ECDomainParameters ecDomainParameters = new ECDomainParameters(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN());

    static {
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    public static void main(String[] args) throws Exception {
        // Initialize the KMS SDK.
        Client client = BringYourOwnAsymmetricKeySample.createClient();
        BringYourOwnAsymmetricKeySample sample = new BringYourOwnAsymmetricKeySample(client);

        // Create and import an external key of the EC_SM2 type.
        sample.doByok("EC_SM2", "EC_SM2", sample.SM2PKE_SM4_ECB, "SM4");
        // Create and import an external key of the EC_P256 type.
        sample.doByok("EC_P256", "RSA_2048", sample.RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD, "AES_256");
        // Create and import an external key of the RSA type.
        sample.doByok("RSA_2048", "RSA_2048", sample.RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD, "AES_256");
    }

    /**
     * <b>description</b> :
     * <p>Initialize the client using credentials.</p>
     *
     * @return Client
     * @throws Exception
     */
    public static Client createClient() throws Exception {
        // We recommend that you use the more secure credential-based initialization without hardcoding AccessKey pairs. For more information, see: https://www.alibabacloud.com/help/document_detail/378657.html.
        com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setCredential(credential);
        // For the endpoint, see https://api.aliyun.com/product/Kms.
        config.endpoint = endpoint;
        return new Client(config);
    }

    public BringYourOwnAsymmetricKeySample(Client kmsClient) {
        this.kmsClient = kmsClient;
    }

    public void doByok(String targetKeySpec, String wrappingKeySpec, String wrappingAlgorithm, String ephemeralKeySpec) {
        try {
            // Create an external ECC key.
            CreateKeyResponseBody.CreateKeyResponseBodyKeyMetadata keyMetadata = this.createExternalKeyInDkms(dedicatedKmsInstanceId, targetKeySpec, "SIGN/VERIFY");
            String keyId = keyMetadata.getKeyId();
            // Obtain the parameters for importing key material.
            GetParametersForImportResponse parametersForImportResponse = this.getParametersForImport(keyId, wrappingKeySpec,
                    wrappingAlgorithm);
            String importToken = parametersForImportResponse.body.getImportToken();
            String publicKeyBase64 = parametersForImportResponse.body.getPublicKey();
            // Generate the ephemeral symmetric key.
            byte[] ephemeralSymmetricKeyPlaintext = this.generateEphemeralSymmetricKey(ephemeralKeySpec);
            // Generate the target asymmetric key.
            byte[] targetAsymmetricKeyPlaintext = this.generateTargetAsymmetricKey(targetKeySpec);
            // Use the import wrapping key public key to encrypt the ephemeral symmetric key.
            byte[] ephemeralSymmetricKeyCipher = this.encryptEphemeralSymmetricKey(publicKeyBase64,
                    wrappingAlgorithm, ephemeralSymmetricKeyPlaintext);
            // Use the ephemeral symmetric key to encrypt the target asymmetric key.
            byte[] targetAsymmetricKeyCipher = this.encryptTargetAsymmetricKey(ephemeralSymmetricKeyPlaintext, targetAsymmetricKeyPlaintext,
                    wrappingAlgorithm);
            // Generate the key material.
            byte[] encryptedKeyMaterial = new byte[ephemeralSymmetricKeyCipher.length + targetAsymmetricKeyCipher.length];
            System.arraycopy(ephemeralSymmetricKeyCipher, 0, encryptedKeyMaterial, 0, ephemeralSymmetricKeyCipher.length);
            System.arraycopy(targetAsymmetricKeyCipher, 0, encryptedKeyMaterial, ephemeralSymmetricKeyCipher.length, targetAsymmetricKeyCipher.length);
            String encryptedKeyMaterialBase64 = DatatypeConverter.printBase64Binary(encryptedKeyMaterial);
            // Import the key material to KMS.
            this.importKeyMaterial(keyId, encryptedKeyMaterialBase64, importToken, 0L);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private GetParametersForImportResponse getParametersForImport(String keyId, String keySpec, String algorithm) throws Exception {
        GetParametersForImportRequest request = new GetParametersForImportRequest();
        request.setKeyId(keyId);
        request.setWrappingKeySpec(keySpec);
        request.setWrappingAlgorithm(algorithm);
        return this.kmsClient.getParametersForImport(request);
    }

    private CreateKeyResponseBody.CreateKeyResponseBodyKeyMetadata createExternalKeyInDkms(String dedicatedKmsInstance, String keySpec, String keyUsage) throws Exception {
        CreateKeyRequest request = new CreateKeyRequest();
        // Create an external key.
        request.setOrigin("EXTERNAL");
        request.setDKMSInstanceId(dedicatedKmsInstance);
        request.setKeySpec(keySpec);
        request.setKeyUsage(keyUsage);
        return kmsClient.createKey(request).body.keyMetadata;
    }

    private byte[] generateEphemeralSymmetricKey(String ephemeralSymmetricKeySpec) throws Exception {
        // If the ephemeral symmetric key is AES_256, the length is 32 bytes.
        int ephemeralSymmetricKeyLength = 32;
        if ("SM4".equals(ephemeralSymmetricKeySpec)) {
            ephemeralSymmetricKeyLength = 16;
        }
        byte[] key = new byte[ephemeralSymmetricKeyLength];
        new Random().nextBytes(key);
        return key;
    }

    private byte[] generateTargetAsymmetricKey(String keySpec) throws Exception {
        PrivateKey privateKey = null;
        // Generate an SM2 key and obtain the D value of the private key.
        if ("EC_SM2".equals(keySpec)) {
            ECPrivateKey ecPrivateKey = (ECPrivateKey) generateSm2KeyPair().getPrivate();
            byte[] dT = ecPrivateKey.getS().toByteArray();
            byte[] d = new byte[32];
            if (dT.length == 33) {
                System.arraycopy(dT, 1, d, 0, 32);
            }
            return dT.length == 32 ? dT : d;
        }

        // Generate an RSA or ECC private key.
        if (keySpec.contains("RSA")) {
            String[] keySpecAttrs = keySpec.split("_");
            int bits = Integer.parseInt(keySpecAttrs[keySpecAttrs.length - 1]);
            privateKey = generateRsaKeyPair(bits).getPrivate();
        } else if (keySpec.contains("EC")) {
            if (keySpec.contains("P256K")) {
                // Generate an EC_P256K private key.
                privateKey = generateEccKeyPair("secp256k1").getPrivate();
            } else {
                // Generate an EC_P256 private key.
                privateKey = generateEccKeyPair("secp256r1").getPrivate();
            }
        }
        if (privateKey != null) {
            // Return the private key in PKCS#8 format.
            return privateKey.getEncoded();
        }
        return null;
    }

    private KeyPair generateEccKeyPair(String keySpec)
            throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
        ECGenParameterSpec ecSpec = new ECGenParameterSpec(keySpec);
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
        keyPairGenerator.initialize(ecSpec, new SecureRandom());
        return keyPairGenerator.generateKeyPair();
    }

    private KeyPair generateRsaKeyPair(int length) throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(length);
        return keyGen.genKeyPair();
    }

    private KeyPair generateSm2KeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", "BC");
        keyGen.initialize(new ECGenParameterSpec("sm2p256v1"), new SecureRandom());
        return keyGen.genKeyPair();
    }

    private byte[] encryptEphemeralSymmetricKey(String publicKeyBase64, String wrappingAlgorithm, byte[] ephemeralSymmetricKeyPlaintext) throws Exception {
        PublicKey publickey = null;
        byte[] enchbk = null;
        if ("RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD".equals(wrappingAlgorithm)) {
            publickey = parseDerPublicKey("RSA", publicKeyBase64);
            Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
            OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSpecified.DEFAULT);
            oaepFromAlgo.init(Cipher.ENCRYPT_MODE, publickey, oaepParams);
            enchbk = oaepFromAlgo.doFinal(ephemeralSymmetricKeyPlaintext);
        } else if ("SM2PKE_SM4_ECB".equals(wrappingAlgorithm)) {
            publickey = parseDerPublicKey("EC", publicKeyBase64, BC);
            BCECPublicKey localECPublicKey = (BCECPublicKey) publickey;
            ECPublicKeyParameters ecPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), ecDomainParameters);
            SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);
            sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters));
            enchbk = sm2Engine.processBlock(ephemeralSymmetricKeyPlaintext, 0, ephemeralSymmetricKeyPlaintext.length);

        } else {
            throw new Exception("Invalid wrappingAlgorithm");
        }
        return enchbk;
    }

    private PublicKey parseDerPublicKey(String keyType, String pemKey) throws Exception {
        byte[] derKey = DatatypeConverter.parseBase64Binary(pemKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(derKey);
        return KeyFactory.getInstance(keyType).generatePublic(keySpec);
    }

    private PublicKey parseDerPublicKey(String keyType, String pemKey, Provider provider) throws Exception {
        byte[] derKey = DatatypeConverter.parseBase64Binary(pemKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(derKey);
        return KeyFactory.getInstance(keyType, provider).generatePublic(keySpec);
    }

    private byte[] encryptTargetAsymmetricKey(byte[] secretKey, byte[] targetAsymmetricKeyPlaintext, String wrappingAlgorithm)
            throws Exception {
        if ("RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD".equals(wrappingAlgorithm)) {
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            return cipher.doFinal(targetAsymmetricKeyPlaintext);
        } else if ("SM2PKE_SM4_ECB".equals(wrappingAlgorithm)) {
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "SM4");
            Cipher cipher = Cipher.getInstance("SM4/ECB/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            return cipher.doFinal(targetAsymmetricKeyPlaintext);
        }

        throw new Exception("Invalid WrappingAlgorithm");
    }

    private void importKeyMaterial(
            String keyId,
            String material,
            String token,
            Long expire
    ) throws Exception {
        ImportKeyMaterialRequest req = newImportKeyMaterialRequest(
                keyId, material, token, expire);
        this.kmsClient.importKeyMaterial(req);
    }

    private ImportKeyMaterialRequest newImportKeyMaterialRequest(
            String keyId,
            String material,
            String token,
            Long expire
    ) {
        ImportKeyMaterialRequest request = new ImportKeyMaterialRequest();
        request.setEncryptedKeyMaterial(material);
        request.setImportToken(token);
        request.setKeyId(keyId);
        request.setKeyMaterialExpireUnix(expire);
        return request;
    }
}
            

FAQ

  • La suppression du matériel de clé est-elle prise en charge ?

    Oui, elle est prise en charge.

    Important

    Une fois le matériel de clé importé expiré ou supprimé, la clé devient indisponible. Vous devez importer à nouveau le même matériel de clé pour restaurer la clé.

    • Supprimer directement le matériel de clé

      • Console : Sur la page des détails de la clé, dans la section Key Material, cliquez sur Delete Key Material.

      • API : Appelez l'opération DeleteKeyMaterial pour supprimer le matériel de clé. Cette opération ne supprime pas votre clé.

    • Suppression automatique par KMS après expiration

      Définissez une date d'expiration lors de l'importation du matériel de clé. Passé ce délai, KMS supprime le matériel de clé expiré.

  • Comment réimporter le même matériel de clé ?

    Une fois le matériel de clé expiré ou supprimé, vous pouvez importer à nouveau le même matériel de clé afin que la clé puisse continuer à être utilisée.

    1. Supprimez le matériel de clé expiré.

      Sur la page des détails de la clé, cliquez sur l'onglet Key Material, puis cliquez sur Delete Key Material.

    2. Téléchargez à nouveau la clé publique de chiffrement et le jeton d'importation. Pour plus d'informations, consultez Étape 2 : Télécharger une clé publique de chiffrement et un jeton d'importation.

      Remarque

      Le processus de chiffrement de clé n'affecte pas le contenu du matériel de clé. Vous pouvez utiliser une clé publique de chiffrement et un algorithme de chiffrement différents pour importer le même matériel de clé.

    3. Chiffrez le matériel de clé à l'aide de la clé publique de chiffrement. Pour plus d'informations, consultez Étape 3 : Chiffrer le matériel de clé à l'aide de la clé publique de chiffrement.

      Remarque

      Le matériel de clé doit être identique à celui précédemment expiré.

    4. Utilisez le jeton d'importation pour importer le matériel de clé chiffré. Pour plus d'informations, consultez Étape 4 : Importer le matériel de clé.

  • Comment déterminer si le matériel de clé est importé de l'extérieur ou généré par KMS ?

    • Méthode 1 : Vérifier dans la console KMS.

      Sur la page Keys, cliquez sur l'onglet Customer Master Keys, sélectionnez un Instance ID, recherchez la clé cible, cliquez sur Actions dans la colonne Details, puis vérifiez Key Material Origin sur la page des détails.

    • Méthode 2 : Vérifier en appelant l'opération DescribeKey.

      Si la valeur de Origin est EXTERNAL, le matériel de clé est importé de l'extérieur. Si la valeur de Origin est Aliyun_KMS, le matériel de clé est généré par KMS.

  • Comment faire tourner une clé utilisant du matériel de clé externe ?

    • Pour une clé symétrique protégée par logiciel avec du matériel de clé externe importé, seule la rotation manuelle immédiate est prise en charge. La rotation périodique automatique n'est pas prise en charge. Pour plus d'informations, consultez Bring Your Own Keys (BYOKs) avec du matériel de clé importé..

    • Pour une clé asymétrique protégée par logiciel avec du matériel de clé externe importé, la rotation n'est pas prise en charge.

    • Pour une clé protégée par matériel (symétrique ou asymétrique) avec du matériel de clé externe importé, la rotation n'est pas prise en charge.

Références