我需要创建需要使用Google提供的密钥签名的自定义令牌。密钥以文本形式提供,如-----BEGIN PRIVATE KEY-----\nMIIE...
。
我通过使用BouncyCastle来读取PEM密钥并获取RSA密钥,但是现在我需要这个项目在Linux下运行所以我不能使用BouncyCastle,因为它只适用于Windows(它使用RSACryptoServiceProvider)。
那么,有没有一种方法可以实现相同的结果,但只使用.NET标准代码?
我已经尝试将PEM文件转换为PFX文件,但我没有任何证书。试图从here或here获取证书不起作用(OpenSSL说证书不属于所提供的密钥)。
答案 0 :(得分:2)
您可以将PEM文件转换为p12文件,并使用该p12
对JWT进行签名var payload = new Dictionary<string, object>()
{
{ "sub", "mr.x@contoso.com" },
{ "exp", 1300819380 }
};
var privateKey=new X509Certificate2("my-key.p12", "password").GetRSAPrivateKey();
string token=Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.RS256);
以下是详情链接https://github.com/dvsekhvalnov/jose-jwt#rs--and-ps--family
答案 1 :(得分:2)
PemUtils library可以完全满足您的需求,无需使用RSACryptoServiceProvider
就可以解码PEM和DER数据。它以NuGet软件包的形式提供,如果您有任何其他需求,我是该库的作者,因此随时可以在github上发布问题。
类似的事情应该起作用:
using (var stream = File.OpenRead(path))
using (var reader = new PemReader(stream))
{
var rsaParameters = reader.ReadRsaKey();
var key = new RsaSecurityKey(RSA.Create(rsaParameters));
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.RsaSha256);
}
答案 2 :(得分:0)
只是扩展解决方案,这是完整的代码,工作(这是用于firebase auth令牌):
var privateKey = new X509Certificate2("cert.p12", "password");
var credentials = new SigningCredentials(new X509SecurityKey(privateKey), SecurityAlgorithms.RsaSha256);
var claims = new List<Claim>(8)
{
new Claim(JwtRegisteredClaimNames.Sub, "firebase-adminsdk-vifbe@your-service.iam.gserviceaccount.com"),
};
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.CreateEncodedJwt(
"firebase-adminsdk-vifbe@your-service.iam.gserviceaccount.com",
"https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
new ClaimsIdentity(claims),
DateTime.UtcNow.AddSeconds(-60),
DateTime.UtcNow.AddSeconds(10 * 60),
DateTime.UtcNow,
_credentials
);