繁体   English   中英

如何使用(和创建)X509证书来进行JWT令牌的私钥/公钥加密

[英]How to work with (and create) X509 Certificates for private/public key encryption of JWT Tokens

我试图找出两种分布式服务之间的身份验证方法。

我不想在每台服务主机上分发共享机密,因为这意味着一旦一台主机受到威胁,所有主机都将受到威胁。

所以我的情况是:

  • 主机A知道主机B的公钥
  • 主机A使用主机B的公钥对jwt进行编码和加密
  • 主机B使用它只知道自己的私钥来接收和解密jwt。

jose-jwt软件包: https : //github.com/dvsekhvalnov/jose-jwt

对我来说似乎是一个不错的选择。 除了jwt的签名外,它还支持使用私钥/公钥进行加密。

在页面上,有以下示例用于对jwt进行编码和解码:

编码:

var publicKey=new X509Certificate2("my-key.p12", "password").PublicKey.Key as RSACryptoServiceProvider;

string token = Jose.JWT.Encode(payload, publicKey, JweAlgorithm.RSA_OAEP, JweEncryption.A256GCM);

解码:

var privateKey=new X509Certificate2("my-key.p12", "password", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider;

string json = Jose.JWT.Decode(token,privateKey);

现在,这是我不明白的:

  • 如何创建仅包含公钥信息(用于对jwt进行编码的主机/服务A)的.p12证书文件?
  • ..以及如何创建同时包含公钥和私钥信息(用于解码jwt的主机/服务B)的.p12证书文件?

从我所做的所有研究中,我得到的印象是,您只能制作一个包含两个文件的.p12文件,或者只包含一个公共密钥的文件。 但是似乎无法创建两个.p12文件,一个文件既包含信息,又一个文件仅包含公钥。 我想念什么?

感谢您的回答。

通常,PKCS12 / PFX不用于仅公共用途,但是您可以根据需要进行操作。

假设cert.HasPrivateKeytruecert.Export(X509ContentType.Pkcs12, somePassword)将产生一个byte[] ,您可以将其写入“ publicAndPrivate.p12”(或其他内容)。

通常,对于仅公开证书,您会将其记录为X.509数据(DER-binary或PEM-DER编码)。 .NET不能使PEM-DER变得容易,因此我们将坚持使用DER-binary。 您可以通过cert.RawDatacert.Export(X509ContentType.Cert)来获取数据(两者都会产生相同的结果,因为此导出形式中没有随机数据)。 (publicOnly.cer)

如果您真的想要仅包含公共证书的PKCS12 Blob,请执行以下操作:

using (X509Certificate2 publicOnly = new X509Certificate2(publicPrivate.RawData))
{
    return publicOnly.Export(X509ContentType.Pkcs12, somePassword);
}

结果byte[]可以是publicOnly.p12。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM