Запутывание ключей, сертификатов и клиентских секретов

Меня несколько смущает разница между сертификатами и ключами подписи, и у меня есть несколько вопросов....

Я настроил OpenIddict для использования аутентификации на носителе JWT.

1) В чем разница между AddDevelopmentSigningCertificate() и AddEphemeralSigningKey()?

Мое приложение работает, когда я использую один или другой. Имеет ли значение, какой использовать во время разработки?

2) В чем разница между AddSigningCertificate() и AddSigningKey() и когда вы будете использовать один или другой или оба?

Из того, что я понимаю, сертификат подписи используется для подписи токена JWT. Но когда вы используете AddSigningKey - это также используется для подписи токена JWT. Если вы используете оба, означает ли это, что токен JWT подписывается дважды - один поверх другого? Или один переопределяет другой?

В моем сценарии я использую либо AddDevelopmentCertificate() или AddEphemeralSigningKey () для разработки, но для производства я понимаю, что мне нужно настроить подписанный сертификат, который в идеале должен находиться в хранилище компьютеров.

Но мне также требуется уникальный ключ подписи, который используется совместно с моей конечной точкой API (в.NET Framework 4.x), использующей аутентификацию на носителе JWT.

Я хотел бы знать, что эти функции делают с токеном JWT и как они работают друг с другом.

Последний вопрос: при настройке таблиц OpenIddict и заполнении базы данных с помощью клиентского приложения заполняется секрет клиента. В проекте Samples это всегда GUID.

3) Используется ли секрет клиента при использовании аутентификации JWT Bearer? И как это соотносится с сертификатом подписи и ключом подписи?

Я действительно хочу понять, как все это работает, но я немного теряюсь в ключе подписи / сертификате!

Спасибо

1 ответ

Решение

В чем разница между AddDevelopmentSigningCertificate() и AddEphemeralSigningKey()?

AddDevelopmentSigningCertificate попытается сгенерировать самоподписанный сертификат X.509 (содержащий ключ RSA) и сохранить его в хранилище сертификатов пользователя, чтобы его можно было использовать повторно даже после перезапуска приложения.

AddEphemeralSigningKey просто сгенерирует ключ подписи RSA, но не сохранит его нигде. Он будет потерян после перезапуска приложения.

Оба метода служат одной и той же цели: создание ключа подписи, используемого для защиты ваших токенов.


В чем разница между AddSigningCertificate() и AddSigningKey() и когда вы будете использовать один или другой или оба?

Единственная разница в том, что AddSigningCertificate() принимает X509Certificate2 параметр в то время как AddSigningKey() занимает SecurityKey пример. В конечном счете, AddSigningCertificate() заботится о разрешении ключа RSA или ECDSA из сертификата и звонках AddSigningKey(),


Но когда вы используете AddSigningKey - это также используется для подписи токена JWT. Если вы используете оба, означает ли это, что токен JWT подписывается дважды - один поверх другого? Или один переопределяет другой?

Когда вы регистрируете несколько асимметричных ключей подписи, OpenIddict использует только первый ключ для подписи токенов. Остальные доступны только для конечной точки обнаружения, поэтому вы можете позже сделать их "первичными ключами", не нарушая своих клиентов.


Я понимаю, что мне нужно настроить подписанный сертификат, который в идеале должен находиться в магазине машин.

Да. Если у вас нет доступа к машине или хранилищу пользователей (рекомендуемый вариант), вы можете также сохранить его во встроенном файле сборки.


Но мне также требуется уникальный ключ подписи, который используется совместно с моей конечной точкой API (в.NET Framework 4.x), использующей аутентификацию на носителе JWT.

Это то что AddSigningCertificate() а также AddSigningKey() для. Рекомендуется использовать асимметричный ключ подписи (т. Е. Сертификат или RsaSecurityKey/EcdsaSecurityKey пример).

Если вы предпочитаете использовать симметричный ключ для HMAC ваших токенов JWT, используйте AddSigningKey(new SymmetricSecurityKey([bytes])),

Если ваш сервер авторизации выдает идентификационные токены, вам потребуется хотя бы один асимметричный ключ (сертификат или необработанный ключ RSA/ECDSA), но симметричный ключ будет предпочтительным для токенов доступа JWT.


Используется ли секрет клиента при использовании аутентификации JWT Bearer? И как это соотносится с сертификатом подписи и ключом подписи?

Секрет клиента используется только при взаимодействии с конечными точками токена или отзыва, а не когда вы используете свои собственные конечные точки API. Для получения дополнительной информации читайте https://tools.ietf.org/html/rfc6749

Другие вопросы по тегам