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.
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 |
|
Clé protégée par logiciel | |
Clé protégée par matériel |
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
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 .
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.
-
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.
RemarqueFormat 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
aliyunni paracs:.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).
RemarqueLisez attentivement et sélectionnez I understand the methods and implications of using external key material.
Clé protégée par matériel
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 .
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.
-
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.
RemarqueFormat 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
aliyunni paracs:.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).
RemarqueLisez 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.
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.
-
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
RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD : Pour le détail du processus de chiffrement, consultez Exemple : Utiliser OpenSSL pour générer du matériel de clé pour l'algorithme RSA_2048.
-
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**.binpar défaut.PEM Format : Le fichier téléchargé est nommé
WrappingPublicKey**.pempar défaut.
-
Import Token : Le fichier téléchargé est nommé
ImportToken***.txtpar défaut.ImportantUn 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). |
|
Import Wrapping Key (IWK) | La clé de chiffrement utilisée pour importer la TAK. | Alibaba Cloud KMS. |
|
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 |
-
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.
RemarqueLe 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.
Créez une clé symétrique éphémère (ESK).
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)).
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)).
Assemblez les données résultantes au format Cipher(ESK)||Cipher(TAKpriv) pour obtenir le matériel de clé chiffré.
É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.
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é.
Pour plus d'informations sur la configuration des identifiants d'accès, consultez Gérer les identifiants d'accès.
La méthode de configuration des variables d'environnement varie selon le système d'exploitation. Pour plus d'informations, consultez Configurer les variables d'environnement sous Linux, macOS et Windows.
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.
ImportantUne 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.
-
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.
-
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.
RemarqueLe 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é.
-
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.
RemarqueLe matériel de clé doit être identique à celui précédemment expiré.
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
OriginestEXTERNAL, le matériel de clé est importé de l'extérieur. Si la valeur deOriginestAliyun_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.