首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中将PKCS1转换为PKCS8

在C#中将PKCS1转换为PKCS8
EN

Stack Overflow用户
提问于 2021-09-18 01:19:00
回答 1查看 173关注 0票数 0

我正在使用C# google SDK访问Google Drive和GMail。对于身份验证,有时会为我提供一个PKCS8私钥,而有时它是一个PKCS1私钥。我可以让PKCS8身份验证工作,因为这是Google SDK所期望的。然而,当我尝试将PKCS1转换成PKCS8...it时,一开始似乎还行得通,直到我真正开始调用google的API。

基于this advice,下面是我用来接收PKCS1或PKCS8的代码:

代码语言:javascript
复制
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请求时收到的错误是:

代码语言:javascript
复制
 Error:"invalid_grant", Description:"java.security.SignatureException: Invalid signature for token: **JWT Suppressed**", Uri:""

我找到了this article,它谈到了谷歌“无效授权”的原因,“原因#9”涉及me...because它似乎表明我的令牌确实是错误的,这将与错误提到的“无效签名”相对应。尽管如此,我还是不确定我是不是在比较苹果。

有什么想法吗?

也许问题仅仅是我使用的PKCS1私钥...没有足够的权限?

EN

回答 1

Stack Overflow用户

发布于 2021-09-19 17:39:52

我想通了。

我有两组凭据可供试验:

  • PKCS#1

RSA PKCS#1

  • PKCS#8 private key:与此相关联,我还有一个"Private key id“和”

id“

因为这两个私钥都属于同一个服务客户端电子邮件,所以我已经为上面的私钥提供了(否则可选的) "private key id“和"project id”值。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69230848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档