c# - X509 创建 JWT - “找不到请求的对象”
问题描述
我首先要说我对密码学知之甚少。我知道理论上什么是公钥/私钥。我使用 Windows 的 openSSL 生成了一些。我的计划是使用私钥签署 JWT,以便可以使用公钥对其进行验证。
openssl genrsa 2048 > private.key
openssl req -new -x509 -nodes -sha1 -days 1000 -key private.key > public.cer
我在 notepad++ 中打开了私钥,并将字符串复制/粘贴到 C# 中的变量中(我尝试删除换行符,并使用 保留换行符@""
)。
我尝试使用如下变量创建 x509:
var x509 = new X509Certificate2( Convert.FromBase64String( privateKey ) );
但是,我收到一条WindowsCryptographicException
消息“找不到请求的对象”。
我知道我想做的事情是可能的,因为我们在 PROD 代码中使用完全相同的行(使用不同的字符串)来读取 JWT(我假设这个字符串是我公司的公钥)。如果我将该字符串传递给我的 x509 构造函数,则证书会成功生成,但我当然不能用它签署 JWT,因为它知道它是公开的。
x509 ctor 似乎也在为这篇文章的作者工作:Trouble sign a JWT token with an x509 Certificate,但我无法达到他的程度。
那么,我做错了什么?找不到什么,我该如何“绘制地图”?
==编辑==
我认为已经有足够的例子了,但我想你去吧:
using System;
using System.Security.Cryptography.X509Certificates;
namespace LocalTokenApi.JWT
{
public class JwtBuilder
{
public void GenerateJwt( string xmlUri )
{
var privateKey = @"
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDQrPEi4DwPJ65D
ZEybExHaslb2OZt+e/TRZAkO7LrlVf5aH7uiYYL42yGxhyBxQVbNDW8cAyD/r4o1
zRCCjBS1yk36YtZ+HzIc7X5c3YMmfC6k2r5GD6Ah9fkfhAbqzIiJo/GEJokCDkHS
tyniDDDnI6gteibuTRqS5qnA7YEhedqy5uOdb5TAKCLMCNJgkg9+lNTUPTg+D+Gj
94rSMJ9bpTEvU+sfta5UrDF2Owy15b9ExkELyJAWSTV/LcMrlhkZtkVQtNZM1xov
yNBPCu8+LsRnifjduS9MMh9z3RmnIE/MFl1XUnB/Ocf2HVQavP2U240kYrStVNz7
/twmPnUHAgMBAAECggEBAKw+Q9/ktM5Rk46+6FiMOg2JbSxaSpXxnReE+dEe5/nK
rGMZlFgpIuFkhwAxKD8zjoE82HyHvKIv8+YKuNj45VNUhF7rXF7IQyYLhmUC1nFa
yWl7wNi1pxjBHnu8D7WZVA5Ai2boI+jVedGDLIgQRgFTtkqrbB0A+bFNwcqkgBTv
MFYi8N5vJky3lnpivSY/hG7bOh9GacEDMqMy7aAe+15ppfHbzDcf5AUtHTwhtjc8
G/2VMdIUhozmz3b5XoSjuGeFSc/6CVsjKeLguRYr7Z4i0iaj89u60UPNwhxXTZlg
rrxfT7aZCgghSDLll/hH0Lqtwmd/ym9A2XRWxDabZtkCgYEA+Lt2P9CmoLun7/NN
i0IVnCaB4dpVaV7KgPtlWtE3oKB5wMhX18pJo5hB16UWfzBRRN3qL56iC1qJBAmW
pm/3ypcuzwm9PZrnPdb93cfWjW/GIMcK8oNUjpA2f/iLtZSO7iEua3Qtl1bJrJVv
MdVa+xdTViNR1TfhcJOnDmjH2mUCgYEA1sXaOYgi78S8m2LCyR5cJNTdW/7eBXVj
X48F1ZmpQGQ6+7258I43Gr2fHryAD9fidmi6YrRM+dDpk5FsIoVFK+Lqa4Oy79/y
oQt1HaByfvoBpDsCUY6yf/H4XhMUbZ/CF3tkceFvzBrrsAuuqh7OIsqe7hho9Sgd
/F8asP5exPsCgYA4wETtsISkPczGccPqlyxpEVwnFPLR9N/NaA6rFvtTOeots0hf
ovcETZQQSMmGQZb5WIy7Sr18S67hbfKijP+DiNUURguYh8RlFq2bsaHhaXRSPDfi
N1bOpFbbAfGWf4vRB18ZA0v3sMSZDQtu2lhE3ACWsb5VIMfeMMI4Bm47BQKBgQCP
/ljAB9D8lhepyj40HyHCI+FBg5ARctGsSLStr/c0z75n950Jdh/l0sozDkiB1sjj
gHWuJZoSR4nCwVYRku58bQekC8lVX/1JEeh0c5UwIqglFtcIHTb55x4Q3JPup5S2
r6j5XR7aZhYskriJIFwuIVEK6ty7uSjZgl3f2rtpLwKBgQC0BeuhdrQzrD8kg6cV
ZTvX12F5qJ1PFfbSpI9NwI5opqgCeGfUElEa32ig1v42taXNthWGGpFsUoSCoJG2
T2bDQ05TOItkg5/oVPJHS1ia26bxafTrXHtDoeuZ/G5oip2qULtQ62vUcazdsJ6x
zN6C1hsvJ4Kb3xPd2ZizjfDgAQ==";
var x509 = new X509Certificate2( Convert.FromBase64String( privateKey ) );
}
}
}
解决方案
您提供给构造函数的数据不是X509Certificate2
类所期望的。X509Certificate2
需要 PKCS12 格式。
为了以正确的格式创建数据,包括作为 PKCS12 的私钥的证书,您错过了从您链接到的原始来源对 OpenSSL 的一次调用:
openssl pkcs12 -export -in public.cer -inkey private.key -out cert_key.p12
您必须传递给X509Certificate2
构造函数的数据然后在cert_key.p12
文件中。如果私钥被加密,您还必须将密码指定为 X509Certificate2
构造函数的第二个参数。
推荐阅读
- javascript - Typescript 中的 Promise 函数“类型 void 不可分配……”
- arrays - MongoDB - 从对象数组中检索对象数组。使用猫鼬
- scala - Flink:找不到类型信息类型的证据参数的隐式值
- excel - 使用 Vlookup 从两个工作表的公共列中获取多个匹配的行
- node.js - updating and validating multiple files from different fields uploded with multer
- javascript - Can't figure out how to close modal by clicking outside window
- angular - 如何返回一个带有回调值的 observable?
- arduino - SPI Arduino Interface with Absolute Encoder
- firebase - Flutter FCM how to remove the token when user uninstall the app
- c# - How to write an ASP.NET custom validator for a model defined in an external library