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

本文关键字:关联 证书 私钥 SSL TLS 模式 服务器 | 更新日期: 2023-09-27 18:05:42

我有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套接字,当我试图连接到它与我的客户端应用程序我得到异常:The server mode SSL must use a certificate with the associated private key

确实我的证书的PrivateKey属性是空的。我导入的证书是否不正确,还是我应该在将证书导入存储之前对其进行处理?

我的服务器认证代码看起来像这样:

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

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

要进行正确的tls握手,服务器需要有一个与证书中嵌入的公钥配对的私钥。当客户端连接时,将向其提供证书。这允许基于对发行机构的信任来验证服务器就是它所说的那个人。在握手期间,客户端将生成一个对称密码密钥,该密钥使用证书中的公钥为服务器加密。服务器将使用私有密钥解密对称密钥。

我在这里过分简化了握手过程。所以对上面的说法持保留态度。(没有暗语双关语的意思)

从杰西的评论和戴夫的回答中,我可以看出我不知怎么地创建并安装了某种部分证书,或者说是半生的证书。

我使用makecert.exe做了一个证书,不知何故设法安装它并将其加载到红隼,但当来自Chrome的请求进来时,它失败了。

我找不到pvk2pfx.exe的副本,以便从makecert.exe踢出的两个文件中制作PFX文件,所以我只是试图在没有它的情况下继续。

在那次失败和阅读上面的内容之后,我认为PFX步骤是强制性的。所以我使用了经典的PowerShell 4 (PS6 Core不会加载模块):

> $cert = New-SelfSignedCertificate -certstorelocation cert:'currentuser'my -dnsname windows
> $pwd = ConvertTo-SecureString -String 'password1234' -Force -AsPlainText
> $path = 'cert:'currentuser'my'' + $cert.thumbprint
> Export-PfxCertificate -cert $path -FilePath c:'DATA'~Scrap'windows.pfx -Password $pwd

Credit to https://medium.com/the-new-control-plane/generating-self-signed-certificates-on-windows-7812a600c2d8

Tbh,我本来是半途而废。在我的商店里产生证书的第一个命令之后,我停了下来,但是当从Chrome命中时,给了我一个不同于红隼堆栈的奇怪错误。同样,由于某些原因,需要PFX步骤。

目前我找不到一种信任签名者的方法,但是Chrome让我继续,当我不那么累的时候我会排序的。

您是如何创建证书的?在创建证书时,还使用私钥对其进行签名,这正是您所需要的。如果您已经导出了证书,那么您可能可以选择在某个时候提供密码。如果导出时未提供密码,则导出证书时不包含私钥。