2

我们有一个 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 实施。目前只是收到关于缺少众所周知的配置文件的错误。

4

2 回答 2

2

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

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

3. OpenID 提供者元数据

wks_uri

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

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

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

例如,如果您已经X509Certificate加载,那么以下是生成 JWK 的简约代码。它嵌入到 Servlet [完整源代码]中。

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());
  }
}
于 2019-01-10T03:09:49.137 回答
2

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

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

例如,Google 帐户服务器配置表明可以在https://www.googleapis.com/oauth2/v3/certsjwks_uri参数)中找到公钥。

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

  1. 如何生成它们

通常你已经有至少一个私钥来签署你的令牌,所以你不必生成一个新的。

  1. 一旦生成了如何处理它们?

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

我创建了一个小型 PHAR 应用程序 (PHP),它将帮助您转换密钥。此应用程序是Web 令牌框架的一部分,但可以作为独立应用程序安装。确保您已安装 PHP 7.1、OpenSSL 和 JSON 扩展。安装应用程序后,您可以执行以下命令:

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

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

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

不,你构建代币的方式并不意味着你必须改变任何东西。

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

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

于 2019-01-08T20:00:38.780 回答