首页 > 解决方案 > X509 创建 JWT - “找不到请求的对象”

问题描述

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

我用来生成密钥的行来自https://www.claudiobernasconi.ch/2016/04/17/creating-a-self-signed-x509-certificate-using-openssl-on-windows/

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 x​​509 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 ) );
        }
    }
}

标签: c#openssljwtx509

解决方案


您提供给构造函数的数据不是X509Certificate2类所期望的。X509Certificate2需要 PKCS12 格式。

为了以正确的格式创建数据,包括作为 PKCS12 的私钥的证书,您错过了从您链接到的原始来源对 OpenSSL 的一次调用:

openssl pkcs12 -export -in public.cer -inkey private.key -out cert_key.p12

您必须传递给X509Certificate2构造函数的数据然后在cert_key.p12文件中。如果私钥被加密,您还必须将密码指定为 X509Certificate2构造函数的第二个参数。


推荐阅读