Public 密钥加密是否可以接受以保护此 OpenId Connect 工作流的最后一段
Is Public Key encryption acceptable for protecting last leg of this OpenId Connect workflow
- 桌面客户端
- 受保护的资源服务器
- 授权服务器(Google)
- 用户代理(浏览器)
-
Desktop Client
生成 Pub/Priv 密钥对,并将带有 webbrowser.open_new()
的用户代理定向到 Protected Resource Server
OAuth 启动页面,该页面将 Public Key
存储在Auth_URI 重定向的 State
参数字段。
- User-Agent 使用
Authorization Server
成功验证,并在 state
参数字段中使用 Auth_Code 和 Public Key
重定向回 Protected Resource Sever
。
Protected Resource Server
使用机密客户端密钥交换 Auth_Code 并验证 id_token.
- 如果 id_token 有效(发生服务器端处理),它会在环回时重定向到侦听
Desktop Client
,查询参数包含只能由启动应用程序访问的加密值。
这是一个与 PKCE 非常相似的过程,但我让客户端机密在服务器上保持机密,而不是将其嵌入 Desktop Client
。
我担心的是恶意的第 3 方应用程序能够拦截初始 OAuth_URI 重定向并修改其值。一旦 device/browser 受到威胁,这是一个可以缓解的威胁吗? PKCE 也会遇到同样的问题,我没有看到任何解释将我的担忧作为一个特定问题提及,所以我假设它很好。
重定向篡改
防止恶意重定向篡改的标准保护在这些新兴标准中:
在高安全性场景中,您可能需要遵循 profiles
强制执行其中的一些 - 一些配置文件可能包含金融级建议,例如 FAPI 2.0 Client Requirements,其中包括 PAR。
桌面应用程序
桌面应用程序的一个已知问题是恶意应用程序可以发送相同的客户端 ID 并使用相同的重定向 URI 来触发完整的流程。我认为您无法完全防止这种情况发生,任何努力都可能只是混淆视听。
您可能担心这个问题,目前无法解决,因为您的应用程序 运行 的任何代码也可能 运行 被恶意应用程序使用,包括使用 PAR / DPop 或其他高级选项。
客户证明
您所追求的行为是 client attestation,其中恶意方无法在不以加密方式证明其身份的情况下尝试进行身份验证。例如,iOS 应用可以发送其 App Store 签名密钥的所有权证明。
移动和 Web 应用程序可以通过拥有基于 HTTPS 的重定向 URI 的域来实现合理数量的客户端证明,但这些不能用于桌面应用程序。很快就能看到改进的桌面应用程序客户端证明选项。
要做什么?
一般来说,我会说让您的代码基于专家审查过的标准。这应该意味着您在某些地方使用了库,但您的代码仍然很简单。
此外,您的桌面应用程序将与其他桌面应用程序一样安全,而无需尝试解决此问题。此外,这些天用户被社会化为没有 运行 任意 EXE,只有 运行 正确签名的应用程序,其代码签名证书识别它们并链接到批准该应用程序的机构(我们希望)。
- 桌面客户端
- 受保护的资源服务器
- 授权服务器(Google)
- 用户代理(浏览器)
-
Desktop Client
生成 Pub/Priv 密钥对,并将带有webbrowser.open_new()
的用户代理定向到Protected Resource Server
OAuth 启动页面,该页面将Public Key
存储在Auth_URI 重定向的State
参数字段。 - User-Agent 使用
Authorization Server
成功验证,并在state
参数字段中使用 Auth_Code 和Public Key
重定向回Protected Resource Sever
。 Protected Resource Server
使用机密客户端密钥交换 Auth_Code 并验证 id_token.- 如果 id_token 有效(发生服务器端处理),它会在环回时重定向到侦听
Desktop Client
,查询参数包含只能由启动应用程序访问的加密值。
这是一个与 PKCE 非常相似的过程,但我让客户端机密在服务器上保持机密,而不是将其嵌入 Desktop Client
。
我担心的是恶意的第 3 方应用程序能够拦截初始 OAuth_URI 重定向并修改其值。一旦 device/browser 受到威胁,这是一个可以缓解的威胁吗? PKCE 也会遇到同样的问题,我没有看到任何解释将我的担忧作为一个特定问题提及,所以我假设它很好。
重定向篡改
防止恶意重定向篡改的标准保护在这些新兴标准中:
在高安全性场景中,您可能需要遵循 profiles
强制执行其中的一些 - 一些配置文件可能包含金融级建议,例如 FAPI 2.0 Client Requirements,其中包括 PAR。
桌面应用程序
桌面应用程序的一个已知问题是恶意应用程序可以发送相同的客户端 ID 并使用相同的重定向 URI 来触发完整的流程。我认为您无法完全防止这种情况发生,任何努力都可能只是混淆视听。
您可能担心这个问题,目前无法解决,因为您的应用程序 运行 的任何代码也可能 运行 被恶意应用程序使用,包括使用 PAR / DPop 或其他高级选项。
客户证明
您所追求的行为是 client attestation,其中恶意方无法在不以加密方式证明其身份的情况下尝试进行身份验证。例如,iOS 应用可以发送其 App Store 签名密钥的所有权证明。
移动和 Web 应用程序可以通过拥有基于 HTTPS 的重定向 URI 的域来实现合理数量的客户端证明,但这些不能用于桌面应用程序。很快就能看到改进的桌面应用程序客户端证明选项。
要做什么?
一般来说,我会说让您的代码基于专家审查过的标准。这应该意味着您在某些地方使用了库,但您的代码仍然很简单。
此外,您的桌面应用程序将与其他桌面应用程序一样安全,而无需尝试解决此问题。此外,这些天用户被社会化为没有 运行 任意 EXE,只有 运行 正确签名的应用程序,其代码签名证书识别它们并链接到批准该应用程序的机构(我们希望)。