格式化密钥以进行导入

本主题介绍了如何设置密钥格式,以便 Cloud KMS 能够将这些密钥作为新密钥版本导入。

正确的密钥材料格式因密钥材料是导入到对称密钥还是非对称密钥而异。如需详细了解对称密钥和非对称密钥之间的差异,请参阅密钥用途和算法

支持的密钥格式

  • 用于加密的对称密钥必须是 16 个字节(仅适用于原始对称加密)或 32 个字节的二进制数据,并且必须不进行编码。如果密钥采用十六进制编码或 base64 编码,则必须先对其进行解码,然后再尝试导入。

  • 用于签名的对称密钥(MAC 密钥)的长度必须等于使用的加密哈希函数的输出长度(例如 HMAC-SHA256 密钥的长度必须为 32 个字节),并且不得进行编码。如果您的密钥采用十六进制编码或 base64 编码,则必须先对其进行解码,然后再尝试导入。

  • 用于加密或签名的非对称密钥必须采用 PKCS #8 格式,且必须经过 DER 编码。PCKS #8 格式在 RFC 5208 中定义。DER 编码在 International Telecommunications Union X.680 中定义。非对称密钥必须使用 Cloud KMS 支持的其中一个长度和算法组合

密钥一经创建,密钥的某些方面(例如密钥的长度)便无法更改。在这些情况下,密钥无法导入到 Cloud KMS 中。

检查对称密钥

使用 wc 命令检查对称密钥的长度。

wc -c /path/to/unwrapped-key
  • 您不能导入长度不是 32 的对称加密密钥。

  • 对称签名密钥(MAC 密钥)的长度必须等于使用的加密哈希函数的输出长度(例如,HMAC-SHA256 密钥的长度必须为 32 个字节)。

使用 file 命令检查密钥的格式。

file /path/to/unwrapped-key
  • 如果输出为 data,则表示要导入的密钥格式正确。

  • 如果输出为 ASCII text,请使用 cat 命令显示文件内容。

    • 如果此文本是一个以 = 符号结尾并由字母和数字构成的字符串,则可能是 base64 编码的字符串。使用 base64 令(在 Windows 上为 Base64.exe)对其进行解码。以下是 base64 编码密钥的示例:

      THzArjassB+giKeNeT1Zr74OgV24t+Ep+37Ec6ojB3Y=
      
    • 如果其中包含一行或多行十六进制数字,则可能是十六进制编码。使用 xxd 命令(或 Windows 上的 Format-Hex PowerShell 命令)对其进行解码。以下是十六进制编码密钥的示例:

      00000000: 4c7c c0ae 36ac b01f a088 a78d 793d 59af  L|..6.......y=Y.
      00000010: be0e 815d b8b7 e129 fb7e c473 aa23 0776  ...]...).~.s.#.v
      
    • 如果它包含任何其他文本,则可能不是有效的对称密钥。

设置非对称密钥的格式

可以导入使用任何受支持算法的非对称密钥。实际上,很难追溯性地确定用于创建非对称密钥的算法。因此,我们建议您先对每个非对称密钥运行以下命令,然后再尝试将其导入 Cloud KMS。

  1. 使用 file 命令检查密钥的格式。

    file /path/to/unwrapped-key
    
    • 如果输出为 PEM,则密钥采用 PEM 格式。如果输出为 ASCII text,则密钥可能采用 PEM 格式。在这两种情况下,运行以下命令将其转换为 PCKS#8 DER 格式:

      openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER \
          -in /path/to/asymmetric-key-pem \
          -out /path/to/formatted-key
      
    • 如果输出为 data,则密钥可能采用 DER 格式,但可能不是 PKCS #8 格式。运行以下命令以确保密钥格式正确。如果密钥已采用正确的格式,则该命令无效。在这种情况下,您可以使用 diff 命令验证输入和输出文件是否相同。

      openssl pkcs8 -topk8 -nocrypt -inform DER -outform DER \
          -in /path/to/asymmetric-key-der \
          -out /path/to/formatted-key
      

问题排查

如果您运行上述命令并认为密钥格式正确,但导入仍然失败,请检查 Google Cloud 控制台中是否存在错误,然后参阅排查导入失败问题

后续步骤