如何为 JWT ES384 创建私钥

How to create private key for JWT ES384

我正在尝试使用 ES384 算法在 JWT.io 上创建 JWT 令牌。

我尝试通过几种方式创建私钥(主要是在网上找到的):

openssl ecparam -name secp384r1 -genkey -noout -out privatekey
ssh-keygen -t ecdsa -b 384 -f privatekey

我也试过格式化 pkcs8 中的密钥:

openssl pkcs8 -topk8 -in privatekey -out private.pem

我创建的 public 密钥:

openssl ec -in privatekey -pubout -out publickey

但最后,在 JWT.io 上,它总是 returns 'invalid signature'。 我想我缺少对 jwt.io 中 'private key' 字段预期内容的一些基本理解,但无法弄清楚。知道我做错了什么吗?


举个例子:

openssl ecparam -name secp384r1 -genkey -noout -out testprivatekey
openssl ec -in testprivatekey -pubout -out testpublickey

给我以下键:

-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDBkjWOV0LAn2iaHna4uSIY5yoaA5KOvAoGqr9sUNabrbfMuQXDnSUng
xsfTymDJGICgBwYFK4EEACKhZANiAAQySjyVeqVk20TQ8mw0vKZU9jDd0C27virc
BcqHKH+iAYOP76814HxFhC+K5v4eV9uIowUAXi/mdKM5UQq5YW1f21ETM6i9lg31
+SKMx6to499aJe5LJVxTbbuVKADrrgY=
-----END EC PRIVATE KEY-----

-----BEGIN PUBLIC KEY----- 
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMko8lXqlZNtE0PJsNLymVPYw3dAtu74q 
3AXKhyh/ogGDj++vNeB8RYQviub+HlfbiKMFAF4v5nSjOVEKuWFtX9tREzOovZYN 
9fkijMeraOPfWiXuSyVcU227lSgA664G
-----END PUBLIC KEY-----

在 jwt.io 中同时添加时:'invalid signature'.

您使用的曲线适用于 ES384 JWS 算法。唯一的障碍是关键 encoding/format.

由于 Web 密码学的限制 API jwt.io 仅支持 EC 私钥的 PKCS#8 和 EC public 密钥的 SPKI。

以下是用作输入的示例 ES384 键

-----BEGIN PRIVATE KEY-----
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCuAVir5v+2gZv7A3dR
EKT977pKPY+1S+h58Xbzir2gqdUKLuyCUCYJmQ6/7ac4B4ShZANiAASndkjwMCbG
fwEnf3fpjkwdEtdMCDpLEI2G4fokES6J66JxRj3CpmTwLrdJkiPiG0B6pKO+zVft
4j1XajyxhSmyuPpZQo7KaoW2QLEzBZC4M+1ko4cLd9JaSNC9//vcYf4=
-----END PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEp3ZI8DAmxn8BJ3936Y5MHRLXTAg6SxCN
huH6JBEuieuicUY9wqZk8C63SZIj4htAeqSjvs1X7eI9V2o8sYUpsrj6WUKOymqF
tkCxMwWQuDPtZKOHC3fSWkjQvf/73GH+
-----END PUBLIC KEY-----

以上是用

生成的
openssl ecparam -name secp384r1 -genkey -noout -out sec1_ec_p384_private.pem
openssl pkcs8 -topk8 -nocrypt -in sec1_ec_p384_private.pem -out ec_p384_private.pem
rm sec1_ec_p384_private.pem
openssl ec -in ec_p384_private.pem -pubout -out ec_p384_public.pem

它也支持 JWK 作为输入。

(私人)

{
  "kty": "EC",
  "x": "p3ZI8DAmxn8BJ3936Y5MHRLXTAg6SxCNhuH6JBEuieuicUY9wqZk8C63SZIj4htA",
  "y": "eqSjvs1X7eI9V2o8sYUpsrj6WUKOymqFtkCxMwWQuDPtZKOHC3fSWkjQvf_73GH-",
  "crv": "P-384",
  "d": "rgFYq-b_toGb-wN3URCk_e-6Sj2PtUvoefF284q9oKnVCi7sglAmCZkOv-2nOAeE"
}

和(public)

{
  "kty": "EC",
  "x": "p3ZI8DAmxn8BJ3936Y5MHRLXTAg6SxCNhuH6JBEuieuicUY9wqZk8C63SZIj4htA",
  "y": "eqSjvs1X7eI9V2o8sYUpsrj6WUKOymqFtkCxMwWQuDPtZKOHC3fSWkjQvf_73GH-",
  "crv": "P-384"
}