如何将Identity Server 4生成的JWK转换为PEM格式公钥
我有一组Identity Server 4发布的RSA512算法JWKS,用于客户端校验Token签名。现在我想在jwt.io站点上也完成签名校验,但不知道如何将JWK参数转换为对应格式的公钥:
目标公钥格式示例:
-----BEGIN PUBLIC KEY-----
MIIBCgKCAQEA+xGZ/wcz9ugFpP07Nspo6U17l0YhFiFpxxU4pTk3Lifz9R3zsIsu
ERwta7+fWIfxOo208ett/jhskiVodSEt3QBGh4XBipyWopKwZ93HHaDVZAALi/2A
+xTBtWdEo7XGUujKDvC2/aZKukfjpOiUI8AhLAfjmlcD/UZ1QPh0mHsglRNCmpCw mwSXA9VNmhz+PiB+Dml4WWnKW/VHo2ujTXxq7+efMU4H2fny3Se3KYOsFPFGZ1TN
QSYlFuShWrHPtiLmUdPoP6CV2mML1tk+l7DIIqXrQhLUKDACeM5roMx0kLhUWB8P
+0uj1CNlNN4JRZlC7xFfqiMbFRU9Z4N6YwIDAQAB
-----END PUBLIC KEY-----
转换后的公钥需要可在jwt.io站点用于Token校验。我起初找到的相关实现库是付费的,因此想找免费的实现方案。
踩坑记录
我尝试了如下代码片段:
using var httpClient = new HttpClient(); var json = httpClient.GetStringAsync( "http://..../.well-known/openid-configuration/jwks").GetAwaiter() .GetResult(); var jsonWebKeySet = new JsonWebKeySet(json); var jsonWebKey = jsonWebKeySet.Keys.First(); var rsaProvider = new RSACryptoServiceProvider(); rsaProvider.ImportParameters(new RSAParameters { Modulus = Base64Url.Decode(jsonWebKey.N), Exponent = Base64Url.Decode(jsonWebKey.E) }); var publicKey = Base64Url.Encode(rsaProvider.ExportRSAPublicKey());
我使用了Jose库的Base64Url类,但得到的是Base64Url格式的公钥,包含_和-字符。我尝试将这两个字符分别替换为/和+,但校验时还是返回Invalid Signature,使用付费库时则校验正常,不清楚哪里操作有误。
最终解决方案
我将代码最后一行修改为:
var publicKey = Convert.ToBase64String(rsaProvider.ExportSubjectPublicKeyInfo());
之后对生成的公钥内容按64字符一行的规则做换行处理,再添加-----BEGIN PUBLIC KEY-----头部和-----END PUBLIC KEY-----尾部,就可以在jwt.io站点上正常完成JWT校验了。
内容的提问来源于stack exchange,提问作者pampua84

