使用X.509证书的非对称加密中的公钥

时间:2018-04-09 11:20:51

标签: c# x509certificate private-key

有时候我读过一篇关于使用公钥和私钥等非对称密钥安全发送数据的文章。我所理解的是服务器有1个密钥(私钥)用于加密数据,所有客户端使用第二个密钥(公钥)解密。

现在我应该如何获得密钥以及我应该如何使用?

如果我从服务器收到证书,它是否包含公钥和私钥?!

X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
var cert = GetCertificate(certStore);
var privatekey= cert.PrivateKey;
var publicKey= cert.PublicKey;

是否可以从证书中删除私钥?怎么样?如何证明证书是否有私钥?

2 个答案:

答案 0 :(得分:2)

首先澄清一点:

Public-key cryptography中,公钥用于加密数据,并使用私钥(由服务器提供) 解密数据。

私钥的所有者存储私钥并仅共享公钥。 来自服务器的任何证书都应包含 公钥。 (如果证书包含私钥,那将是一个很大的安全问题。您可以解密来自任何其他用户的消息)

要检查证书是否有私钥,您可以使用HasPrivateKey-Property

cert.HasPrivateKey;

要获得只使用公钥的证书,您可以使用:

byte[] bytes = cert.Export(X509ContentType.Cert);
var publicCert = new X509Certificate2(bytes);

答案 1 :(得分:1)

  

如果我从服务器收到证书,它是否包含公钥和私钥?!

不,不一定。

获得证书有两种不同的方法

  • PKCS#7 / PEM - 该文件通常只包含证书的公共部分
  • PKCS#12 / PFX - 商店包含带私钥的证书
  

是否可以从证书中删除私钥?

将其导出为允许您仅存储证书的公共部分的格式。

打开网络浏览器,导航到使用SSL的任何网站。

现在点击锁定图标,然后点击证书信息。您在客户端(在浏览器中)拥有的证书是没有私钥。您可以保存它,甚至可以导入系统证书存储区,但仍然没有私钥。

  

我如何理解证书是否有私钥?

如果您使用C#代码加载它,则只有具有私钥的证书才能访问HasPrivateKey属性{。{1}}。