【发布时间】:2014-11-12 13:55:32
【问题描述】:
我有自己的私钥字符串,即
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCSAYYgzvGTww....
....
....
.....
3yUMYj9oYzqdrRHP0XgD0cEEvyqPBwLaNsRdFwy5qTiHjj0f+ZWHQWmqcoLmmpzyZEbIvQm/VhbjRF6iKG4WZ9Hfa7ntYRNGdWgD/KMIeZI=
-----END RSA PRIVATE KEY-----
现在,我需要在 C# 中使用此私钥签署我的声明集以生成 JWT 有效负载。
我写了以下代码:
var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var issueTime = DateTime.Now;
var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;
var payload = new
{
iss = email,
prn = prn,
scope = "scope",
aud = "https://example.com",
exp = exp,
iat = iat
};
var segments = new List<string>();
var header = new { typ = "JWT", alg = "RS256" };
byte[] headerBytes = Encoding.UTF8.GetBytes(jsonSerializer.Serialize(header));
byte[] payloadBytes = Encoding.UTF8.GetBytes(jsonSerializer.Serialize(payload));
segments.Add(Base64UrlEncode(headerBytes));
segments.Add(Base64UrlEncode(payloadBytes));
var stringToSign = string.Join(".", segments.ToArray());
var bytesToSign = Encoding.UTF8.GetBytes(stringToSign);
现在我需要这些 bytesToSign 由我的私钥签名,正如我上面提到的使用 rs256 算法。任何人都可以帮忙吗?
我已按照以下内容更新了我的代码:
var pemprivatekey = OpenSSLKey.DecodeOpenSSLPrivateKey(privateKey);
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
if (pemprivatekey != null)
{
rsaProvider = OpenSSLKey.DecodeRSAPrivateKey(pemprivatekey);
}
byte[] signature = rsaProvider.SignData(bytesToSign, "SHA256");
segments.Add(Base64UrlEncode(signature));
return string.Join(".", segments.ToArray());
并生成 JWT 令牌。请让我知道我在哪里犯了错误,因为它不正确:当我将它传递给 API 时,它不起作用并引发错误。
【问题讨论】:
-
Start here 如果遇到困难请回来。对于其他人来说,RS256 似乎是使用 SHA-256 为 RSASSA-PKCS-v1_5 指定的 JSON 名称。
-
我尝试使用OpenSSLKey,它也解码了 RSA 私钥,并且我能够对我的字节进行编码以生成 JWT 令牌,但是当我传递给 API 时,它指出错误为无效的 JWT 令牌,有什么帮助吗? ,我在上面的问题本身中添加了更新的代码。
-
看来你已经领先了,但不幸的是,我本人并不了解 JWT 格式。
标签: c# cryptography rsa encode jwt