【发布时间】:2021-11-12 18:28:53
【问题描述】:
我正在使用 C# google SDK 来访问 Google Drive 和 GMail。对于身份验证,有时我提供了一个 PKCS8 私钥,而其他时候它是一个 PKCS1 私钥。我可以使 PKCS8 身份验证工作,因为这是 Google SDK 所期望的。但是,当我尝试将 PKCS1 转换为 PKCS8 时...起初似乎可以工作,直到我真正开始对 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 谈到了 google 的“无效授权”的原因,而“原因 #9”让我担心......因为它似乎表明我的令牌确实格式错误,这与“无效签名”相对应“提到的错误。不过,我不确定我是否将苹果与苹果进行比较。
有什么想法吗?
也许问题只是我使用的 PKCS1 私钥......没有足够的权限?
【问题讨论】:
标签: c# google-api google-api-dotnet-client