Exécution d'opérations de chiffrement à l'aide de l'API GREP11
IBM Cloud® Hyper Protect Crypto Services fournit une API EP11 (Enterprise PKCS #11) sur gRPC (connue aussi sous le nom d'API GREP11) pour accéder à distance à l'instance de service Hyper Protect Crypto Services pour le chiffrement et la gestion des données.
Extraction de vos données d'identification IBM Cloud
Pour utiliser l'API, vous devez générer vos données d'authentification et d'identification de service. Pour rassembler vos données d'identification :
Génération d'une demande d'API GREP11
Pour accéder à distance au module HSM en cloud sur Hyper Protect Crypto Services afin d'effectuer des opérations de chiffrement, vous devez générer une demande d'API GREP11 et transmettre l'URL de noeud final d'API GREP11, la clé d'API d'ID de service et le noeud final IAM via l'appel d'API.
Pour le plan standard Hyper Protect Crypto Services, vous pouvez également activer le protocole TLS mutuel pour l'API GREP11 afin d'ajouter une autre couche d'authentification. Pour plus d'informations, voir Activation de la deuxième couche d'authentification pour les connexions EP11.
Exemple : génération de données aléatoires en utilisant la fonction GenerateRandomRequest()
L'API GREP11 prend en charge les langages de programmation avec des bibliothèquesgRPC. Deux exemples de référentiels GitHub sont fournis pour vous permettre de tester l'API GREP11 :
Vous pouvez utiliser l'exemple de code Golang suivant pour générer des données aléatoires en appelant la fonction GenerateRandom.
Cet exemple suppose que des packages Golang supplémentaires requis sont inclus via des instructions d'importation, telles que les packages gRPC et http. L'instruction import pb "github.com/IBM-Cloud/hpcs-grep11-go/grpc" est utilisée par GREP11 pour effectuer des appels de fonction d'API.
import pb "github.com/IBM-Cloud/hpcs-grep11-go/grpc"
// Data structure and supporting methods used for GREP11 authentication
// IAMPerRPCCredentials type defines the fields required for IBM Cloud IAM authentication
// This type implements the gRPC PerRPCCredentials interface
type IAMPerRPCCredentials struct {
expiration time.Time
updateLock sync.Mutex
AccessToken string // Required if APIKey nor Endpoint are specified - IBM Cloud IAM access token
APIKey string // Required if AccessToken is not specified - IBM Cloud API key
Endpoint string // Required if AccessToken is not specified - IBM Cloud IAM endpoint
}
// GetRequestMetadata is used by GRPC for authentication
func (cr *IAMPerRPCCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
// Set token if empty or Set token if expired
if len(cr.APIKey) != 0 && len(cr.Endpoint) != 0 && time.Now().After(cr.expiration) {
if err := cr.getToken(ctx); err != nil {
return nil, err
}
}
return map[string]string{
"authorization": cr.AccessToken,
}, nil
}
// RequireTransportSecurity is used by gRPC for authentication
func (cr *IAMPerRPCCredentials) RequireTransportSecurity() bool {
return true
}
// getToken obtains a bearer token and the expiration
func (cr *IAMPerRPCCredentials) getToken(ctx context.Context) (err error) {
cr.updateLock.Lock()
defer cr.updateLock.Unlock()
// Check if another thread has updated the token
if time.Now().Before(cr.expiration) {
return nil
}
var req *http.Request
client := http.Client{}
requestBody := []byte("grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=" + cr.APIKey)
req, err = http.NewRequest("POST", cr.Endpoint+"/identity/token", bytes.NewBuffer(requestBody))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req = req.WithContext(ctx)
resp, err := client.Do(req)
if err != nil {
return err
}
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("failed to read response body: %s", err)
}
defer resp.Body.Close()
iamToken := struct {
AccessToken string `json:"access_token"`
ExpiresIn int32 `json:"expires_in"`
}{}
err = json.Unmarshal(respBody, &iamToken)
if err != nil {
return fmt.Errorf("error unmarshaling response body: %s", err)
}
cr.AccessToken = fmt.Sprintf("Bearer %s", iamToken.AccessToken)
cr.expiration = time.Now().Add((time.Duration(iamToken.ExpiresIn - 60)) * time.Second)
return nil
}
// Generating a GREP11 API function call
// The following IBM Cloud items need to be changed prior to running the sample program
const address = "<grep11_server_address>"
var callOpts = []grpc.DialOption{
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
grpc.WithPerRPCCredentials(&util.IAMPerRPCCredentials{
APIKey: "<ibm_cloud_apikey>",
Endpoint: "https://iam.cloud.ibm.com",
}),
}
conn, err := grpc.Dial(address, callOpts...)
if err != nil {
panic(fmt.Errorf("Could not connect to server: %s", err))
}
defer conn.Close()
cryptoClient := pb.NewCryptoClient(conn)
rngTemplate := &pb.GenerateRandomRequest{
Len: (uint64)(ep11.AES_BLOCK_SIZE),
}
// Generate 16 bytes of random data for the initialization vector
rng, err := cryptoClient.GenerateRandom(context.Background(), rngTemplate)
if err != nil {
panic(fmt.Errorf("GenerateRandom Error: %s", err))
}
iv := rng.Rnd[:ep11.AES_BLOCK_SIZE]
fmt.Println("Generated IV")
Dans l'exemple, mettez à jour les variables suivantes :
-
Remplacez
<grep11_server_address>par la valeur de votre noeud final d'API GREP11. Pour trouver l'URL de noeud final de service, à partir de l'interface utilisateur de votre instance de service mise à disposition, cliquez sur Présentation > Connect > URL de noeud final Enterprise PKCS #11. Vous pouvez également extraire l'URL de noeud final d'APIde manière dynamique. La valeur retournée inclut les éléments suivants. Selon que vous utilisez un réseau privé ou public, utilisez la valeur de noeud final de service public ou privé qui est renvoyée dans la sectionep11.{ "instance_id": "<instance_ID>", "kms": { "public": "<instance_ID>.api.<region>.hs-crypto.appdomain.cloud", "private":"<instance_ID>.api.private.<region>.hs-crypto.appdomain.cloud" }, "ep11": { "public": "<instance_ID>.ep11.<region>.hs-crypto.appdomain.cloud", "private":"<instance_ID>.ep11.private.<region>.hs-crypto.appdomain.cloud" } }Si vous créez vos instances après le 12 avril 2024 dans certaines régions, vous devrez peut-être utiliser les nouveaux noeuds finaux d'API avec le nouveau format
<instance_ID>.ep11.<REGION>.hs-crypto.appdomain.cloud. La date de disponibilité varie selon la région. Pour plus d'informations sur les régions prises en charge, les dates de disponibilité et les nouvelles URL de noeud final, voir Nouveaux noeuds finaux. -
Remplacez
<ibm_cloud_apikey>par la clé de l'API d'ID de service que vous avez créée. La clé d'API d'ID de service peut être créée en suivant les instructions de la rubrique Gestion de la clé d'API d'ID de service.
Si l'exemple de demande est traité avec succès, les données aléatoires d'une longueur de 16 octets sont renvoyées, comme indiqué dans ep11.AES_BLOCKSIZE.
L'exemple d'authentification précédent ainsi que d'autres exemples de code de Golang peuvent être trouvés à l'adresse suivante :
Etapes suivantes
Vous êtes maintenant prêt à commencer à gérer vos clés de chiffrement et vos données. Pour plus d'informations sur la gestion de vos données en utilisant la fonction Cloud HSM d'Hyper Protect Crypto Services, voir Référence de l'API GREP11.