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

Gre*_*egH 11 encryption x509certificate x509 jwt jwk

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

\n
    \n
  • \xe2\x80\x9ckty\xe2\x80\x9d:密钥类型

    \n
  • \n
  • \xe2\x80\x9ckid\xe2\x80\x9d:密钥 ID

    \n
  • \n
  • \xe2\x80\x9cuse\xe2\x80\x9d:\xe2\x80\x9csig\xe2\x80\x9d 公钥使用

    \n
  • \n
  • \xe2\x80\x9cn\xe2\x80\x9d:模数

    \n
  • \n
  • \xe2\x80\x9ce\xe2\x80\x9d: \xe2\x80\x9cAQAB\xe2\x80\x9d 公共指数

    \n
  • \n
  • \xe2\x80\x9cx5c\xe2\x80\x9d:X.509 证书链

    \n
  • \n
  • \xe2\x80\x9cx5t\xe2\x80\x9d:X.509 证书 SHA-1 指纹

    \n
  • \n
\n

笔记:

\n
    \n
  • JWK 应包含使用 RSA 算法的公钥。RSA 提供用于密钥匹配目的的密钥 ID。

    \n
  • \n
  • 应包含使用 \xe2\x80\x9cx5t\xe2\x80\x9d (X.509 SHA-1 指纹)和 \xe2\x80\x9cx5c\xe2\x80\x9d (X.509\n证书链)的 X.509 证书参数

    \n
  • \n
\n

前 5 个参数(“kty”、“kid”、“use”、“n”、“e”)相当简单,不是问题。但是,对于“x5c”和“x5t”组件,我不确定如何生成它们。看来我可以使用https://www.samltool.com/self_signed_certs.php上找到的工具创建 x509 证书,我想生成的 x509 证书将包含 x5c 参数。这是正确的吗?我如何从中生成 x5t(证书指纹)?

\n

感谢所有帮助。

\n

Top*_*aco 21

由于您既没有标记工具也没有标记语言,所以我认为它只是对这两个参数的一般解释。

x5c中存储证书或证书链,在x5t中存储关联的指纹。证书或证书链用于证明公钥的所有权,指纹用于识别/比较证书的证书的哈希值。

RFC 7517 JSON Web Key (JWK) 的第4.7 x5c4.8 x5t章中描述了这两个参数的确切定义:

  • x5c:

“x5c”(X.509 证书链)参数包含一个或多个 PKIX 证书链 [RFC5280]。证书链表示为证书值字符串的 JSON 数组。数组中的每个字符串都是一个 base64 编码([RFC4648] 第 4 节——不是 base64url 编码)的 DER [ITU.X690.1994] PKIX 证书值。包含密钥值的 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
Run Code Online (Sandbox Code Playgroud)

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

-----BEGIN PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDkWIfV9uL3XMay
...
OPAsywknGU1A/xTa3fFKO9KV6t/T9z3G
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

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

-----BEGIN CERTIFICATE-----
MIIF4zCCA8ugAwIBAgIJAKSZ5oC4tblkMA0GCSqGSIb3DQEBCwUAMIGHMQswCQYD
...
6aBMYeKy0dqjtZIlO8rm2Rialc7Qt+0=
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

有关更多选项和详细信息,请参阅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=="]
} 
Run Code Online (Sandbox Code Playgroud)

请注意,值内的换行符仅用于显示目的。DER 编码是 PEM 编码去除页眉、页脚和换行符并对其余部分进行 Base64 解码的结果,即 Base64 解码的 DER 编码证书是没有换行符的 PEM 编码证书的正文。

对于证书链,证书之间用逗号分隔,请参阅RFC 7515,附录 B,x5c 等

指纹/指纹:

证书的指纹是 DER 编码证书的 SHA-1 哈希值,可以使用 OpenSSL 生成,如下所示:也在这里

openssl x509 -in cert.crt -noout -fingerprint
Run Code Online (Sandbox Code Playgroud)

这里的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
Run Code Online (Sandbox Code Playgroud)

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

"x5t":"4pNenEBLv0JpLIdugWxQkOsZcK0"
Run Code Online (Sandbox Code Playgroud)

  • @user2820906 - E2935E9C404BBF42692C876E816C5090EB1970AD 是十六进制编码值,即您必须在 Base64url 编码之前进行十六进制解码:https://gchq.github.io/Cyber​​Chef/#recipe=From_Hex('Auto')To_Base64('A-Za-z0 -9-_')&输入=RTI5MzVFOUM0MDRCQkY0MjY5MkM4NzZFODE2QzUwOTBFQjE5NzBBRCA (3认同)