创建和管理服务帐号密钥

本页面介绍了如何使用 Google Cloud Console、gcloud 命令行工具Identity and Access Management API 或某种 Google Cloud 客户端库来创建和管理服务帐号密钥。

准备工作

所需权限

若要允许用户管理服务帐号密钥,请授予 Service Account Key Admin 角色 (roles/iam.serviceAccountKeyAdmin)。如需了解详情,请参阅服务帐号角色

IAM 基本角色还包含管理服务帐号密钥的权限。您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。

创建服务帐号密钥

如要在 Google Cloud 之外(例如在其他平台上或在本地)使用服务帐号,您必须首先确定服务帐号的身份。为确保安全地实现此目标,您可以使用公钥/私钥对。 创建服务帐号密钥时,公共部分存储在 Google Cloud 上,而不公开部分仅供您使用。如需详细了解公钥/私钥对,请参阅服务帐号密钥

您可以使用 Cloud Console、gcloud 工具、serviceAccounts.keys.create() 方法或某种客户端库创建服务帐号密钥。 一个服务帐号最多可以有 10 个密钥。

在下面的示例中,sa-name 是您的服务帐号的名称,而 project-id 是您的 Google Cloud 项目的 ID。您可以从 Cloud Console 中的服务帐号页面检索 sa-name@project-id.iam.gserviceaccount.com 字符串。

控制台

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”

  2. 选择一个项目。

  3. 点击要为其创建密钥的服务帐号的电子邮件地址。

  4. 点击密钥标签页。

  5. 点击添加密钥下拉菜单,然后选择创建新密钥

  6. 选择 JSON 作为密钥类型,然后点击创建

点击创建即会下载服务帐号密钥文件。下载密钥文件后,您无法再次下载。

下载的密钥采用以下格式,其中 private-key 是公钥/私钥对的私有部分:

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

务必要安全存储密钥文件,因为它能够以服务帐号的身份进行身份验证。您可以根据需要移动并重命名此文件。

您可以使用服务帐号密钥文件来将应用作为服务帐号进行身份验证

gcloud

执行 gcloud iam service-accounts keys create 命令来创建服务帐号密钥。

替换以下值:

  • key-file:私钥的新输出文件的路径,例如 ~./sa-private-key.json
  • sa-name:要为其创建密钥的服务帐号的名称。
  • project-id:您的 Google Cloud 项目 ID。
gcloud iam service-accounts keys create key-file \
    --iam-account=sa-name@project-id.iam.gserviceaccount.com

输出:

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

现在,服务帐号密钥文件已下载到您的机器上。下载密钥文件后,您无法再次下载。

下载的密钥采用以下格式,其中 private-key 是公钥/私钥对的私有部分:

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

务必要安全存储密钥文件,因为它能够以服务帐号的身份进行身份验证。您可以根据需要移动并重命名此文件。

您可以使用服务帐号密钥文件来将应用作为服务帐号进行身份验证

REST

projects.serviceAccounts.keys.create 方法可为服务帐号创建密钥。

在使用下面的请求数据之前,请先进行以下替换:

  • project-id:您的 Google Cloud 项目 ID。
  • sa-name:您要为其创建密钥的服务帐号的名称。
  • key-algorithm:可选。用于密钥的密钥算法。默认值(随时可能更改)为 2048 位 RSA 密钥。如需查看所有可能值的列表,请参阅 ServiceAccountKeyAlgorithm 参考文档

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "keyAlgorithm": "key-algorithm"
}

如需发送您的请求,请展开以下选项之一:

响应中包含您的服务帐号的密钥。返回的密钥采用以下格式,其中 encoded-private-key 是公钥/私钥对的私有部分,采用 base64 编码。

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

如要创建可用于以服务帐号身份进行身份验证的密钥文件,请解码私钥数据并将其保存在文件中:

Linux

运行以下命令:

echo 'encoded-private-key' | base64 --decode > path

path 替换为您要保存密钥的文件的路径。使用 .json 文件扩展名。

macOS

运行以下命令:

echo 'encoded-private-key' | base64 --decode > path

path 替换为您要保存密钥的文件的路径。使用 .json 文件扩展名。

PowerShell

  1. 将已编码的私钥数据 (encoded-private-key) 保存在文件中。

  2. 使用 certutil 对文件进行解码:

    certutil -decode encoded-file decoded-file
    

    替换以下值:

    • encoded-file:包含已编码私钥数据的文件路径。
    • decoded-file:您要在其中保存密钥的文件的路径。使用 .json 文件扩展名。

务必要安全存储密钥数据,因为它能够以服务帐号的身份进行身份验证。

您可以使用服务帐号密钥文件来将应用作为服务帐号进行身份验证

C#

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 IAM Go API 参考文档

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 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'])

Google 可确保所有服务帐号的所有公钥都可供任何人公开访问,并可用于验证使用私钥创建的签名。可通过以下网址公开访问公钥:

  • x.509 证书:https://www.googleapis.com/service_accounts/v1/metadata/x509/sa-name@project-id.iam.gserviceaccount.com
  • JSON Web 密钥 (JWK):https://www.googleapis.com/service_accounts/v1/jwk/sa-name@project-id.iam.gserviceaccount.com
  • 原始端点:https://www.googleapis.com/service_accounts/v1/metadata/raw/sa-name@project-id.iam.gserviceaccount.com

列出服务帐号密钥

您可以使用 Cloud Console、gcloud 工具,serviceAccount.keys.list() 方法或某种 客户端库列出服务帐号的密钥。

serviceAccount.keys.list() 方法通常用于审核服务帐号和密钥,或者构建用于管理服务帐号的自定义工具。

要了解您的密钥属于哪个项目,您可以以 JSON 文件的格式下载该密钥并查看该文件。

您可能会发现有些列出的密钥并不是由您创建的。这些密钥是供 Google Cloud 服务(例如 App Engine 和 Compute Engine)使用且由 Google Cloud 管理的密钥。如需详细了解用户管理的密钥和 Google Cloud 管理的密钥之间的差异,请参阅了解服务帐号

控制台

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”

  2. 选择一个项目。Cloud Console 会列出项目的所有服务帐号及其对应的密钥。

gcloud

执行 gcloud iam service-accounts keys list 命令来列出服务帐号密钥。

替换以下值:

  • sa-name:要为其列出密钥的服务帐号的名称。
  • project-id:您的 Google Cloud 项目 ID。
gcloud iam service-accounts keys list \
    --iam-account sa-name@project-id.iam.gserviceaccount.com

输出:

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2021-01-01T21:01:42Z 9999-12-31T23:59:59Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2021-01-01T20:55:40Z 9999-12-31T23:59:59Z

REST

projects.serviceAccounts.keys.list 方法可列出服务帐号的所有服务帐号密钥。

在使用下面的请求数据之前,请先进行以下替换:

  • project-id:您的 Google Cloud 项目 ID。
  • sa-name:您要列出其密钥的服务帐号的名称。
  • key-types:可选。您想要在响应中包含的密钥类型的英文逗号分隔列表。密钥类型会指出密钥是由用户管理 (USER_MANAGED) 还是由系统管理 (SYSTEM_MANAGED)。如果留空,则返回所有密钥。

HTTP 方法和网址:

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

如需发送您的请求,请展开以下选项之一:

您应该会收到类似以下内容的 JSON 响应:

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 IAM Go API 参考文档

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 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'])

获取服务帐号密钥

首次创建服务帐号密钥时,您只能获取该密钥的私钥数据。

您可以使用 projects.serviceAccounts.keys.get() REST API 方法获取密钥的基本信息,例如密钥的 ID、算法和公钥数据。系统不支持使用 Cloud Console 或 gcloud 命令行工具来执行此操作。

上传服务帐号的公钥

您可以将用户管理的密钥对的公钥部分上传到服务帐号。上传公钥后,该公钥将与服务帐号永久关联,其使用方式与任何其他用户管理的服务帐号密钥相同。如需停用为项目上传密钥的功能,请参阅限制服务帐号密钥上传

如果您选择使用用户管理的密钥对,而不是 Google 管理的密钥对,请务必保留该密钥对并定期进行轮替。

您上传的密钥必须是封装在 X.509 v3 证书中并以 base64 编码的 RSA 公钥。您可以使用 OpenSSL 等工具生成此格式的密钥和证书。例如,以下命令会生成 2048 位 RSA 密钥对,并将公钥封装在有效期为 365 天的自签名证书中:

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

然后,您可以上传 public_key.pem 文件作为服务帐号的公钥。

控制台

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”

  2. 选择一个项目。

  3. 点击要为其上传密钥的服务帐号的电子邮件地址。

  4. 点击密钥标签页。

  5. 点击添加键下拉菜单,然后选择上传现有密钥

  6. 点击浏览,然后找到并选择您的公钥文件。或者,您也可以复制公钥文件的内容,并将其粘贴到粘贴现有密钥框中。

  7. 点击上传

gcloud

执行 gcloud iam service-accounts keys upload 命令来上传用于签署服务帐号密钥的公钥。

替换以下值:

  • key-file:包含要上传的密钥数据的文件的路径,例如 ./public_key.pem
  • sa-name:要为其上传密钥的服务帐号的名称。
  • project-id:您的 Google Cloud 项目 ID。
gcloud iam service-accounts keys upload key-file \
    --iam-account sa-name@project-id.iam.gserviceaccount.com

输出包含所上传密钥的唯一标识符:

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

如需确定该命令是否成功运行,请执行 gcloud iam service-accounts keys list 命令:

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

输出将包含创建密钥后返回的相同唯一标识符:

KEY_ID CREATED_AT EXPIRES_AT
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42Z 9999-12-31T23:59:59Z

REST

projects.serviceAccounts.keys.upload 方法可上传用户管理的密钥对中的公钥,并将此公钥添加到服务帐号。

在使用下面的请求数据之前,请先进行以下替换:

  • project-id:您的 Google Cloud 项目 ID。
  • sa-name:要与密钥关联的服务帐号的名称。
  • public-key-data:密钥对的公钥数据。必须是封装在 X.509 v3 证书中的 RSA 公钥。使用 base64 对公钥数据进行编码,包括第一行 -----BEGIN CERTIFICATE----- 和最后一行 -----END CERTIFICATE-----

HTTP 方法和网址:

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

请求 JSON 正文:

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

如需发送您的请求,请展开以下选项之一:

您应会收到如下所示的 JSON 响应:

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

删除服务帐号密钥

您可以使用 Cloud Console、gcloud 工具、serviceAccount.keys.delete() 方法或某种客户端库删除服务帐号密钥。

在您删除密钥后,您的应用将无法再使用该密钥访问 Google Cloud 资源。安全性方面的最佳做法是定期轮替您的服务帐号密钥。要轮替密钥,只需创建新密钥,将应用更新为使用新密钥,然后删除旧密钥即可。您可以结合使用 serviceAccount.keys.create() 方法和 serviceAccount.keys.delete() 方法来自动执行轮替。

控制台

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”

  2. 选择一个项目。

  3. 点击您要删除其密钥的服务帐号的电子邮件地址。

  4. 点击密钥标签页。

  5. 从密钥列表中,针对您想删除的每个密钥点击删除

gcloud

执行 gcloud iam service-accounts keys delete 命令来删除服务帐号密钥。

替换以下值:

  • key-id:要删除的密钥的 ID。
  • sa-name:密钥所属服务帐号的名称。
  • project-id:您的 Google Cloud 项目 ID。
gcloud iam service-accounts keys delete key-id \
    --iam-account sa-name@project-id.iam.gserviceaccount.com

输出:

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

REST

projects.serviceAccounts.keys.delete 方法可删除服务帐号密钥。

在使用下面的请求数据之前,请先进行以下替换:

  • project-id:您的 Google Cloud 项目 ID。
  • sa-name:您要删除其密钥的服务帐号的名称。
  • key-id:您要删除的密钥的 ID。

HTTP 方法和网址:

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

如需发送您的请求,请展开以下选项之一:

您应该会收到类似以下内容的 JSON 响应:

{
}

C#

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 IAM Go API 参考文档

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

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

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 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)

亲自尝试

如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用