Знак x509certificate2 для jwt in. net core 2.1 - PullRequest
0 голосов
/ 24 марта 2020

Я могу создать токен JWT с использованием библиотек JWT, но по разным причинам мне приходится делать его вручную. У меня есть объект X509Certificate2, в котором есть как publi c, так и закрытые ключи - и я могу найти в Интернете кучу различного кода, который использует для подписания приватный ключ - иногда путем приведения его к rsacryptoprovider, иногда вытаскивая его как xml - Я нашел около десяти различных методов.

Все они работают в. net framework. Ничего , которое я пробовал, работает в net core 2.1 (даже те, которые явно говорят, что они предназначены для. net core). Объект закрытого ключа - это RSACng, а не криптопоставщик - любая попытка вызвать методы, которые получают в xml или свойства закрытого типа, говорят, что операция не поддерживается - и у RsaCng нет метода sign.

У меня есть куча байтов в качестве полезной нагрузки и полностью заполненный объект X509certificate2 (считанный из файла .pfx) - и все, что я хочу, это подписать строку. Есть идеи?

1 Ответ

0 голосов
/ 25 марта 2020

оказывается проще, чем я думал - я использовал System.IdentityModel.Tokens.JWT - по какой-то причине Salesforce не нравится JWT, который он производит из функций JWT (возможно, потому что он добавляет кучи других атрибутов), но во всяком случае - я проследил в коде того, что он делает - и вы можете использовать утилиты из него - так что если вы создаете полезную нагрузку JWT самостоятельно - следующий код создает допустимый JWT:

    var unsigned = Base64UrlEncoder.Encode(header) + "." + Base64UrlEncoder.Encode(payload);
    var x509 = new X509Certificate2(pfxFilename, certificatePassword);
    var signingCredentials = new X509SigningCredentials(x509, "RS256");
    var signature  = JwtTokenUtilities.CreateEncodedSignature(unsigned, signingCredentials);
    return unsigned + "." + signature;
...