Как подписать / зашифровать JWT в C # с помощью ключа PEM? - PullRequest
0 голосов
/ 11 июня 2018

Мне нужно создать собственные токены, которые должны быть подписаны с помощью ключа, предоставленного Google.Ключ предоставляется в виде текста, например -----BEGIN PRIVATE KEY-----\nMIIE....

. Я работал с помощью BouncyCastle для чтения ключа PEM и получения ключей RSA, но теперь мне нужен этот проект для запуска под Linux, чтобы я мог 'использовать BouncyCastle, так как он работает только под Windows (он использует RSACryptoServiceProvider).

Итак, есть ли способ добиться того же результата, но используя только код .NET Standard?

IЯ уже пытался преобразовать файл PEM в файл PFX, но у меня нет сертификатов.Попытка получить сертификаты от здесь или здесь не работала (OpenSSL говорит, что сертификаты не принадлежат предоставленному ключу).

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Просто, чтобы расширить решение, это полный код, работающий (это для токенов аутентификации firebase):

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
);
0 голосов
/ 18 июля 2018

Библиотека PemUtils будет делать именно то, что вам нужно, она декодирует данные PEM и DER без использования RSACryptoServiceProvider.Он доступен в виде пакета 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);
}
0 голосов
/ 12 июня 2018

Вы можете преобразовать ваш файл PEM в файл p12 и подписать свой JWT этим p12

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...