Blog

So erstellen Sie Ihre eigene Schlüsseldatei für Ihr Google-Servicekonto

Mark van Holsteijn

Aktualisiert Oktober 21, 2025
4 Minuten

Wenn Sie eine Google-Dienstkonto-Schlüsseldatei für ein externes System erstellen, muss der private Schlüssel
transportiert werden. Außerdem ist der erzeugte Schlüssel bis zum 1. Januar
des Jahres 10000 gültig. In diesem Blog zeige ich Ihnen, wie sich ein externes System als
Dienstkonto ausweisen kann, ohne den privaten Schlüssel preiszugeben.

Warum sind die Schlüsseldateien für das Google-Servicekonto ein Problem?

Für die meisten Anwendungen, die auf Google Cloud Platform laufen, ist es nicht erforderlich, eine
Datei herunterzuladen: Die Laufzeitumgebung stellt Ihrer Anwendung temporäre Anmeldeinformationen zur Verfügung. Leider haben die externen Systeme von
diesen Luxus nicht. Warum sind Dienstkontenschlüssel also ein Problem? Sehen Sie sich einen an:

{
  "type": "service_account",
  "project_id": "demo-project",
  "private_key_id": "f871b60d0617be19393bb66ea142887fc9621360",
  "private_key": "-----BEGIN RSA PRIVATE KEY-----.....",
  "client_email": "look-no-keys@demo-project.iam.gserviceaccount.com",
  "client_id": "102234449335144000000",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/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/look-no-keys%40demo-project.iam.gserviceaccount.com"
}

Wie Sie sehen können, befindet sich dort ein privater RSA-Schlüssel im Klartext! Und wenn der Schlüssel
kompromittiert wird, ist er bis zum 1. Januar des Jahres 10000 gültig.

Erstellen Sie Ihre eigene private Schlüsseldatei für Ihr Google-Servicekonto

Wenn Sie sich eine Schlüsseldatei für ein Google-Servicekonto ansehen, finden Sie die folgenden variablen Teile:

Daraus geht hervor, dass Sie, wenn Sie über einen privaten RSA-Schlüssel verfügen, eine Schlüsseldatei
erstellen und den öffentlichen Schlüssel mit einem beliebigen Dienstkonto verknüpfen können, indem Sie den Befehl
key upload verwenden. Um dies zu tun, müssen Sie:

  • Erstellen Sie ein Dienstkonto
  • Binden Sie eine Rolle an sie
  • Einen privaten Schlüssel generieren
  • Erstellen Sie ein selbstsigniertes Zertifikat
  • Laden Sie den öffentlichen Schlüssel hoch
  • Erzeugen Sie die Schlüsseldatei für das Dienstkonto Danach können Sie die Schlüsseldatei verwenden, um sich als Dienstkonto zu identifizieren!

Erstellen Sie ein Dienstkonto

Um unser Demo-Servicekonto zu erstellen, geben Sie ein:

gcloud iam service-accounts create look-no-keys

PROJECT_ID=$(gcloud config get-value project)
CLIENT_EMAIL=look-no-keys@${PROJECT_ID}.iam.gserviceaccount.com
CLIENT_ID=$(gcloud iam service-accounts \
        describe $CLIENT_EMAIL \
    --format 'value(uniqueId)')

Eine Rolle binden

Um eine Rolle an das Dienstkonto zu binden, geben Sie ein:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:$CLIENT_EMAIL" \
  --role roles/viewer

Zu Demonstrationszwecken haben wir die Rolle des Projektbetrachters gewählt.

Einen privaten Schlüssel generieren

Um Ihren eigenen privaten Schlüssel zu erzeugen, geben Sie ein:

PRIVATE_KEY=$(openssl genrsa 4096)

Natürlich können Sie auch einen vorhandenen privaten Schlüssel auf Ihrem System verwenden.

Erstellen Sie ein selbstsigniertes Zertifikat

Um ein selbstsigniertes X509-Zertifikat mit Ihrem eigenen privaten Schlüssel zu erstellen, geben Sie ein:

openssl req -x509 -new  \
  -key - \
  -subj /CN=markvanholsteijn@binx.io \
  -out csr.pem <<< $PRIVATE_KEY

openssl x509 \
   -in csr.pem \
   -signkey - \
   -days 365 \
   -out certificate.pem <<< $PRIVATE_KEY

Das Zertifikat enthält sowohl Informationen über den Betreff als auch den öffentlichen Schlüssel.

Laden Sie den öffentlichen Schlüssel hoch

Um diesen öffentlichen Schlüssel in das Dienstkonto hochzuladen, geben Sie ein:

gcloud iam service-accounts keys \
   upload certificate.pem \
   --iam-account $CLIENT_EMAIL \
   --format json > uploaded.json

PRIVATE_KEY_ID=$(jq -r .name uploaded.json | \
   awk -F/ '{print $NF}')

Ich sollte in der Lage sein, die Schlüssel-ID aus der certificate.pem zu berechnen, aber ich habe nicht herausgefunden, welchen
Algorithmus Google verwendet.

die Schlüsseldatei für das Google-Servicekonto erzeugen

Um die Schlüsseldatei für das Google-Dienstkonto zu erstellen, geben Sie ein:

touch look-no-keys.json
chmod 0600 look-no-keys.json

jq -n \
   --arg PRIVATE_KEY "$PRIVATE_KEY" \
   --arg PROJECT_ID $PROJECT_ID \
   --arg CLIENT_EMAIL $CLIENT_EMAIL \
   --arg CLIENT_ID $CLIENT_ID \
   --arg PRIVATE_KEY_ID $PRIVATE_KEY_ID \
  '{
  "type": "service_account",
  "project_id": $PROJECT_ID,
  "private_key_id": $PRIVATE_KEY_ID,
  "private_key": $PRIVATE_KEY,
  "client_email": $CLIENT_EMAIL,
  "client_id": $CLIENT_ID,
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": @uri "https://www.googleapis.com/robot/v1/metadata/x509/\($CLIENT_EMAIL)"
}' > look-no-keys.json

In dieser Demonstration kopieren wir den privaten Schlüssel in die Datei

Authentifizieren Sie sich mit Ihrem privaten Schlüssel

Um sich mit Ihrem eigenen privaten Schlüssel zu authentifizieren, geben Sie ein:

gcloud auth activate-service-account \
  --key-file look-no-keys.json

Jetzt können Sie die Projektressourcen anzeigen, aber nichts ändern:

$ gcloud compute instances list
Listed 0 items.

$ gcloud compute instances create demo1

ERROR (gcloud.compute.instances.create) Could not fetch resource:
 - Required 'compute.instances.create' permission

Fazit

In diesem Blog habe ich gezeigt, dass sich ein externes System mit seinem eigenen privaten RSA-Schlüssel authentifizieren kann.
Der Schlüssel muss nicht transportiert werden, und die Lebensdauer des öffentlichen Schlüssels kann auf einen Zeitraum
Ihrer Wahl begrenzt werden. Dieses Wissen kann genutzt werden, um die Daten des privaten Schlüssels aus der Terraform-Statusdatei herauszuhalten oder
um Ihre Anmeldedaten programmatisch mit einem vorhandenen privaten Schlüssel zu erstellen.


Bild von Steve Buissinne aus Pixabay

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.