C# X509创建JWT-“;找不到请求的对象";

C# X509创建JWT-“;找不到请求的对象";,c#,openssl,jwt,x509,C#,Openssl,Jwt,X509,首先我要说我对密码学知之甚少。理论上我知道什么是公钥/私钥。我使用openSSL for Windows生成了一些。我的计划是用私钥签署JWT,这样就可以用公钥进行验证 我用来生成密钥的行来自 我在notepad++中打开私钥,并将字符串复制/粘贴到C#中的变量中(我尝试删除换行符,并使用@“保留换行符) 我尝试使用如下变量创建x509: var x509=新的X509Certificate2(Convert.FromBase64String(privateKey)); 但是,我收到一个Win

首先我要说我对密码学知之甚少。理论上我知道什么是公钥/私钥。我使用openSSL for Windows生成了一些。我的计划是用私钥签署JWT,这样就可以用公钥进行验证

我用来生成密钥的行来自

我在notepad++中打开私钥,并将字符串复制/粘贴到C#中的变量中(我尝试删除换行符,并使用
@“
保留换行符)

我尝试使用如下变量创建x509:

var x509=新的X509Certificate2(Convert.FromBase64String(privateKey));
但是,我收到一个
WindowsCryptographicException
,消息是“找不到请求的对象”

我知道我想做的是可能的,因为我们在PROD代码中使用完全相同的行(带有不同的字符串)来读取JWT(我假设这个字符串是我公司的公钥)。如果我将该字符串传递到x509构造函数中,证书将成功生成,但我当然不能用它对JWT进行签名,因为它知道它是公共的

x509 ctor似乎也在为这篇文章的作者工作,但我没法和他走得那么远

那么,我做错了什么?什么东西找不到,我如何“画一张地图”到它

==编辑==

我认为已经有足够的例子了,但我想你可以这样说:

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\u key.p12
文件中。如果私钥被加密,您还必须将密码指定为
X509Certificate2
构造函数的第二个参数。

请提供示例@NineBerry。作为一个严肃的问题,老实说,我不想听起来很讽刺,但这有助于回答这个问题吗?文章说第三行是可选的。我确实尝试过,但它生成了一个无法在文本编辑器中打开的文件,双击它可以“导入”它,这是我不确定要做的事情。我会搜索一下,看看是否有办法将.p12数据作为base64字符串获取。。。我突然想到,我可以将文件本身转换为base64字符串,所以我也要尝试一下。是的,好的!是的,创建.p12密钥文件并将整个文件转换为Base64字符串正是我所需要的。谢谢
openssl pkcs12 -export -in public.cer -inkey private.key -out cert_key.p12