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

时间:2017-04-17 14:54:55

标签: c# encryption certificate x509certificate json-web-token

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

我不希望在每个服务主机上分发共享密钥,因为这意味着一旦主机遭到入侵,所有主机都会受到攻击。

所以我的方案是:

  • 主机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);

现在,我不明白这一点:

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

从我所做的所有研究中,我得到的印象是,您既可以制作包含两者的.p12文件,也可以只制作包含公钥的文件。但似乎无法创建两个.p12文件,一个包含两个信息,另一个只包含公钥。我错过了什么?

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

通常情况下,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。