生成 GPG 密钥
由 IBM Cloud DevSecOps 持续集成工具链构建并记录在清单中的工件必须在部署到生产前进行签名。 持续集成管道使用 Skopeo 作为缺省工具来提供工件签名功能。
创建并存储 DevSecOps 持续集成管道自动或手动使用的 GPG 密钥。
自动生成 GPG 密钥
使用此方法,模板将为您生成 GPG 密钥。 通过完成以下步骤,输入密钥生成的 名称 和 电子邮件:
-
转至 工件签名,然后单击 新建。
人工制品签名 " -
在该窗口中,将使用工具链名称和电子邮件标识来预填充 name 和 email 字段。 更改名称和电子邮件标识以反映您的 GPG 密钥需求。 您还可以通过选择此框将密钥存储在私钥提供程序中。
更改姓名和电子邮件地址 -
生成密钥后,您可以将其复制以供参考。
图 3 工件签名证书
复制的密钥为 base64 格式。 在将钥匙导入 钥匙圈 之前,先 解码 钥匙。echo <encoded_gpg_key> | base64 --decode
手动生成 GPG 密钥
下载并安装 GPG 命令行工具
下载并安装适用于您操作系统的 GPG 命令行工具。 转至 GnuPG 二进制发行版 部分,以下载适用于您的操作系统的工具。
Mac OS X
- 下载并安装 Mac GPG。
- 验证已安装的 GPG 的版本。 从命令行,运行下列命令:
$ gpg --version
gpg (GnuPG) 2.3.1
libgcrypt 1.9.3
Copyright (C) 2021 Free Software Foundation, Inc.
- 对于 2.3.1之前的 GPG 版本,可能无法使用 -- passphrase = '' 选项。 在这种情况下,您可以通过在提示时按 Enter 键来省略以下对话框中的密码。
Windows™
- 下载并安装 GitBash (对于
base64编码是必需的)。 - 验证已安装的 GPG 的版本。 在 Git bash 命令提示符中运行以下命令:
$ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 g10 Code GmbH
生成 GPG 密钥
如果 generate-key 命令打开一个要求口令的对话框,请将口令和字段留空。 这是映像签名的 (skopeo) 实用程序的限制,其中管道无法接受使用口令保护的专用密钥。 如果在创建期间提供口令,那么您的管道将无法对证书进行解码,而您的管道将在映像签名步骤中失败。 请注意,这也适用于 GIT 标记签名。
Mac OS X 和 Linux™
从 shell 提示符运行以下命令:
gpg --pinentry-mode loopback --passphrase='' --generate-key
- 输入您的姓名和电子邮件地址。
- 输入 O 以启动密钥创建。
- 生成密钥后,选择选项 O。
Windows™
GPG 版本> 1.4
从 Git bash 命令提示符,运行以下命令:
gpg --pinentry-mode loopback --passphrase='' --generate-key
- 在“真实姓名”字段中输入您的姓名。
- 在 电子邮件地址中输入您的电子邮件地址。
- 输入 O 以启动密钥创建。
- 生成密钥后,选择选项 O。
GPG 版本 < 1.4 (或前一条命令出现任何故障)
从 Git bash 命令提示符,运行以下命令:
gpg --gen-key
- 类型的密钥: 选择缺省选项 (1) RSA 和 RSA (缺省值)
- keysize: 保留缺省值 (2048)
- 键有效性: 将缺省值保留为 0。 这是因为值键 0 不会到期。
- 确认您的选择: 输入 y。
- 在 实名 字段中输入您的姓名。
- 在 电子邮件地址中输入您的电子邮件地址。
- 输入 O 以启动密钥创建。
- 生成密钥后,选择选项 O。
验证密钥创建
验证是否已创建 GPG 密钥。 在命令提示符下运行以下命令:
gpg --list-keys
确保列出了您的密钥。 Windows 上的示例输出:
$ gpg --list-keys
/c/Users/FredSmith/.gnupg/pubring.gpg
-------------------------------------
pub 2048R/1BB354B5 2021-06-08
uid Fred Smith <fred@company.com>
sub 2048R/F91C39A6 2021-06-08
导出密钥
此步骤是可选的。 运行此命令以确保可以导出 GPG 密钥。
gpg --export-secret-key <Email Address>
不得直接复制导出的原始密钥。 建议将此步骤中生成的密钥安全地存储在 Key Protect 实例或 Secrets Manager 实例中。 更多详情,请参阅后续章节。
存储密钥
必须通过下列其中一种方式向 CI 管道提供 GPG 密钥:
- 存储在 IBM® Key Protect for IBM Cloud® 中
- 存储在 IBM Cloud® Secrets Manager 中
- 直接存储在 CI 工具链中
请确保以正确的格式复制密钥,以防止由于导入失败而发生 CI 管道签名错误。 在以下命令中使用 pbcopy ( Mac OS X ) 或 clip (Windows Git bash) 将密钥内容复制到剪贴板。
将密钥存储在 Key Protect 中
导出 GPG 密钥并将其复制到剪贴板。
需要对 GPG 密钥进行双 base64 编码,然后才能将其存储在 Key Protect 实例中。
OS X
gpg --export-secret-key <Email Address> | base64 | base64 | pbcopy
Windows™
gpg --export-secret-key <Email Address> | base64 -w0 | base64 -w0 | clip
Linux™
gpg --export-secret-key <Email Address> | base64 | base64
-
在 IBM Cloud 控制台中,选择要在其中存储从先前步骤生成的 GPG 密钥的 Key Protect 实例。
-
单击 添加 + 图标以向实例添加新密钥。
-
选择 导入您自己的密钥 选项。
-
选择 选择密钥类型 作为 标准密钥。
-
在 密钥名称 字段中指定相应的名称。 稍后可通过此密钥名称检索存储的 GPG 密钥。
-
复制先前在 密钥材料 字段中导出的密钥。
确保在复制密钥并将其粘贴到 密钥资料 字段中时,密钥末尾没有多余的行。
-
选择 选择密钥环 选项作为缺省值。
-
单击 添加密钥 以将密钥添加到 密钥保护。
将密钥添加到密钥保护中
有关 Key Protect的更多信息,请参阅 Key Protect 文档。
将密钥存储在 Secrets Manager 中
在将 GPG 密钥存储在 Secrets Manager 实例中之前,需要 GPG 密钥的单个 base64 编码。
导出 GPG 密钥并将其复制到剪贴板。
OS X
gpg --export-secret-key <Email Address> | base64 | pbcopy
Windows™
gpg --export-secret-key <Email Address> | base64 -w0 | clip
Linux™
gpg --export-secret-key <Email Address> | base64
-
在 IBM Cloud 控制台中,选择要在其中存储从先前步骤生成的 GPG 密钥的 Secrets Manager 实例。
-
单击 添加 + 图标以向实例添加新密钥。
-
选择 其他密钥类型 选项。
其他秘密类型 " -
选择选项 选择密钥类型的 标准密钥 类型。
-
在 名称 字段中提供相应的名称。 稍后可通过此名称检索存储的 GPG 密钥。
-
选择 私钥值 选项,并在 私钥值 字段中粘贴先前导出的密钥。
确保在复制密钥并将其粘贴到 密钥值 字段中时,密钥末尾没有额外的行。
-
通过单击 添加 图标将密钥添加到 Key Protect 实例。
添加关键字
有关 Secrets Manager 的更多信息,请参阅 Secrets Manager 入门。
导出专用密钥并将其直接存储在 CI 管道中
建议不要使用此方法,应仅用于试验。 使用 Key Protect 或 Secrets Manager 来存储密钥。 有关更多信息,请参阅 配置密钥库
将 GPG 密钥作为安全管道属性存储之前,需要 GPG 密钥的单个 base64 编码。
将 GPG 密钥安全地存储在 Key Protect 或 Secrets Manager 实例中。
Mac OS X / Linux™
gpg --export-secret-key <Email Address> | base64
Windows™
gpg --export-secret-key <Email Address> | base64 -w0