当前位置: 首页 > 知识库问答 >
问题:

Azure公钥解释?

束飞捷
2023-03-14

我正在更新我的应用程序,以便将Azure Active Directory用作OAuth 2.0身份验证服务器。目前,我正在成功地使用授权代码授予类型,并收到access_token和id_token值。

现在,我正在尝试验证返回的id_令牌。我正在遵循doco中概述的步骤,并且我能够找到用于签署JWT的公钥。例如,这是Azure RESTendpoint返回的记录

据我所知,这些是可用的公钥。我可以将其筛选为一个(使用返回的JWT头中的kid值)。但我很难理解的是每个领域都代表着什么。

我是否使用n/e字段为SHA256公钥创建模数和指数值?我是否打算使用x5c值来代替?很抱歉,如果这是一个明显的问题,但是有没有关于如何为它创建公钥的文档,给定上述值?我是用Java来做这件事的,所以任何与之相关的东西都将不胜感激。

共有2个答案

孙海
2023-03-14

这里有一个类似的问题,我发布并得到了帮助,这可能会有所帮助。我认为您需要使用x5c,它是完整的证书链,并从中获取公钥以验证JWT的签名。模和指数(n和e)将只生成证书链中第一个证书的公钥,但这不足以验证签名。

以下是我用来从endpoint提取公钥的一些代码片段。AzurePublicKey类只是json的POJO。

private PublicKey convertKey(AzurePublicKey azKey) {
    PublicKey publicKey = null;

    BigInteger modulus = new BigInteger(1, Base64.getUrlDecoder().decode(azKey.getN()));
    BigInteger exponent = new BigInteger(1, Base64.getUrlDecoder().decode(azKey.getE()));

    try {
        publicKey = KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(modulus, exponent));

        // load cert
        CertificateFactory factory;
        X509Certificate cert = null; 
        try {
            factory = CertificateFactory.getInstance("X.509");
            cert = (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(azKey.getX5c().iterator().next())));
        } catch (CertificateException e) {
            e.printStackTrace();
        }

        // grab public key
        publicKey = (RSAPublicKey)cert.getPublicKey();

        System.out.println("[");
        System.out.println("kid : " + azKey.getKeyIdentifier());
        System.out.println("e : " + azKey.getE());
        System.out.println("n : " + azKey.getN());

        System.out.println("Maybe this : " + DatatypeConverter.printBase64Binary(publicKey.getEncoded()) );
        System.out.println("]");

    } catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return publicKey;
}

以及使用该公钥使用JJWT库验证签名的代码。

Jws<Claims> claims = Jwts.parser()
                                .setSigningKeyResolver(signingKeyResolver)
                                .parseClaimsJws(token.replace(TOKEN_PREFIX, ""));


        String issuer   = claims.getBody().getIssuer();
        if(issuer == null || !VALID_ISSUERS.contains(issuer))
            throw new IncorrectClaimException(claims.getHeader(), claims.getBody(), "Invalid Issuer in Token.", new Throwable("Invalid Issuer in Token."));

SigningKeyResolverImpl仅根据令牌头的kid提供正确的公钥。如果解析没有引发异常,您可以根据您期望的值验证令牌声明,因为我已经根据我期望的有效\u发行者列表验证了发行者。

已经有一段时间了,所以我很模糊,但我希望这能有所帮助。

花俊雄
2023-03-14

为了验证id_token的签名,如果您使用C#开发,我们可以使用JwtSecurityTokenHandler类。对于代码示例,您可以参考JsonWebTokenValidator.cs来使用这个类。为了方便起见,我也在这里复制这个类:

 public class JsonWebTokenValidator
{
    public JwtSecurityToken Validate(string token)
    {
        string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";

        ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);

        OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result;

        TokenValidationParameters validationParameters = new TokenValidationParameters
        {
            ValidateAudience = false,
            ValidateIssuer = false,
            IssuerSigningTokens = config.SigningTokens,
            ValidateLifetime = false
        };

        JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler();

        SecurityToken jwt;

        var result = tokendHandler.ValidateToken(token, validationParameters, out jwt);

        return jwt as JwtSecurityToken;
    }
}
 类似资料:
  • 我的理解是,公钥可以用于加密,私钥可以用于解密,公钥不能解密由同一公钥加密的文件。我有没有误解,或者我做错了什么? 1) 生成密钥 openssl genrsa-out./private.pem2048 2) 生成公钥 openssl rsa-in/私有的pem-发布 3)加密一个小文本文件 openssl加密/在里面txt-输出/出来附件e-aes256-k/平民的pem公司 4) 使用公钥解密

  • 我们有一个签名服务,它接受sha256哈希作为输入,并使用pkcs11和C#中的bouncy Castle库对哈希进行签名,将签名摘要编码为Bae64并将其发送给请求者。因此,本质上我们正在生成哈希的哈希并对哈希进行签名。 为了验证这一点,另一端的请求者解码Base64接收到的摘要并验证它。我在PowerShell中使用了一个. NET库,并实现了一个验证过程。请参阅下面。 现在,为了避免散列,我

  • 我们需要使用Azure key vault创建RSA密钥对,并将RSA公钥复制到外部系统。其要求是外部系统使用公钥加密数据,内部系统与azure key vault对话并对数据进行解密。我还没有访问Azure key vault的权限,所以需要查看文档。我有两个基本问题: > 有没有一种方法可以使用Azure portal以文本格式导出RSA公钥,而不使用API(https://docs.micr

  • 本文向大家介绍Android 获取签名公钥和公钥私钥加解密的方法(推荐),包括了Android 获取签名公钥和公钥私钥加解密的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Android 获取签名公钥和公钥私钥加解密的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我必须在azure密钥库中配置RSA、HSM公钥和私钥,并以加密形式保存数据。

  • 问题内容: 我有以下格式的公钥 我需要将其转换为以下格式 基本上,问题是我正在使用用Java编写的第三方库。 第三方库使用Java类“ RSAPublicKeySpec”从字符串生成RSAPublicKey类型的实例。 我提供给该第三方库的字符串取自以下格式的文件: 仔细研究一下代码之后,我可以看到,如果我使用java类“ X509EncodedKeySpec”来加载此公共密钥,则代码的签名验证部