我一直在尝试阅读文档,并观看他们的一些视频,但我不完全清楚如何使用GCP的云KMS存储私钥。
我的想法是将私钥存储在存储中,然后使用Cloud KMS加密它吗?我如何使这个密钥对我的应用程序可用?
我知道这是一个非常基本的问题,但是我找不到一个简单的分解方法,我在寻找一个关于这个概念的简单解释。谢谢!
请自己阅读:https://cloud.google.com/kms/docs…也许你会想出一个更有针对性的问题。我认为这有一个小小的误解——你只能在服务器端检索这些,而不能在客户端检索(否则客户端将需要拥有服务帐户的RSA私钥,它可以访问云KMS,这本身就是一个安全漏洞)。所以这通常只对a)服务器端应用程序和b)服务器端应用程序有用。Google Cloud Build.
通常必须:
-
创建具有
gcloud kms keyrings create
的keyring -
用
gcloud kms keys create
创建密钥 -
则使用
gcloud kms encrypt
和gcloud kms decrypt
我还可以提供一个用法示例(它假设有一个带密钥的key-ring)。只是为了说明,它不一定要设置秘密。gcloud kms
可以很好地提供构建秘密——假设可以使用角色为roles/cloudkms.cryptoKeyEncrypterDecrypter
的服务帐户。给出的示例解密所有类型的构建秘密—而不必处理元数据中任何base64编码的二进制文件(这是一种变通方法,而不是实际的解决方案)。
这是在谷歌云平台(GCP)上存储私钥的高级描述:
我最终使用了Google KMS,特别是非对称加密功能。
创建非对称密钥的一般步骤如下:- 在你的项目中创建一个密匙环
- 创建一个
ENCRYPT_DECRYPT
目的的密钥(如果像我一样,你正在尝试使用Terraform做这个,这里有一些文档
一旦我们创建了密钥,我们现在可以使用我们在上一步中创建的非对称密钥中的公钥加密一些我们想要保护的数据。
重要的是要注意,对于非对称密钥,存在一个公私密钥对,并且我们从不处理私钥(即只有GCP知道私钥)。
下面是你如何加密本地计算机上的一些数据:
echo -n my-secret-password | gcloud kms encrypt
> --project my-project
> --location us-central1
> --keyring my-key-ring
> --key my-crypto-key
> --plaintext-file -
> --ciphertext-file -
> | base64
这将输出一些base64编码的密文,例如:
CiQAqD+xX4SXOSziF4a8JYvq4spfAuWhhYSNul33H85HnVtNQW4SOgDu2UZ46dQCRFl5MF6ekabviN8xq+F+2035ZJ85B+xTYXqNf4mZs0RJitnWWuXlYQh6axnnJYu3kDU=
这个密文需要作为秘密存储。一旦作为秘密存储,我们需要在应用程序代码中执行以下操作,以便将密文解密为可用的格式。
下面是使用@google-cloud/kms
模块解密密文的示例:https://cloud.google.com/kms/docs/hsm#kms-decrypt-symmetric-nodejs
在Nodejs中是这样的:
//
// TODO(developer): Uncomment these variables before running the sample.
//
// const projectId = 'my-project';
// const locationId = 'us-east1';
// const keyRingId = 'my-key-ring';
// const keyId = 'my-key';
// Ciphertext must be either a Buffer object or a base-64 encoded string
// const ciphertext = Buffer.from('...');
// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the key name
const keyName = client.cryptoKeyPath(projectId, locationId, keyRingId, keyId);
// Optional, but recommended: compute ciphertext's CRC32C.
const crc32c = require('fast-crc32c');
const ciphertextCrc32c = crc32c.calculate(ciphertext);
async function decryptSymmetric() {
const [decryptResponse] = await client.decrypt({
name: keyName,
ciphertext: ciphertext,
ciphertextCrc32c: {
value: ciphertextCrc32c,
},
});
// Optional, but recommended: perform integrity verification on decryptResponse.
// For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
// https://cloud.google.com/kms/docs/data-integrity-guidelines
if (
crc32c.calculate(decryptResponse.plaintext) !==
Number(decryptResponse.plaintextCrc32c.value)
) {
throw new Error('Decrypt: response corrupted in-transit');
}
const plaintext = decryptResponse.plaintext.toString();
console.log(`Plaintext: ${plaintext}`);
return plaintext;
}
return decryptSymmetric();