Dienstkontoschlüssel erstellen und verwalten

Auf dieser Seite wird erläutert, wie Sie Dienstkontoschlüssel mithilfe 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

Damit Nutzer Dienstkontoschlüssel verwalten können, muss ihnen die Rolle Zentraler Dienstkontoadministrator (roles/iam.serviceAccountKeyAdmin) zugewiesen werden. 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 finden Sie in der Liste der Dienstkontorollen.

Dienstkontoschlüssel erstellen

Sie müssen erst die Identität des Dienstkontos bestätigen, um ein Dienstkonto außerhalb der GCP wie auf anderen Plattformen oder lokal zu verwenden. Paare aus öffentlichen und privaten Schlüsseln bieten dafür eine sichere Möglichkeit.

Mit dem gcloud-Tool, der Methode serviceAccounts.keys.create() oder einer der Clientbibliotheken können Sie über die GCP Console einen Dienstkontoschlüssel 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.


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

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.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
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 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 projectId = "my-project-id";

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

    try {
      ServiceAccountKey key =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .create(
                  "projects/-/serviceAccounts/your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  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
    GoogleCredential credential =
        GoogleCredential.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(),
                credential)
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

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.

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'])

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

Bei der Erstellung eines Schlüssels wird ein neues Paar aus öffentlichem und privatem Schlüssel generiert und auf Ihren Rechner heruntergeladen. Es dient als einzige Kopie des 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"
}

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

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

Rufen Sie serviceAccount.keys.list() auf, um die Schlüssel eines Dienstkontos aufzulisten.

Anfrage:

GET 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.


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

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.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
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 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 projectId = "my-project-id";

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

    try {
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .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
    GoogleCredential credential =
        GoogleCredential.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(),
                credential)
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

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.

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'])

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.

Öffentliche Schlüssel für Dienstkonten hochladen

Sie können den öffentlichen Schlüssel eines vom Nutzer verwalteten Schlüsselpaars hochladen, um Dienstkontoschlüssel zu signieren. Die Daten des öffentlichen Schlüssels sind dauerhaft mit dem Dienstkonto verknüpft und werden beim Erstellen von Dienstkontoschlüsseln für alle nachfolgenden Signaturen verwendet. Wenn Sie die Option zum Hochladen von Schlüsseln für Ihr Projekt deaktivieren möchten, finden Sie unter Nutzung von Dienstkonten einschränken weitere Informationen.

Wenn Sie ein vom Nutzer verwaltetes Schlüsselpaar anstelle eines von Google verwalteten Schlüsselpaars verwenden möchten, müssen Sie dieses verwalten und regelmäßig rotieren.

Stellen Sie vor dem Hochladen des öffentlichen Schlüssels sicher, dass er im Format RSA_X509_PEM vorliegt. Wenn Sie noch kein vorhandenes Zertifikat besitzen, können Sie mit Tools wie openssl ein selbstsigniertes X.509-Zertifikat im entsprechenden Format generieren. So generieren Sie mit dem Tool openssl ein gültiges Zertifikat:

openssl req -x509 -nodes -newkey rsa:2048 -keyout /output/path/to/private/key \
    -out /output/path/to/public/key -subj "/CN=unused"

Beachten Sie, dass X.509-Zertifikate, die mit openssl erstellt wurden, standardmäßig nach 30 Tagen ablaufen. Sie können die Ablaufzeit jedoch mit dem Flag -n verlängern oder verkürzen.

Befehl "gcloud"

Führen Sie den Befehl gcloud alpha iam service-accounts keys upload aus, um einen öffentlichen Schlüssel zum Signieren der Dienstkontoschlüssel hochzuladen.

Befehl:

gcloud alpha iam service-accounts keys upload /path/to/public/key \
  --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

Die Ausgabe enthält eine eindeutige Kennzeichnung für den hochgeladenen Schlüssel:

Name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

Führen Sie den Befehl gcloud iam service-accounts keys list aus, um festzustellen, ob der Befehl erfolgreich ausgeführt wurde:

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

Die Ausgabe enthält dieselbe eindeutige Kennzeichnung, die nach dem Erstellen des Schlüssels zurückgegeben wurde:

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

REST API

Rufen Sie serviceAccount.keys.upload() auf, um einen öffentlichen Schlüssel für ein Dienstkonto hochzuladen.

Anfrage:

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

Anfragetext:

{
  "publicKeyData": "LS0tLS1CRUdJTiBDRVJUSUZJQ...jlsCjVjMXUzVlVqS3AtLS0tXG4="
}

Der Anfragetext muss die Daten des öffentlichen Schlüssels im Format RSA_X509_PEM enthalten.

Antwort:

{
  "name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "USER_PROVIDED",
}

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 bei jedem 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.


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

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.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
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 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 projectId = "my-project-id";

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

    try {
      // First, get the name of the key using List() or Get()
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .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
    GoogleCredential credential =
        GoogleCredential.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(),
                credential)
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

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.

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)

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

Feedback geben zu...

Cloud IAM-Dokumentation