如何为open id connect生成一个众所周知的配置文件?

Posted

技术标签:

【中文标题】如何为open id connect生成一个众所周知的配置文件?【英文标题】:How to generate a well-known configuration file for open id connect? 【发布时间】:2019-06-03 00:36:44 【问题描述】:

我们有一个 openid connect 的实现,它返回一个编码的 id 令牌,这很好用并且已经工作了一段时间。但是,我们正在尝试在 aws 中使用 cognito 连接到它,经过一些试验和错误后,我们发现我们缺少一个 .well-known/openid-configuration 文件。

此文件旨在包含有关对我们拥有的 openid-connect 服务器的调用的信息,包括 JWK 密钥。

我不懂 JWK 键,这意味着: 1.如何生成它们 2. 生成后如何处理? 3. openid-connect 的现有代码是否需要更改和使用 JWK 密钥? 4. 有什么方法可以验证 openid-connect 配置吗?

前段时间我问过类似的问题,但无济于事,只能重新访问。

谢谢 凯文

我已经尝试过的: 来过这里:https://mkjwk.org/ 并单击“新密钥”,它返回我认为是网络密钥的内容。但不知道我打算用它做什么或其他选项卡的含义。

预期结果: 期待 AWS Cognito 继续运行并允许它连接到我们的 open id connect 实施。目前只是收到关于缺少众所周知的配置文件的错误。

【问题讨论】:

【参考方案1】:

您拥有的 openid 连接服务器会生成 JWS 的 ID 令牌。 这些令牌使用私钥(EC、RSA 或 OKP)进行签名。

well-known/openid-configuration 应该包含一个 JSON 对象,该对象指示用于签署令牌的算法和获取与用于签署令牌的私钥相关联的公钥的 url。

例如,Google Account server configuration 表示可以在https://www.googleapis.com/oauth2/v3/certs(jwks_uri 参数)找到公钥。

在此 url,您将找到以 JWK (JSON Web Keys) 格式的密钥列表 (JWKSet)。这些格式(JWK 和 JWKSet)是 JWT 上下文中使用的键和键集的标准表示形式(请参阅RFC7517)。

    如何生成它们

通常您已经拥有至少一个私钥来签署您的令牌,因此您不必生成新的。

    生成后如何处理它们?

您拥有的私钥应该是 PEM(以 ------ PRIVATE RSA KEY ----- 或类似开头)或 DER 密钥。 您只需将此密钥转换为 JWK。

我创建了a small PHAR application (php),这将有助于转换您的密钥。此应用程序是Web Token Framework 的一部分,但可以作为独立应用程序安装。确保您已安装 PHP 7.1、OpenSSL 和 JSON 扩展。 安装应用后,可以执行以下命令:

jose key:convert:public $(jose key:load:key PATH_TO_YOUR_KEY)

此命令会将私钥转换为 JWK,然后将其从私有转换为公共。 结果可以通过 jwks_uri 端点共享。

    我们现有的 openid-connect 代码是否需要更改和使用 JWK 密钥?

没有。您构建代币的方式并不意味着您必须进行任何更改。

    有什么方法可以验证 openid-connect 配置吗?

据我所知,没有工具可以验证配置对象。您必须参考 OpenID Connect 规范。

【讨论】:

【参考方案2】:

虽然 Florent 回答了公钥的使用,但我想向您指出定义 JWK 内容和具体实现细节的规范。

OpenID Connect discovery 定义发现文档。在那里你可以找到jwks_uri URL 作为元数据的一部分,它指向JSON Web Key Set

3. OpenID Provider Metadata

wks_uri

必填。 OP 的 JSON Web 密钥集 [JWK] 文档的 URL。这 包含 RP 用来验证签名的签名密钥 OP

现在这指向RFC7517 - JSON Web Key (JWK)。您可以在此处找到 JSON 有效负载的每个字段的确切详细信息。请参阅其示例和附录部分以查看示例内容。并且您的实现必须遵循由此定义的规范要求。

对于编码,如果你使用的是 JAVA,我建议你使用 Nimbus JOSE+JWT 库。可以从link 找到示例。

例如,如果您已经加载了X509Certificate,那么以下是生成 JWK 的简约代码。它被嵌入到一个 Servlet [Full source]。

import Common.CertificateLoader;
import Common.Exceptions.FrameworkUncheckedException;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.jwk.JWK;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.cert.X509Certificate;

@WebServlet(urlPatterns = "/openid-configuration/jwks_uri")
public class JWKDocument extends HttpServlet 


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException 
    // NOTE - LOAD YOUR CERTIFICATE HERE
    final X509Certificate certificate = CertificateLoader.getCertificateLoader().getX509Certificate();

    final JWK jwk;

    try 
        jwk = JWK.parse(certificate);
     catch (JOSEException e) 
        throw new FrameworkUncheckedException("Error while loading to JWK", e);
    

    resp.getOutputStream().print(jwk.toJSONString());
  

【讨论】:

以上是关于如何为open id connect生成一个众所周知的配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

WCF - 如何为 NTLM 身份验证配置 netTcpBinding?

如何为 VS Express 版本编写 SourceControl 插件 [关闭]

如何为你的APP起一个好名字?

如何为社群赋能 ,DANGX有话要说

如何为每个 id 生成一个字符串列表? [复制]

如何为你的微信小程序体积瘦身?