指点成金-最美分享吧

登录

在 C# 中从 PKCS1 转换为 PKCS8

佚名 举报

技术标签:

【中文标题】在 C# 中从 PKCS1 转换为 PKCS8【英文标题】:Convert from PKCS1 to PKCS8 in C# 【发布时间】: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-----
";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 私钥......没有足够的权限?

【问题讨论】:

【参考方案1】:

我想通了。

我有两组凭据可以试验:

PKCS#1 RSA 私钥PKCS#8 私钥:与此相关,我还有一个“私钥 id”和“项目 id”

由于两个私钥都与同一个服务客户端电子邮件相关,因此我一直在为上述任一私钥提供(否则为可选)“私钥 id”和“项目 id”值。

当我处理 PKCS#1 时,我所要做的就是故意省略“私钥 id”和“项目 id”,然后它就起作用了。这让我仍然想知道这些可选值的用途是什么……尽管我怀疑它与安全审计有关(例如身份验证日志)。

【讨论】:

以上是关于在 C# 中从 PKCS1 转换为 PKCS8的主要内容,如果未能解决你的问题,请参考以下文章