我试图找出两种分布式服务之间的身份验证方式。
我不希望在每个服务主机上分发共享密钥,因为这意味着一旦主机遭到入侵,所有主机都会受到攻击。
所以我的方案是:
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文件,也可以只制作包含公钥的文件。但似乎无法创建两个.p12文件,一个包含两个信息,另一个只包含公钥。我错过了什么?
感谢您的回答。
答案 0 :(得分:0)
通常情况下,PKCS12 / PFX不仅用于公开场合,但如果您愿意,也可以这样做。
假设cert.HasPrivateKey
为true
:cert.Export(X509ContentType.Pkcs12, somePassword)
将生成一个byte[]
,您可以将其写入“publicAndPrivate.p12”(或其他)。
通常,对于仅限公共的证书,您可以将其写为X.509数据(DER-binary或PEM-DER编码)。 .NET不会使PEM-DER变得容易,因此我们将坚持使用DER-binary。您可以通过cert.RawData
或cert.Export(X509ContentType.Cert)
获取该数据(两者都会生成相同的结果,因为此导出表单中没有随机数据)。 (publicOnly.cer)
如果确实想要一个只有公共证书的PKCS12 blob:
using (X509Certificate2 publicOnly = new X509Certificate2(publicPrivate.RawData))
{
return publicOnly.Export(X509ContentType.Pkcs12, somePassword);
}
结果byte[]
可以是publicOnly.p12。