Получение ошибки EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY с открытым ключом, хранящимся в Amazon s3

#amazon-s3 #oauth-2.0 #oauth #snowflake-cloud-data-platform

Вопрос:

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

Настройка снежинки:

Во — первых, я создал базу данных для тестирования :

 use role accountadmin;
create database fred_ica_db;
create warehouse fred_ica_warehouse;
create role fred_ica_role;
create user fred_ica_user password = '******' login_name = 'upn';

grant usage on database fred_ica_db to role fred_ica_role;
grant usage on warehouse fred_ica_warehouse to role fred_ica_role;
grant role fred_ica_role to user fred_ica_user;
alter user fred_ica_user set DEFAULT_WAREHOUSE='FRED_ICA_WAREHOUSE', DEFAULT_ROLE='FRED_ICA_ROLE' , DEFAULT_NAMESPACE='FRED_ICA_DB.PUBLIC';

 

и создал объект интеграции безопасности в базе данных snowflake следующим образом :

   create or replace security integration fred_oauth_integration
    type = external_oauth
    enabled = true
    external_oauth_type = custom
    external_oauth_issuer = 'http://$(some_endpoint)/snowflakeAuth/accessToken'
    external_oauth_jws_keys_url = 'https://$(aws_account).s3.us-west-2.amazonaws.com/$(public_key_filename)'
    external_oauth_audience_list = ('https://xxxx.us-east-1.snowflakecomputing.com')
    external_oauth_scope_mapping_attribute = 'scp'
    external_oauth_token_user_mapping_claim='upn'
    external_oauth_snowflake_user_mapping_attribute='login_name';
 

Первая попытка :

Я создал пару закрытого/открытого ключа для обработки подписи токена и загрузил открытый ключ в AWS S3, который также будет нашей производственной целью для этого внешнего поставщика OAuth. В настоящее время файл доступен для широкой публики (проверено на общедоступном устройстве). Открытый ключ имеет форму :

 -----BEGIN RSA PUBLIC KEY-----
MIIBCgKC...
...4oQIDAQAB
-----END RSA PUBLIC KEY-----
 

Мой сервер OAuth генерирует некоторый допустимый токен JWT (проверен на jwt.io) подпись, подтвержденная открытым ключом :

(Базовый URL-адрес 64 в кодировке)

 eyJ0eXAi...wPgXvOtg
 

и расшифрован :

 {
  "typ": "JWT",
  "alg": "RS256"
}
{
  "aud": "https://xxxx.us-east-1.snowflakecomputing.com/",
  "scp": [
    "session:role:fred_ica_role"
  ],
  "iss": "http://$(some_endpoint)/snowflakeAuth/accessToken",
  "exp": 1632483169,
  "iat": 1632475969
}
{
  ...signature...
}
 

when executing :

 select SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN('eyJ0eXAi...wPgXvOtg');
 

с помощью некоторого токена, созданного системой
Система возвращает ошибку :

Проверка токенов завершена.{«Результат проверки»:»Сбой»,»Причина сбоя»:»EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY»}

Вторая попытка

(после того, как @Srinath Menon оставил свой отзыв)

Из открытого ключа я создал веб-ключ json(JWK). Я создал его с помощью кода java, и когда я проверил, я заметил, что для этого также можно использовать онлайн-инструмент. https://8gwifi.org/jwkconvertfunctions.jsp

Я загрузил результат в виде файла на AWS S3 и убедился, что он общедоступен и что тип содержимого-приложение/json :

JWKS :

 {"keys":[{"kty":"RSA","e":"AQAB","kid":"5979064a-e202-4321-90ad-8a51329aad61","n":"2636yeJSQqyO5AegaIu6vEHg6w-MzGy1nPy2qj0zJfbDw6O0ATGkG_ibdfWqMHxU-JEBV1wiThv8_Mk67cst4W5U-fg-Miy8SDxYZtIkWFMAeVbamjpi_8BChCIJRVXvS6ZQofGgmFHlJAnWszL0hID8IaHigpBLTNEVHKuPeVGTYg3RcoWTjjB3WtaIj8XqKpQY47EUOiHOa3DZISXteYlfZu9yhQdB-7s0kQhdzk-RiQIHsLfnn-ksVzntmmwHVE5KVllMJt-23bH8c1TbtrMzWHflY85K3iSjhB3EHyeqhZnKuhAR5WVxPxkGIdr9qku1Q6L489R1wRkE2Rk4oQ"}]}
 

JWK :

 {"kty":"RSA","e":"AQAB","kid":"5979064a-e202-4321-90ad-8a51329aad61","n":"2636yeJSQqyO5AegaIu6vEHg6w-MzGy1nPy2qj0zJfbDw6O0ATGkG_ibdfWqMHxU-JEBV1wiThv8_Mk67cst4W5U-fg-Miy8SDxYZtIkWFMAeVbamjpi_8BChCIJRVXvS6ZQofGgmFHlJAnWszL0hID8IaHigpBLTNEVHKuPeVGTYg3RcoWTjjB3WtaIj8XqKpQY47EUOiHOa3DZISXteYlfZu9yhQdB-7s0kQhdzk-RiQIHsLfnn-ksVzntmmwHVE5KVllMJt-23bH8c1TbtrMzWHflY85K3iSjhB3EHyeqhZnKuhAR5WVxPxkGIdr9qku1Q6L489R1wRkE2Rk4oQ"}
 

Оба этих подхода привели к одной и той же ошибке :

Проверка токенов завершена.{«Результат проверки»:»Сбой»,»Причина сбоя»:»EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY»}

Комментарии:

1. Делает ли этот URL-адрес «https://$(aws_account).s3.us-west-2.amazonaws.com/$(public_key_filename)» возвращает содержимое в текстовом формате?

2. Да, действительно : завиток https://$(aws_account).s3.us-west-2.amazonaws.com/$(имя файла public_key_filename). ——НАЧАТЬ ОТКРЫТЫЙ КЛЮЧ RSA — — — — — MIIBCgKC… …4oQIDAQAB — — — — — ЗАВЕРШИТЬ ОТКРЫТЫЙ КЛЮЧ RSA——

3. По всей вероятности, это и есть причина этой проблемы, ожидание заключается в том, что он должен быть в формате content-type/ json. Передается ли какая-либо информация заголовка, которая вызывает вывод в виде открытого текста?

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

5. Я все еще получаю ту же ошибку после изменений. В jws_keys_url конечная точка возвращает что-то вроде : {«keys»:[{«kty»:»RSA»,»kid»:»3064f813-2c8f-4d1d-8eb7-6cb32b3d82ee»,»n»:»2636yeJS…kE2Rk4oQ»,»e»:»AQAB»}]} Проверено, что это ключ от jwk могут быть преобразованы в Пэм, и ПЭМ могут быть преобразованы в от jwk ключ на сайте 8gwifi.org/jwkconvertfunctions.jsp я также сделал тест, снимая «ключи» JSON в контейнер и оставить открытым ключом конечной точки возврата {«kty»:»ЮАР»,»малыш»:»3064f813-2c8f-4d1d-8eb7-6cb32b3d82ee»,»Н»:»2636yeJS…kE2Rk4oQ»,»е»:»АКАБ»}, но это дало тот же результат.

Ответ №1:

Наконец-то получилось, но я немного изменил свое решение :

Создал пару ключей с помощью команд (под macOS) :

 openssl genrsa -out snowflakeExternalOAuth.pem 2048
openssl rsa -in snowflakeExternalOAuth.pem -pubout > snowflakeExternalOAuth.pub
 

Я извлек содержимое открытого ключа (удалены ВЕРХНИЙ, НИЖНИЙ колонтитулы и новые строки) для инициализации свойства external_auth_rsa_public_key

Я определил интеграцию безопасности следующим образом :

   create or replace security integration fred_oauth_integration
    type = external_oauth
    enabled = true
    external_oauth_type = custom
    external_oauth_issuer = 'http://$(some_endpoint)/snowflakeAuth/accessToken'
    external_oauth_rsa_public_key = 'MIIBIjAN...hQIDAQAB'
    external_oauth_audience_list = ('https://xxxx.us-east-1.snowflakecomputing.com')
    external_oauth_scope_mapping_attribute = 'scp'
    external_oauth_token_user_mapping_claim='upn'
    external_oauth_snowflake_user_mapping_attribute='login_name';
 

Я также заметил, что забыл добавить в свой токен утверждение » upn » с ранее определенным именем пользователя («fred_ica_user»).

После этих различных изменений система работает.

Надеюсь, это будет полезно.

Комментарии:

1. Это хорошая информация.