我正在使用C# google SDK访问Google Drive和GMail。对于身份验证,有时会为我提供一个PKCS8私钥,而有时它是一个PKCS1私钥。我可以让PKCS8身份验证工作,因为这是Google SDK所期望的。然而,当我尝试将PKCS1转换成PKCS8...it时,一开始似乎还行得通,直到我真正开始调用google的API。
基于this advice,下面是我用来接收PKCS1或PKCS8的代码:
string pkcs8Key = null;
if (creds.PrivateKey.Contains("BEGIN RSA"))
{
// Handle PKCS1
var keyParts = creds.PrivateKey.Split("-----", StringSplitOptions.RemoveEmptyEntries);
var rawKey = keyParts.OrderByDescending(s => s.Length).First();
var base64Key = rawKey.Trim();
var privateKeyBytes = Convert.FromBase64String(base64Key);
using var privateKey = RSA.Create();
privateKey.ImportRSAPrivateKey(privateKeyBytes, out _);
var keyBytes = privateKey.ExportPkcs8PrivateKey();
pkcs8Key = $"-----BEGIN PRIVATE KEY-----{Convert.ToBase64String(keyBytes)}-----END PRIVATE KEY-----\n";
}
else
{
// Handle PKCS8
pkcs8Key = creds.PrivateKey;
}
initializer = new BaseClientService.Initializer
{
HttpClientInitializer = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(creds.ID)
{
Scopes = new[] { DirectoryService.Scope.AdminDirectoryUserReadonly, DriveService.Scope.Drive },
User = email ?? creds.AdminAccount,
KeyId = creds.PrivateKeyId,
ProjectId = creds.ProjectId
}.FromPrivateKey(pkcs8Key))
};虽然上面的代码运行成功,但我稍后发出SDK请求时收到的错误是:
Error:"invalid_grant", Description:"java.security.SignatureException: Invalid signature for token: **JWT Suppressed**", Uri:""我找到了this article,它谈到了谷歌“无效授权”的原因,“原因#9”涉及me...because它似乎表明我的令牌确实是错误的,这将与错误提到的“无效签名”相对应。尽管如此,我还是不确定我是不是在比较苹果。
有什么想法吗?
也许问题仅仅是我使用的PKCS1私钥...没有足够的权限?
发布于 2021-09-19 17:39:52
我想通了。
我有两组凭据可供试验:
RSA PKCS#1
id“
因为这两个私钥都属于同一个服务客户端电子邮件,所以我已经为上面的私钥提供了(否则可选的) "private key id“和"project id”值。
当我处理PKCS#1时,我要做的就是故意省略“私钥id”和“项目id",然后它就能工作了。这让我仍然想知道这些可选值serve...though我怀疑它与安全审计(例如身份验证日志)有关的目的是什么。
https://stackoverflow.com/questions/69230848
复制相似问题