Crea y administra claves de cuentas de servicio

En esta página, se explica cómo crear y administrar claves de cuentas de servicio con Google Cloud Console, la herramienta de línea de comandos de gcloud, la API de administración de identidades y accesos o una de las bibliotecas cliente de Google Cloud.

Requisitos previos para esta guía

Permisos necesarios

Si quieres permitir que un usuario administre claves de cuentas de servicio, otorga la función de administrador de claves de cuenta de servicio (roles/iam.serviceAccountKeyAdmin). Las funciones básicas de IAM también contienen permisos para administrar claves de cuentas de servicio, pero recomendamos otorgar esta función a fin de evitar el acceso innecesario a otros recursos de Google Cloud.

Para obtener más información, consulta la lista de funciones de cuentas de servicio.

Crea claves de cuentas de servicio

Para usar una cuenta de servicio fuera de Google Cloud, como en otras plataformas o localmente, primero debes establecer la identidad de la cuenta de servicio. Los pares de claves públicas/privadas proporcionan una forma segura de lograr este objetivo.

Puedes crear una clave de cuenta de servicio con Cloud Console, la herramienta de gcloud, el método serviceAccounts.keys.create() o una de las bibliotecas cliente. Una cuenta de servicio puede tener hasta 10 claves.

En los siguientes ejemplos, sa-name es el nombre de tu cuenta de servicio y project-id es el ID de tu proyecto de Google Cloud. Puedes recuperar la string sa-name@project-id.iam.gserviceaccount.com desde la página Cuentas de servicio en Cloud Console.

Console

  1. En Cloud Console, ve a la página Cuentas de servicio.

    Ir a la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir.

  3. Busca la fila de la cuenta de servicio para la que quieres crear una clave. En esa fila, haz clic en el botón y, luego, en Crear clave.

  4. Selecciona un Tipo de clave y haz clic en Crear.

Si haces clic en Crear, se descargará un archivo de claves de cuenta de servicio. Después de descargar el archivo de claves, no puedes volver a descargarlo.

Asegúrate de almacenar el archivo de claves de forma segura, ya que se puede usar para autenticarse como tu cuenta de servicio. Puedes mover y cambiar el nombre de este archivo como desees.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts keys create para crear claves de cuenta de servicio.

Comando:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Resultado:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/key.json] for
[sa-name@project-id.iam.gserviceaccount.com]

El archivo de claves de la cuenta de servicio se descargará ahora en tu máquina. Después de descargar el archivo de claves, no puedes volver a descargarlo.

Asegúrate de almacenar el archivo de claves de forma segura, ya que se puede usar para autenticarse como tu cuenta de servicio. Puedes mover y cambiar el nombre de este archivo como desees.

API de REST

Con el método projects.serviceAccounts.keys.create, se crea una clave para una cuenta de servicio.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: Es el ID de tu proyecto de Google Cloud.
  • sa-name: Es el nombre de la cuenta de servicio para la que deseas crear una clave.
  • private-key-type: Este valor es opcional. Es el formato de salida de la clave privada. El valor predeterminado es TYPE_GOOGLE_CREDENTIALS_FILE, que es un archivo de claves JSON codificado en base64. Para obtener una lista de todos los valores posibles, consulta la referencia de ServiceAccountPrivateKeyType.
  • key-algorithm: Este valor es opcional. Es el algoritmo de clave que se usará para la clave. El valor predeterminado, que está sujeto a cambios, es una clave RSA de 2,048 bits. Para obtener una lista de todos los valores posibles, consulta la referencia de ServiceAccountKeyAlgorithm.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys

Cuerpo JSON de la solicitud:

{
  "privateKeyType": "private-key-type",
  "keyAlgorithm": "key-algorithm"
}

Para enviar tu solicitud, expande una de estas opciones:

La respuesta contiene una clave para la cuenta de servicio, por ejemplo:

{
    "name":"projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData":"MIIJqAIB . . .",
    "validAfterTime": "2020-05-17T18:48:27Z",
    "validBeforeTime": "9999-12-31T23:59:59Z",
    "keyAlgorithm": "KEY_ALG_RSA_2048",
    "keyOrigin": "GOOGLE_PROVIDED",
    "keyType": "USER_MANAGED"
}

Asegúrate de almacenar los datos de la clave de manera segura, ya que se pueden usar para autenticarse como tu cuenta de servicio.

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static ServiceAccountKey CreateKey(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var key = service.Projects.ServiceAccounts.Keys.Create(
            new CreateServiceAccountKeyRequest(),
            "projects/-/serviceAccounts/" + serviceAccountEmail)
            .Execute();
        Console.WriteLine("Created key: " + key.Name);
        return key;
    }
}

Go

Antes de probar esta muestra, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// createKey creates a service account key.
func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	request := &iam.CreateServiceAccountKeyRequest{}
	key, err := service.Projects.ServiceAccounts.Keys.Create(resource, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.Create: %v", err)
	}
	fmt.Fprintf(w, "Created key: %v", key.Name)
	return key, nil
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.CreateServiceAccountKeyRequest;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class CreateServiceAccountKey {

  // Creates a key for a service account.
  public static void createKey(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      ServiceAccountKey key =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .create(
                  "projects/-/serviceAccounts/" + serviceAccountEmail,
                  new CreateServiceAccountKeyRequest())
              .execute();

      System.out.println("Created key: " + key.getName());
    } catch (IOException e) {
      System.out.println("Unable to create service account key: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def create_key(service_account_email):
    """Creates a key for a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

    print('Created key: ' + key['name'])

Ten en cuenta que el valor privateKeyData que se muestra es una representación de string codificada en Base64 del valor TYPE_GOOGLE_CREDENTIALS_FILE (claves o credenciales JSON o P12).

Cuando creas una clave, se genera y descarga a tu máquina un nuevo par de clave pública o privada. Este sirve como copia única de la clave privada. Tú eres el responsable del almacenar de forma segura la clave privada. Anota su ubicación y asegúrate de que tu aplicación pueda acceder a ella, ya que necesita la clave para hacer llamadas autenticadas a la API.

El formato de la clave puede diferir según cómo se genere. Las claves creadas con Cloud Console o la herramienta de línea de comandos de gcloud se ven de la siguiente manera:

{
  "type": "service_account",
  "project_id": "project-id",
  "private_key_id": "key-id",
  "private_key": "-----BEGIN PRIVATE KEY-----\nprivate-key\n-----END PRIVATE KEY-----\n",
  "client_email": "service-account-email",
  "client_id": "client-id",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/service-account-email"
}

A su vez, las claves generadas con la API de REST o con las bibliotecas cliente se ven de esta forma:

{
  "name": "projects/project-id/serviceAccounts/service-account-email/keys/key-id",
  "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
  "privateKeyData": "private-key",
  "validAfterTime": "date",
  "validBeforeTime": "date",
  "keyAlgorithm": "KEY_ALG_RSA_2048"
}

Nuevamente, ten en cuenta que el valor privateKeyData que se muestra es una representación de string codificada en Base64 del valor TYPE_GOOGLE_CREDENTIALS_FILE (claves o credenciales JSON o P12). Puedes almacenar privateKeyData decodificados en Base64 en un archivo con la extensión adecuada (.p12 o .json) y usarlo como entrada para las bibliotecas cliente o el comando gcloud auth activate-service-account.

Debido a que los formatos entre cada método son diferentes, es más fácil generar una clave con el mismo método que piensas usar cuando hagas llamadas a la API en el futuro. Por ejemplo, si usas gcloud, también puedes generar tu clave con gcloud. Si deseas usar una clave en un método que se generó con un método diferente (como usar una clave generada con REST para gcloud), deberás editar la clave a fin de que coincida con el formato adecuado.

Google garantiza que todos los usuarios podrán acceder a las claves públicas de todas las cuentas de servicios, a fin de verificar las firmas que se crearon con la clave privada. La clave pública es de acceso público en las siguientes URL:

  • Certificado x.509: https://www.googleapis.com/service_accounts/v1/metadata/x509/sa-name@project-id.iam.gserviceaccount.com
  • Clave web JSON (JWK): https://www.googleapis.com/service_accounts/v1/jwk/sa-name@project-id.iam.gserviceaccount.com
  • Extremo sin procesar: https://www.googleapis.com/service_accounts/v1/metadata/raw/sa-name@project-id.iam.gserviceaccount.com

Haz una lista de las claves de cuentas de servicio

Puedes generar una lista de las claves de una cuenta de servicio con Cloud Console, la herramienta de gcloud, el método serviceAccount.keys.list() o una de las bibliotecas cliente.

El método serviceAccount.keys.list() se usa comúnmente a fin de auditar claves y cuentas de servicio, o de compilar herramientas personalizadas para administrar cuentas de servicio.

Si quieres descubrir a qué proyecto pertenece tu clave, puedes descargar la clave como un archivo JSON y mirar ese archivo.

Es posible que haya claves que no creaste; estas son las claves administradas en Google Cloud que se usan en los servicios de Google Cloud, como App Engine y Compute Engine. Para obtener más información sobre la diferencia entre las claves administradas por el usuario y las administradas por Google Cloud, consulta Información sobre las cuentas de servicio.

Console

  1. En Cloud Console, ve a la página Cuentas de servicio.

    Ir a la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir. La consola enumera todas las cuentas de servicio del proyecto y sus claves correspondientes.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts keys list para generar una lista de las claves de la cuenta de servicio.

Comando:

gcloud iam service-accounts keys list \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Resultado:

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2016-01-26T21:01:42.000Z 2026-01-23T21:01:42.000Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2016-01-26T20:55:40.000Z 2026-01-23T20:55:40.000Z

API de REST

Con el método projects.serviceAccounts.keys.list, se genera una lista de todas las claves de cuenta de servicio de una cuenta de servicio.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: Es el ID de tu proyecto de Google Cloud.
  • sa-name: Es el nombre de la cuenta de servicio cuyas claves deseas enumerar.
  • key-types: Este valor es opcional. Es una lista separada por comas de los tipos de claves que deseas incluir en la respuesta. El tipo de clave indica si una clave es administrada por el usuario (USER_MANAGED) o por el sistema (SYSTEM_MANAGED). Si se deja en blanco, se mostrarán todas las claves.

Método HTTP y URL:

GET https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys?keyTypes=key-types

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "keys": [
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
      "validAfterTime": "2020-03-04T17:39:47Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
      "validAfterTime": "2020-03-31T23:50:09Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
      "validAfterTime": "2020-05-17T18:58:13Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    }
  ]
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using System;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var response = service.Projects.ServiceAccounts.Keys
            .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
            .Execute();
        foreach (ServiceAccountKey key in response.Keys)
        {
            Console.WriteLine("Key: " + key.Name);
        }
        return response.Keys;
    }
}

Go

Antes de probar esta muestra, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	response, err := service.Projects.ServiceAccounts.Keys.List(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.List: %v", err)
	}
	for _, key := range response.Keys {
		fmt.Fprintf(w, "Listing key: %v", key.Name)
	}
	return response.Keys, nil
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class ListServiceAccountKeys {

  // Lists all keys for a service account.
  public static void listKeys(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list("projects/-/serviceAccounts/" + serviceAccountEmail)
              .execute()
              .getKeys();

      for (ServiceAccountKey key : keys) {
        System.out.println("Key: " + key.getName());
      }
    } catch (IOException e) {
      System.out.println("Unable to list service account keys: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def list_keys(service_account_email):
    """Lists all keys for a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    keys = service.projects().serviceAccounts().keys().list(
        name='projects/-/serviceAccounts/' + service_account_email).execute()

    for key in keys['keys']:
        print('Key: ' + key['name'])

Obtén una clave de cuenta de servicio

Solo puedes obtener los datos de una clave privada para una clave de cuenta de servicio cuando esta se crea por primera vez.

Puedes obtener información básica sobre una clave, como su ID, algoritmo y datos de clave pública, con el método de la API de REST projects.serviceAccounts.keys.get(). No se admite el uso de Cloud Console o la herramienta de línea de comandos de gcloud.

Sube claves públicas para cuentas de servicio

Puedes subir la parte de clave pública de un par de claves administradas por el usuario a una cuenta de servicio. Después de subir la clave pública, esta se asociará de manera permanente con la cuenta de servicio y se usará de la misma forma que cualquier otra clave de una cuenta de servicio administrada por el usuario. Si quieres inhabilitar la capacidad de subir claves para el proyecto, consulta Restringe la carga de claves de cuentas de servicio.

Si decides usar un par de claves administradas por el usuario en lugar de un par de claves administradas por Google, asegúrate de mantenerlo y rotarlo con frecuencia.

La clave que subas debe ser una clave pública RSA que esté unida en un certificado X.509 v3 y codificada en base64. Puedes usar herramientas como OpenSSL para generar una clave y un certificado con este formato. Por ejemplo, mediante el siguiente comando, se genera un par de claves RSA de 2,048 bits y se une la clave pública en un certificado autofirmado que es válido durante 365 días:

openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
    -keyout /path/to/private_key.pem \
    -out /path/to/public_key.pem \
    -subj "/CN=unused"

Luego, puedes subir el archivo public_key.pem como la clave pública de una cuenta de servicio.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts keys upload para subir una clave pública con el fin de firmar claves de cuenta de servicio.

Comando:

gcloud iam service-accounts keys upload /path/to/public_key.pem \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

El siguiente resultado contiene un identificador único para la clave subida:

Name: projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

Para determinar si el resultado del comando fue correcto, ejecuta el comando gcloud iam service-accounts keys list:

gcloud iam service-accounts keys list \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

El resultado contendrá el mismo identificador único que se mostró después de crear la clave:

KEY_ID CREATED_AT EXPIRES_AT
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42.000Z 2029-06-23T21:01:42.000Z

API de REST

Mediante el método projects.serviceAccounts.keys.upload, se sube la clave pública desde un par de claves administradas por el usuario y se agrega esta clave a la cuenta de servicio.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: Es el ID de tu proyecto de Google Cloud.
  • sa-name: Es el nombre de la cuenta de servicio con la que se asociará la clave.
  • public-key-data: Son los datos de la clave pública para el par de claves. Debe ser una clave pública RSA que esté unida en un certificado X.509 v3. Codifica los datos de clave pública en base64, incluidas la primera, -----BEGIN CERTIFICATE-----, y la última línea, -----END CERTIFICATE-----.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys:upload

Cuerpo JSON de la solicitud:

{
  "publicKeyData": "public-key-data"
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
  "validAfterTime": "2020-05-17T19:31:19Z",
  "validBeforeTime": "2021-05-17T19:31:19Z",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "USER_PROVIDED",
  "keyType": "USER_MANAGED"
}

Borra claves de cuentas de servicios

Puedes borrar una clave de cuenta de servicio con Cloud Console, la herramienta de gcloud, el método serviceAccount.keys.delete() o una de las bibliotecas cliente.

Si borras una clave, la aplicación ya no podrá usarla para acceder a los recursos de Google Cloud. Por seguridad, se recomienda que rotes las claves de las cuentas de servicio con regularidad. Para rotar una clave, crea una nueva, ajusta las aplicaciones de modo que la usen y, luego, borra la anterior. Usa los métodos serviceAccount.keys.create() y serviceAccount.keys.delete() juntos para automatizar la rotación.

Console

  1. En Cloud Console, ve a la página Cuentas de servicio.

    Ir a la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir. La consola enumera todas las cuentas de servicio del proyecto y sus claves correspondientes.

  3. Busca la fila de la cuenta de servicio para la que quieres crear una clave. En esa fila, haz clic en el botón y, luego, en Editar.

  4. En la lista de claves, haz clic en Borrar  en cada clave que desees borrar.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts keys delete para borrar claves de cuenta de servicio.

Comando:

gcloud iam service-accounts keys delete key-id \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Resultado:

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
service account [sa-name@project-id.iam.gserviceaccount.com]

API de REST

Mediante el método projects.serviceAccounts.keys.delete, se borra una clave de cuenta de servicio.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: Es el ID de tu proyecto de Google Cloud.
  • sa-name: Es el nombre de la cuenta de servicio cuya clave deseas borrar.
  • key-id: Es el ID de la clave que deseas borrar.

Método HTTP y URL:

DELETE https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys/key-id

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
}

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static void DeleteKey(string fullKeyName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
        Console.WriteLine("Deleted key: " + fullKeyName);
    }
}

Go

Antes de probar esta muestra, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// deleteKey deletes a service account key.
func deleteKey(w io.Writer, fullKeyName string) error {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %v", err)
	}

	_, err = service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Keys.Delete: %v", err)
	}
	fmt.Fprintf(w, "Deleted key: %v", fullKeyName)
	return nil
}

Java

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class DeleteServiceAccountKey {

  // Deletes a service account key.
  public static void deleteKey(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      // First, get the name of the key using List() or Get()
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list("projects/-/serviceAccounts/" + serviceAccountEmail)
              .execute()
              .getKeys();
      String keyToDelete = keys.get(0).getName();

      // Then you can delete the key
      service.projects().serviceAccounts().keys().delete(keyToDelete).execute();

      System.out.println("Deleted key: " + keyToDelete);
    } catch (IOException e) {
      System.out.println("Unable to delete service account key: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de IAM sobre el uso de bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de IAM para Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def delete_key(full_key_name):
    """Deletes a service account key."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service.projects().serviceAccounts().keys().delete(
        name=full_key_name).execute()

    print('Deleted key: ' + full_key_name)