Как проверить JWT из WSO2 API Manager

Каков рекомендуемый способ проверки того, что JWT был выпущен конкретным экземпляром Менеджера API в случае, когда внутренняя веб-служба находится на отдельном сервере и должна быть уверена, что данный запрос прошел через механизмы аутентификации и авторизации шлюза APIM?

Я знаю, что поля заголовка в JWT включают поле x5t, которое является закодированной ссылкой на сертификат в хранилище ключей клиента, как подробно описано здесь:

https://asankastechtalks.wordpress.com/2013/12/05/obtain-certificate-used-to-sign-a-jwt/

Поскольку внутренняя веб-служба находится на отдельном сервере, нужно ли нам каким-то образом распространять на нее открытый ключ? Кроме того, как мы можем обновить сертификат, который используется для подписи JWT, поскольку сейчас он использует значение по умолчанию?


person user2789361    schedule 14.03.2014    source источник
comment
Привет, у меня такая же проблема, у вас все получилось? см. мой вопрос здесь: stackoverflow.com/questions/43638606/   -  person JRobinss    schedule 02.05.2017


Ответы (3)


Данные в x5t - это не весь сертификат, это только хэш, который поможет вам определить, является ли ваш сертификат тем же самым. Это означает, что вам действительно нужно загрузить общедоступный сертификат в принимающую службу.

С https публичный сертификат можно получить в рукопожатии, затем клиент может проверить, подписан ли этот сертификат доверенным центром сертификации. Однако при такой проверке такого механизма нет, в результате вы не можете просто доверять ЦС, вы должны доверять каждому общедоступному сертификату.

Существует еще один необязательный заголовок «x5u», который включает URL-адрес публичного сертификата, но APIM не устанавливает это значение.

person Louis Zelus    schedule 18.06.2015

Вот как вы можете получить сертификат из локального хранилища, используя хэш x5t в токене WSO2 в качестве поиска:

// Use JwtSecurityTokenHandler to validate the JWT token
var tokenHandler = new JwtSecurityTokenHandler();

// Read the JWT
var parsedJwt = tokenHandler.ReadToken(token);

// Get X509 public certificate
var signerAlgorithm = ((JwtSecurityToken)parsedJwt).SignatureAlgorithm;
var signerHash = ((JwtSecurityToken)parsedJwt).Header["x5t"];
var thumbprint = Encoding.UTF8.GetString(Convert.FromBase64String(signerHash.ToString()));

X509Store store = new X509Store(StoreName.TrustedPublisher);
store.Open(OpenFlags.ReadOnly);
var cert = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false)[0];
person tgitchel    schedule 30.10.2015
comment
см. мой комментарий выше, я борюсь с той же проблемой. Мне не хватает контекста для запуска этого кода ... Я предполагаю, что это Javascript, чтобы выполнить с node.js? (чтение JWT выполняется на сервере, а не на веб-клиенте) Есть ли в сети какая-либо утилита, в которую я мог бы поместить JWT и файл сертификата, и она запустила бы это? (немного похоже на jwt.io для декодирования JWT) - person JRobinss; 02.05.2017

Я думаю, вы можете проверить JWT, импортировав сертификат в свой диспетчер API под поставщиком удостоверений.

Представьте, что вы используете Wso2 IS для генерации токена JWT, затем вам нужно экспортировать сертификат IS и импортировать его в wso2 api manager .. И вы должны убедиться, что ключ IDTokenIssuerID совпадает в IS и API Manager.

я думаю, этот пост может помочь вам понять: https://medium.com/wso2-learning/how-to-protect-your-apis-with-self-contain-access-token-jwt-using-wso2-api-manager-and-wso2-75673d8a4686

person user2208003    schedule 17.01.2019