【问题标题】:Convert from PKCS1 to PKCS8 in C#在 C# 中从 PKCS1 转换为 PKCS8
【发布时间】: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


    【解决方案1】:

    我想通了。

    我有两组凭据可以试验:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2014-02-16
      • 2012-01-07
      • 2023-04-04
      相关资源
      最近更新 更多