Dienstkontoschlüssel erstellen und verwalten

Auf dieser Seite wird erläutert, wie Sie Dienstkontoschlüssel mit der Google Cloud Platform Console, dem gcloud-Befehlszeilentool, der Cloud Identity and Access Management API oder einer der Google Cloud-Clientbibliotheken erstellen und verwalten.

Voraussetzungen für diese Anleitung

Erforderliche Berechtigung

Nutzern, die Dienstkontoschlüssel verwalten sollen, müssen Sie die Rolle Zentraler Dienstkontoadministrator (roles/iam.serviceAccountKeyAdmin) gewähren. Einfache Cloud IAM-Rollen enthalten auch Berechtigungen zum Verwalten von Dienstkontoschlüsseln. Es empfiehlt sich jedoch, stattdessen diese Rolle zu gewähren, um keinen unnötigen Zugriff auf andere GCP-Ressourcen zu erteilen.

Weitere Informationen zu Rollen für Dienstkonten finden Sie im Thema Dienstkontorollen.

Dienstkontoschlüssel erstellen

Sie müssen erst die Identität des Dienstkontos bestätigen, um ein Dienstkonto außerhalb der GCP zu verwenden, also auf anderen Plattformen oder vor Ort, Hierfür benötigen Sie Schlüsselpaare mit öffentlichem und privatem Schlüssel.

Sie können einen Dienstkontoschlüssel über die GCP Console, mit dem gcloud-Tool, der Methode serviceAccounts.keys.create() oder einer der Clientbibliotheken erstellen.

In den folgenden Beispielen ist [SA-NAME] der Name des Dienstkontos und [PROJECT-ID] die ID des Google Cloud Platform-Projekts. Sie können den String [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com von der Seite Dienstkonten in der GCP Console abrufen.

Console

  1. Öffnen Sie die Seite IAM & Verwaltung in der GCP Console.

    Weiter zur Seite "IAM & Verwaltung"

  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Weiter.

  3. Klicken Sie in der linken Navigationsleiste auf Dienstkonten.

  4. Suchen Sie nach dem Dienstkonto, für das Sie einen Schlüssel erstellen möchten. Klicken Sie in derselben Zeile auf die Schaltfläche Mehr more_vert und dann auf Schlüssel erstellen.

  5. Wählen Sie einen Schlüsseltyp aus und klicken Sie auf Erstellen.

Befehl "gcloud"

Führen Sie den Befehl gcloud iam service-accounts keys create aus, um Dienstkontoschlüssel zu erstellen.

Befehl:

gcloud iam service-accounts keys create ~/key.json
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Ausgabe:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/key.json] for
[SA-NAME@PROJECT-ID.iam.gserviceaccount.com]

REST API

Anfrage:

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys

Antwort:

{
    "name":"projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData":"MIIJqAIB . . .",
    "validBeforeTime": "2028-05-08T21:00:00Z",
    "validAfterTime": "2016-01-25T18:38:09.000Z",
    "keyAlgorithm": "KEY_ALG_RSA_2048"
}

C#

Für dieses Beispiel müssen Sie C# wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM C# API.

public static ServiceAccountKey CreateKey(string serviceAccountEmail)
{
    ServiceAccountKey key = s_service.Projects.ServiceAccounts.Keys.Create(
        new CreateServiceAccountKeyRequest(),
        "projects/-/serviceAccounts/" + serviceAccountEmail)
        .Execute();

    Console.WriteLine("Created key: " + key.Name);
    return key;
}

Go

Für dieses Beispiel müssen Sie Go wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Go API.

import (
	"context"
	"fmt"
	"io"

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

// createKey creates a service account key.
func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %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

Für dieses Beispiel müssen Sie Java wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Java API.

public ServiceAccountKey createKey(String serviceAccountEmail) throws IOException {

  ServiceAccountKey key =
      service
          .projects()
          .serviceAccounts()
          .keys()
          .create(
              "projects/-/serviceAccounts/" + serviceAccountEmail,
              new CreateServiceAccountKeyRequest())
          .execute();

  System.out.println("Created key: " + key.getName());
  return key;
}

Python

Für dieses Beispiel müssen Sie Python wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Python API.

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

    # pylint: disable=no-member
    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

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

Bei der zurückgegebenen Eigenschaft privateKeyData handelt es sich um eine base64-codierte Stringdarstellung des JSON- oder P12-Schlüssels bzw. der JSON- oder P12-Anmeldedaten.

Bei der Erstellung eines Schlüssels wird ein neues Paar aus öffentlichem und privatem Schlüssel generiert und auf Ihren Rechner heruntergeladen. Es enthält die einzige Kopie des privaten Schlüssels. Sie sind dafür verantwortlich, dass der private Schlüssel sicher aufbewahrt wird. Notieren Sie sich den Speicherort und prüfen Sie, ob die Anwendung auf den Schlüssel zugreifen kann; sie benötigt den Schlüssel, um authentifizierte API-Aufrufe durchzuführen.

Es kann bis zu 60 Sekunden dauern, bis ein neu erstellter Schlüssel zur Authentifizierung verwendet werden kann. Wenn direkt nach der Erstellung eines neuen Schlüssels Authentifizierungsfehler auftreten, müssen Sie 60 Sekunden warten und die Authentifizierung wiederholen.

Der Schlüssel kann unterschiedliche Formate haben, je nachdem, mit welcher Methode er generiert wurde. Schlüssel, die mit der GCP Console oder dem gcloud-Befehlszeilentool erstellt wurden, sehen so aus:

{
"type": "service_account",
"project_id": "[PROJECT-ID]",
"private_key_id": "[KEY-ID]",
"private_key": "-----BEGIN PRIVATE KEY-----\n[PRIVATE-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]"
}

Schlüssel, die mit der REST API oder Clientbibliotheken generiert wurden, sehen so aus:

{
"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"
}

Da die Formatierung jeweils von der Methode abhängt, ist es am einfachsten, die Schlüssel mit der Methode zu generieren, die Sie auch für zukünftige API-Aufrufe verwenden möchten. Wenn Sie gcloud verwenden, generieren Sie Ihren Schlüssel mit gcloud. Schlüssel, die mit einer anderen Methode erstellt wurden (zum Beispiel mit REST generierte Schlüssel, die mit gcloud verwendet werden), müssen bearbeitet und an das geeignete Format angepasst werden.

Google sorgt dafür, dass die öffentlichen Schlüssel für alle Dienstkonten für jeden öffentlich zugänglich und verfügbar sind, sodass mit dem privaten Schlüssel erstellte Signaturen überprüft werden können. Der öffentliche Schlüssel ist unter den folgenden URLs öffentlich zugänglich:

  • x.509-Zertifikat: https://www.googleapis.com/service_accounts/v1/metadata/x509/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • JSON-Webschlüssel (JWK): https://www.googleapis.com/service_accounts/v1/jwk/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • Rohendpunkt: https://www.googleapis.com/service_accounts/v1/metadata/raw/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Dienstkontoschlüssel auflisten

Sie können die Dienstkontoschlüssel für ein Dienstkonto in der GCP Console, mit dem gcloud-Tool, der Methode serviceAccount.keys.list() oder einer der Clientbibliotheken auflisten.

Die Methode serviceAccount.keys.list() wird in der Regel verwendet, um Dienstkonten und Schlüssel zu überprüfen oder benutzerdefinierte Tools für die Verwaltung von Dienstkonten zu erstellen.

Um herauszufinden, zu welchem Projekt Ihr Schlüssel gehört, können Sie den Schlüssel als JSON-Datei herunterladen und sich anschließend die Datei ansehen.

Eventuell werden Schlüssel aufgelistet, die Sie nicht erstellt haben. Dies sind von der GCP verwaltete Schlüssel, die von GCP-Diensten wie App Engine und Compute Engine verwendet werden. Weitere Informationen zum Unterschied zwischen von Nutzern und der GCP verwalteten Schlüsseln finden Sie unter Informationen zu Dienstkonten.

Console

  1. Öffnen Sie die Seite IAM & Verwaltung in der GCP Console.

    Weiter zur Seite "IAM & Verwaltung"

  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Weiter.

  3. Klicken Sie in der linken Navigationsleiste auf Dienstkonten. Nun werden alle Dienstkonten und die zugehörigen Schlüssel aufgelistet.

Befehl "gcloud"

Führen Sie den Befehl gcloud iam service-accounts keys list aus, um Dienstkontoschlüssel aufzulisten.

Befehl:

gcloud iam service-accounts keys list
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Ausgabe:

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

REST API

Anfrage:

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys

Antwort:

{
    "keys": [
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
        "validAfterTime": "2016-01-25T18:38:09.000Z",
        "validBeforeTime": "2026-01-22T18:38:09.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
        "validAfterTime": "2016-01-25T13:43:27.000Z",
        "validBeforeTime": "2016-01-26T13:43:27.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
        "validAfterTime": "2016-01-26T13:28:27.000Z",
        "validBeforeTime": "2016-01-27T13:28:27.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    }]
}

C#

Für dieses Beispiel müssen Sie C# wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM C# API.

public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
{
    IList<ServiceAccountKey> keys = s_service.Projects.ServiceAccounts.Keys
        .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
        .Execute().Keys;

    foreach (ServiceAccountKey key in keys)
    {
        Console.WriteLine("Key: " + key.Name);
    }
    return keys;
}

Go

Für dieses Beispiel müssen Sie Go wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Go API.

import (
	"context"
	"fmt"
	"io"

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

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %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

Für dieses Beispiel müssen Sie Java wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Java API.

public List<ServiceAccountKey> listKeys(String serviceAccountEmail) throws IOException {

  List<ServiceAccountKey> keys =
      service
          .projects()
          .serviceAccounts()
          .keys()
          .list("projects/-/serviceAccounts/" + serviceAccountEmail)
          .execute()
          .getKeys();

  for (ServiceAccountKey key : keys) {
    System.out.println("Key: " + key.getName());
  }
  return keys;
}

Python

Für dieses Beispiel müssen Sie Python wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Python API.

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

    # pylint: disable=no-member
    keys = service.projects().serviceAccounts().keys().list(
        name='projects/-/serviceAccounts/' + service_account_email).execute()

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

Dienstkontoschlüssel abrufen

Die Daten für den privaten Schlüssel des Dienstkontoschlüssels können nur bei der ersten Erstellung des Schlüssels abgerufen werden.

Mit der REST API-Methode projects.serviceAccounts.keys.get() erhalten Sie grundlegende Informationen zu einem Schlüssel, z. B. ID, Algorithmus und Daten des öffentlichen Schlüssels. Die GCP Console und das gcloud-Befehlszeilentool werden nicht unterstützt.

Dienstkontoschlüssel löschen

Sie können einen Dienstkontoschlüssel in der GCP Console, mit dem gcloud-Tool, der Methode serviceAccount.keys.delete() oder einer der Clientbibliotheken löschen.

Wenn Sie einen Schlüssel löschen, kann Ihre Anwendung nicht mehr mit diesem Schlüssel auf Cloud Platform-Ressourcen zugreifen. Es empfiehlt sich daher, die Dienstkontoschlüssel regelmäßig zu rotieren. Sie können einen Schlüssel rotieren, indem Sie zuerst einen neuen Schlüssel erstellen, dann die Anwendungen auf den neuen Schlüssel umstellen und anschließend den alten Schlüssel löschen. Verwenden Sie die Methoden serviceAccount.keys.create() und serviceAccount.keys.delete() gemeinsam, um die Rotation zu automatisieren.

Console

  1. Öffnen Sie die Seite IAM & Verwaltung in der GCP Console.

    Weiter zur Seite "IAM & Verwaltung"

  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Weiter.

  3. Klicken Sie in der linken Navigationsleiste auf Dienstkonten. Nun werden alle Dienstkonten und die zugehörigen Schlüssel aufgelistet.

  4. Klicken Sie auf die E-Mail-Adresse des gewünschten Dienstkontos, um dessen Schlüssel aufzurufen.

  5. Klicken Sie in der Liste der Schlüssel für jeden Schlüssel, den Sie löschen möchten, auf Löschen delete.

Befehl "gcloud"

Führen Sie den Befehl gcloud iam service-accounts keys delete aus, um Dienstkontoschlüssel zu löschen.

Befehl:

gcloud iam service-accounts keys delete [KEY-ID]
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Ausgabe:

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
service account [SA-NAME@PROJECT-ID.iam.gserviceaccount.com]

REST API

Anfrage:

DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys/[KEY-ID]

C#

Für dieses Beispiel müssen Sie C# wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM C# API.

public static void DeleteKey(string fullKeyName)
{
    s_service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
    Console.WriteLine("Deleted key: " + fullKeyName);
}

Go

Für dieses Beispiel müssen Sie Go wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Go API.

import (
	"context"
	"fmt"
	"io"

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

// deleteKey deletes a service account key.
func deleteKey(w io.Writer, fullKeyName string) error {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return fmt.Errorf("iam.New: %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

Für dieses Beispiel müssen Sie Java wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Java API.

public void deleteKey(String fullKeyName) throws IOException {

  service.projects().serviceAccounts().keys().delete(fullKeyName).execute();

  System.out.println("Deleted key: " + fullKeyName);
}

Python

Für dieses Beispiel müssen Sie Python wie unter Cloud IAM-Schnellstart zur Verwendung von Clientbibliotheken beschrieben einrichten. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud IAM Python API.

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

    # pylint: disable=no-member
    service.projects().serviceAccounts().keys().delete(
        name=full_key_name).execute()

    print('Deleted key: ' + full_key_name)

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Dokumentation zu Cloud Identity and Access Management