c# - 服务器模式 SSL 必须使用具有关联私钥的证书 - 在 TLS 握手期间

标签 c# ssl ssl-certificate x509certificate2

我有一个证书 someCert.cer。我使用 MMC 实用程序将它导入到我的本地证书存储中。我的 C# 应用程序能够使用以下代码访问它:

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
X509Certificate2 certificate = null;
store.Open(OpenFlags.ReadOnly);
try
{
    var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, "THUMBPRINT", false);
    certificate = certificateCollection[0];
}
finally
{
    store.Close();
}

该应用程序公开了 TCP 套接字,当我尝试使用我的客户端应用程序连接到它时,出现异常: 服务器模式 SSL 必须使用带有关联私钥的证书

确实我的证书的 PrivateKey 属性是空的。我是不是导入了错误的证书,或者我应该在将证书导入商店之前对证书做些什么?

我的服务器验证码是这样的:

stream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12, true);

最佳答案

为了正确的 tls 握手,服务器需要有一个私钥与证书中嵌入的公钥配对。当客户端连接时,它会收到证书。这允许基于发布机构的信任来验证服务器是它所说的那个人。客户端在握手期间将生成一个对称密码 key ,该 key 使用证书中的公钥为服务器加密。服务器将使用私有(private)部分解密对称 key 。

我在这里过度简化了握手过程。因此,请对以上内容持保留态度。 (没有加密双关语)

关于c# - 服务器模式 SSL 必须使用具有关联私钥的证书 - 在 TLS 握手期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31732365/

相关文章:

c# - C#调试时 '~'是什么意思?

ssl - 如何强制 tomcat 服务器不将 SSL 公共(public)证书共享给请求它的客户端(浏览器)?

amazon-web-services - 我可以在没有负载均衡器的情况下为 AWS lightsail 设置 ssl 证书吗?

ssl-certificate - 是否可以将 SSL 证书从 .key 文件转换为 .pfx?

php - 无法使用 PHP OAuth 扩展使用已知的 CA 证书对对等证书进行身份验证

c# - Windows Phone 8.1 中的背景录音

c# - 使用 LINQ 进行动态投影

c# - 如何从子表单引用表单?

ssl - 使用 ZeroSSL 为谷歌应用引擎创建 SSL 证书并让我们加密

python - session 管理、SSL、WSGI 和 Cookie