我正在阅读云身份和访问管理方法的文档:projects.serviceAccounts.signBlob。除了正文,我已经弄清楚了,它是
{
"bytesToSign": string
}
文件上说这应该是
The bytes to sign.
A base64-encoded string.
天啊,真有帮助!有人能解释一下bytesToSign
是什么吗?我在那里放了什么?服务帐户私钥?
Google Cloud Platform(GCP(IAM API方法projects.serviceAccounts.signBlob
允许您使用给定服务帐户的系统管理私钥对一组数据进行加密"签名"。
更多信息:数字签名
权限
为了使用服务帐户对Blob进行签名,您需要确保您的帐户对有问题的服务帐户具有iam.serviceAccounts.signBlob
权限。最简单的方法是在项目或服务帐户上授予您的帐户服务帐户令牌创建者。此角色包含以下权限:
- iam.serviceAccounts.get
- iam.serviceAccounts.getAccessToken
- iam.serviceAccounts.implicitDelegation
- iam.serviceAccounts.list
- iam.serviceAccounts.signBlob
- iam.serviceAccounts.signJwt
- resourcemanager.projects.get
- resourcemanager.projects.list
使用API
这个API端点接受两个参数:
- 服务帐户名称(在请求的URL中(
- 您要加密签名的blob(在请求正文中(
举个例子,假设您想要签署以下文本:
Here is some text that I would like to sign.
首先,您必须对字符串进行base64编码,该字符串变为:
SGVyZSBpcyBzb21lIHRleHQgdGhhdCBJIHdvdWxkIGxpa2UgdG8gc2lnbi4=
然后,您将在正文中使用base64编码的字符串发布到端点。例如,如果你的项目名为my-project
,并且你想用我的应用程序引擎默认服务帐户签署blob,你可以这样做:
帖子:https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/my-project@appspot.gserviceaccount.com:signBlob?key={YOUR_API_KEY}
身体:
{
"bytesToSign": "SGVyZSBpcyBzb21lIHRleHQgdGhhdCBJIHdvdWxkIGxpa2UgdG8gc2lnbi4="
}
如果成功,它将返回一个响应,其中包含用于对blob进行签名的keyId
和作为已签名blob的signature
。
示例:
{
"keyId": "f123aa7016e4565e49a489357aa384fa25a9e789",
"signature": "t7FT+3b0AUzqmGHofHIa8MDcfuBOKQa4/DtK6Ovel22Y9pa5G4PduW5iYY9EMQpyXW3sZEZiyFRs3M9nGkLt/DKXITCW9Ta4nvLZwNj1ahFjkujr12iUzyU+NR9/Db2LWoI/g4j1e27E9O8zqXdi+BQpKkOYHUcfbH3xcTbEJnmjU/1zEHztNRXlihNPyOjSWsKhPdVnVzxYmi6Y3Bmgb3kCZe5hhUhANo9gavsakSogi0y5z625vHiW3roQkH2fEktcDkf49GlLJEHqRu+FaCcAwgpsEs/Nm+llgfhSuHKx1tcvslmTWOGAnYDKVg74oqg4FgfhiLqBWJYRrFRwxQ=="
}
您可以在API资源管理器上尝试(但将项目名称更改为您的项目,并将服务帐户名称更改为服务帐户(。
这也可以用gcloud来完成,例如:
$ gcloud iam service-accounts sign-blob
--iam-account my-account@somedomain.com input.bin output.bin
有关此命令如何连接到更广泛的云基础设施的更多信息,请参阅:
- https://cloud.google.com/appengine/docs/standard/python/appidentity/
- https://cloud.google.com/appengine/docs/java/appidentity/
- https://cloud.google.com/appengine/docs/standard/php/appidentity/
- https://cloud.google.com/appengine/docs/standard/go/appidentity/
您可以使用它来向非谷歌服务断言您的身份。如果您想断言您提供给外部应用程序的某些文本实际上来自您,那么您可以使用signBlob
方法对文本进行签名,以使用私钥对文本进行签署,然后您可以使用get_public_certificates()
方法获得证书列表,这些证书可用于验证签名。
更多:向第三方服务断言身份
感谢@lukwam和@John Hanley,答案是我不需要使用projects.serviceAccounts.signBlob
,也就是说,这是一个我不需要去的兔子洞。我收到了一条SigningError
消息,我需要为服务帐户分配角色,正如我在本问答中详细介绍的那样。