繁体   English   中英

使用存储在 Amazon s3 上的公钥获取错误 EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY

[英]Getting error EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY with a public key stored on Amazon s3

我正在开发一个外部 OAuth 提供商,以便能够使用我们公司的登录机制让员工和客户连接到雪花。

雪花设置:

首先,为了测试,我创建了一个数据库:

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';

并在雪花数据库中创建安全集成 object,如下所示:

  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 上验证)+ 使用公钥验证的签名:

(Base 64 url 编码)

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...
}

执行时:

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

使用系统创建的一些令牌系统返回错误:

令牌验证完成。{“验证结果”:“失败”,“失败原因”:“EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY”}

第二次尝试

(在@Srinath Menon 的反馈之后)

从公钥,我创建了一个 json web 密钥(JWK)。 我使用 java 代码创建了它,当我验证时,我注意到也可以使用在线工具进行验证。 https://8gwifi.org/jwkconvertfunctions.jsp

我将结果作为文件上传到 AWS S3 上,并确保它是公开可用的,并且内容类型是 application/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”}

终于成功了,但稍微改变了我的解决方案:

使用命令创建密钥对(在 MacOS 下):

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

我提取了公钥内容(删除了 HEADER、FOOTER 和新行)以初始化属性external_oauth_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';

我还注意到我忘记在我的令牌中使用之前定义的用户名(“fred_ica_user”)添加一些“upn”声明。

经过这些不同的更改后,系统可以正常工作。

希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM