JOSE(JSON Object Signing and Encryption) 都是什么?

好风 发表于 2017-04-06T03:43:56.742648Z
引用地址:https://plus.ooclab.com/note/article/1357

参考:

JOSE(JSON Object Signing and Encryption) Working Group

Python

阿里 api gateway

OpenID Connect 认证 描述了一种使用 RSA SHA256 算法进行 JWT 加密签名的实现。使用 pyjwt 可以如下处理。

注意

  1. 需要安装 cryptography 库 ( Cryptographic Dependencies (Optional) )
  2. pyjwk最新的代码中, RSAAlgorithm 有 to_jwk 方法 ( Add JWK support for HMAC and RSA keys )

1. 创建 keypair (公钥私钥对)

$ # 创建私钥
$ openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
$ # 从私钥提取公钥
$ openssl rsa -pubout -in private_key.pem -out public_key.pem

2. jwt 加密/解密

# 加密
key = open('private_key.pem').read()
encoded = jwt.encode({'some': 'payload'}, key, algorithm='RS256')
# 解密
pubkey = open('public_key.pem').read()
jwt.decode(encoded, pubkey, algorithm='RS256')

3. jwk 生成

# 注意,使用最新的 pyjwt, RSAAlgorithm 有 `to_jwk` staticmethod
from jwt.algorithms import RSAAlgorithm
rsa256 = RSAAlgorithm(RSAAlgorithm.SHA256)
# 私钥 to jwk
key = open('private_key.pem').read()
key_obj = rsa256.prepare_key(key)
rsa256.to_jwk(key_obj)
# 公钥 to jwk
pubkey = open('public_key.pem').read()
pubkey_obj = rsa256.prepare_key(pubkey)
rsa256.to_jwk(pubkey_obj)

4. 重要

ali api gateway 示例中给的 public key jwk 是 EC256 算法。

参考:

# 创建 ec256 key (公钥和私钥)
openssl ecparam -genkey -name secp256k1 -noout -out ec256-key-pair.pem