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

使用x5c和x5t参数创建JWK密钥

邹坚壁
2023-03-14

我需要生成一个具有以下参数的JWK:

>

  • “kty”:键类型

    “孩子”:密钥标识

    “使用”:“sig”公钥使用

    “n”:模数

    “e”:“AQAB”公众指数

    "x5c": X.509证书链

    “x5t”:X.509证书SHA-1指纹

    注:

    >

    应包含使用“x5t”(X.509 SHA-1指纹)和“x5c”(X.509证书链)参数的X.509证书

    前5个参数(kty,孩子,使用,n,e)相当简单,不是问题。然而,对于“x5c”和“x5t”组件,我不确定如何生成这些。似乎我可以创建一个x509证书使用的工具,如在https://www.samltool.com/self_signed_certs.php找到的,我想生成的x509证书将是x5c参数。这是正确的,我将如何生成一个x5t(证书指纹)从这?

    感谢所有的帮助。

  • 共有1个答案

    欧阳君浩
    2023-03-14

    由于您既没有标记工具也没有标记语言,因此我假设这是对这两个参数的一般性解释。

    在x5c中,证书或证书链存储在x5t中,以及相关的指纹。证书或证书链用于证明公钥的所有权,指纹是用于标识/比较证书的证书哈希。

    RFC 7517、JSON Web密钥(JWK)、第4.7章x5c和第4.8章x5t中描述了这两个参数的确切定义:

    • x5c:

    “x5c”(X.509证书链)参数包含一个或多个PKIX证书的链[RFC5280]。证书链表示为证书值字符串的JSON数组。数组中的每个字符串都是[ITU.X690.1994]PKIX证书值下的base64编码(RFC4648的第4节——非base64url编码)。包含密钥值的PKIX证书必须是第一个证书。随后可能会有其他证书,每个后续证书都是用于认证前一个证书的证书。第一个证书中的密钥必须与JWK的其他成员表示的公钥匹配。此成员的使用是可选的。。。

    • x5t:

    “x5t”(X.509证书SHA-1指纹)参数是X.509证书[RFC5280]的DER编码的base64url编码SHA-1指纹(也称为摘要)。请注意,证书指纹有时也称为证书指纹。证书中的密钥必须与JWK的其他成员表示的公钥匹配。此成员的使用是可选的。

    创建证书:

    还可以生成自签名证书(您使用的在线工具除外),例如使用OpenSSL。下面是OpenSSL语句

    openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.crt -days 365
    

    生成PKCS#8格式(key.PEM)的私有(未加密)PEM编码4096位密钥:

    -----BEGIN PRIVATE KEY-----
    MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDkWIfV9uL3XMay
    ...
    OPAsywknGU1A/xTa3fFKO9KV6t/T9z3G
    -----END PRIVATE KEY-----
    

    和PEM编码证书(cert.crt):

    -----BEGIN CERTIFICATE-----
    MIIF4zCCA8ugAwIBAgIJAKSZ5oC4tblkMA0GCSqGSIb3DQEBCwUAMIGHMQswCQYD
    ...
    6aBMYeKy0dqjtZIlO8rm2Rialc7Qt+0=
    -----END CERTIFICATE-----
    

    有关更多选项和详细信息,请参阅openssl req和如何使用openssl?生成自签名SSL证书的文章?。

    请注意,自签名证书由所有者签名。自签名证书用于内部页面或测试环境中。相比之下,CA签署的证书由第三方、公众信任的证书颁发机构(CA)签署,如DigiCert或Thawte等。例如,用于面向公众的网站,这里也有。使用CSR请求已签名的证书。

    证书、证书链、证书颁发机构等是公钥架构体系的一部分。

    x5c的使用示例:

    在RFC 7517的附录B中,给出了使用x5c参数的示例。DER编码的证书是Base64编码的,包含在JSON数组中:

    {
        "kty":"RSA",
        "use":"sig",
        "kid":"1b94c",
        "n":"vrjOfz9Ccdgx5nQudyhdoR17V-IubWMeOZCwX_jj0hgAsz2J_pqYW08
        PLbK_PdiVGKPrqzmDIsLI7sA25VEnHU1uCLNwBuUiCO11_-7dYbsr4iJmG0Q
        u2j8DsVyT1azpJC_NG84Ty5KKthuCaPod7iI7w0LK9orSMhBEwwZDCxTWq4a
        YWAchc8t-emd9qOvWtVMDC2BXksRngh6X5bUYLy6AyHKvj-nUy1wgzjYQDwH
        MTplCoLtU-o-8SNnZ1tmRoGE9uJkBLdh5gFENabWnU5m1ZqZPdwS-qo-meMv
        VfJb6jJVWRpl2SUtCnYG2C32qvbWbjZ_jBPD5eunqsIo1vQ",
        "e":"AQAB",
        "x5c":
        ["MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJB
        gNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYD
        VQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1
        wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBg
        NVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDV
        QQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1w
        YmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnH
        YMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66
        s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6
        SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpn
        fajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPq
        PvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVk
        aZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BA
        QUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL
        +9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1
        zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL
        2Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo
        4tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTq
        gawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA=="]
    } 
    

    请注意,值中的换行符仅用于显示目的。DER编码是PEM编码的结果,通过去除页眉、页脚和换行符,Base64解码其余部分,即Base64解码的DER编码证书是没有换行符的PEM编码证书的主体。

    对于证书链,证书用逗号分隔,参见例如。RFC 7515,附录B,x5c。

    指纹/指纹:

    证书的指纹是DER编码证书的SHA-1散列,可以使用OpenSSL生成,如下所示。同样在这里:

    openssl x509 -in cert.crt -noout -fingerprint
    

    这里cert.crt是PEM编码的证书。有关更多详细信息,请参阅openssl x509。

    示例:如果使用RFC 7517附录B中的证书,OpenSSL语句将返回以下输出:

    SHA1 Fingerprint=E2:93:5E:9C:40:4B:BF:42:69:2C:87:6E:81:6C:50:90:EB:19:70:AD
    

    即十六进制编码的拇指指纹是:E2935E9C404BBF42692C876E816C5090EB1970AD或Base64url编码的:4pNenEBLv0JpLIdugWxQkOsZcK0。后者是x5t的值:

    "x5t":"4pNenEBLv0JpLIdugWxQkOsZcK0"
    
     类似资料:
    • 我使用的是nimbus jose jwt 5.14,我用以下代码生成了RSA密钥对 现在我需要解释一些关于公钥的“元数据”: e 孩子 kty n 使用 x5c 如何获得x5c?是否可以使用此库生成X509证书?此字段为空:

    • 在画布中,为了让LTI应用程序进行身份验证,站点管理员必须输入远程站点的JWK。JWK的格式定义明确: 首先,我们可以使用像openssl这样的工具,创建一个密钥,并从中生成JWK吗?目前,我们正在使用jose4j编写代码来实现这一点,但还不清楚这是否必要。 其次,Canvas需要一些可选字段,如kid、alg和use。我们猜测use应该是“sig”,我们编造了kid:“1”,猜测alg:“RS2

    • 假设我有一个python结构,表示RSA密钥对,如下所示: 如何编写python代码来生成可用于验证使用此RSA私钥签名的JWT的JWK?使用的算法是RSA256。 这个网站mkjwk完成了我想做的事情。但我正试图用python代码来做到这一点。

    • 我的项目正在基于构建身份验证服务。NET内核和nuget软件包。我们希望创建包含公钥证书(或证书链)的JWT令牌,该证书可用于验证JWT数字签名。这在商业身份提供者(SaaS)中是可能的,并且在JWT规范中通过称为“x5c”的头参数得到支持。但到目前为止,我无法使用。 我能够创建使用证书签名的JWT令牌。证书是使用openssl(下面包含的命令)自签名和创建的。我在C#中的测试代码如下所示: 生成

    • 我用几个参数创建了自己的流程图块。其中两个是“代理”类型,我主要选择了相应的代理。我的块所做的是,它根据进入块的代理创建新的代理(有点像批处理块)。 到目前为止,我能够验证传入的代理,以确保在Main中选择了正确的代理类型。现在我想创建另一个带有源块和注入功能的代理。但是我的问题来了。我想根据选择的参数(类型代理)动态地创建代理。显然,在新代理字段中只输入参数的名称是行不通的(它确实有效,但只适用

    • 本文向大家介绍JavaScript 使用rest参数创建参数数组,包括了JavaScript 使用rest参数创建参数数组的使用技巧和注意事项,需要的朋友参考一下 示例 如果您需要一个数组,其中包含您可能会或可能不会希望拥有的额外参数,除了您明确声明的参数外,还可以在参数声明内使用array rest参数,如下所示: 示例1,数组中的可选参数: 示例2,所有参数现在都是一个数组: 控制台输出tru