在 C# 中从 PKCS1 转换为 PKCS8
Posted
技术标签:
【中文标题】在 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-----\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 私钥......没有足够的权限?
【问题讨论】:
【参考方案1】:我想通了。
我有两组凭据可以试验:
PKCS#1 RSA 私钥 PKCS#8 私钥:与此相关,我还有一个“私钥 id”和“项目 id”由于两个私钥都与同一个服务客户端电子邮件相关,因此我一直在为上述任一私钥提供(否则为可选)“私钥 id”和“项目 id”值。
当我处理 PKCS#1 时,我所要做的就是故意省略“私钥 id”和“项目 id”,然后它就起作用了。这让我仍然想知道这些可选值的用途是什么……尽管我怀疑它与安全审计有关(例如身份验证日志)。
【讨论】:
以上是关于在 C# 中从 PKCS1 转换为 PKCS8的主要内容,如果未能解决你的问题,请参考以下文章
BouncyCastle 密钥转换 - Java pkcs1格式,pkcs8格式互转
openssl生成RSA格式及pkcs1与pkcs8格式互相转换
openssl生成RSA格式及pkcs1与pkcs8格式互相转换
.NET Core RSA密钥的xmlpkcs1pkcs8格式转换和JavaScriptJava等语言进行对接