Kev*_*vin 6 php jwt openid-connect jwk
我们有一个 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 实施。目前仅收到有关缺少众所周知的配置文件的错误。
虽然 Florent 回答了公钥的使用,但我想向您指出定义 JWK 内容和具体实现细节的规范。
OpenID Connect 发现定义发现文档。在那里您可以找到jwks_uri作为元数据一部分的 URL,它指向JSON Web Key Set
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());
}
}
Run Code Online (Sandbox Code Playgroud)
您拥有的 openid connect 服务器生成 JWS 形式的 ID 令牌。\n这些令牌使用私钥(EC、RSA 或 OKP)进行签名。
\nwell-known/openid-configuration 应包含一个 JSON 对象,该对象指示用于签署令牌的算法以及用于获取与用于签署令牌的私钥关联的公钥的 url。
\n例如,Google 帐户服务器配置指示可以在https://www.googleapis.com/oauth2/v3/certs (jwks_uri。
在此 url 中,您将找到采用 JWK(JSON Web 密钥)格式的密钥列表 (JWKSet)。这些格式(JWK 和 JWKSet)是 JWT 上下文中使用的键和键集的标准表示形式(请参阅RFC7517)。
\n\n\n\n
\n- 如何生成它们
\n
通常,您至少已经拥有一个私钥来签署您的令牌,因此您不必\xe2\x80\x99 生成一个新的私钥。
\n\n\n\n
\n- 一旦生成如何处理它们?
\n
您拥有的私钥应该是 PEM(以------ PRIVATE RSA KEY -----或类似开头)或 DER 密钥。\n您只需将此密钥转换为 JWK 即可。
我创建了一个小型 PHAR 应用程序 (PHP),它将帮助您转换密钥。此应用程序是Web 令牌框架的一部分,但可以作为独立应用程序安装。确保安装了 PHP 7.1、OpenSSL 和 JSON 扩展。\n安装应用后,您可以执行以下命令:
\njose key:convert:public $(jose key:load:key PATH_TO_YOUR_KEY)\nRun Code Online (Sandbox Code Playgroud)\n此命令会将私钥转换为 JWK,然后将其从私有转换为公共。\n结果可以通过 jwks_uri 端点共享。
\n\n\n\n
\n- 我们现有的 openid-connect 代码是否需要更改并使用 JWK 密钥?
\n
不。您构建代币的方式并不意味着您必须改变任何东西。
\n\n\n\n
\n- 有没有办法验证 openid-connect 配置?
\n
据我所知,没有工具可以验证配置对象。您必须参考 OpenID Connect 规范。
\n| 归档时间: |
|
| 查看次数: |
4188 次 |
| 最近记录: |