首页 > 解决方案 > 为什么 SslStream.AuthenticateAsServer 会从 Ubuntu 而不是 Windows 10 失败

问题描述

SslStream.AuthenticateAsServer 方法在 Ubuntu 中失败,但在 Windows 10 中失败。

https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslstream?view=netframework-4.8实现 SslStrem 示例时, 它在 Windows 10 上执行时运行良好,但在UbuntusslStream.AuthenticateAsServer调用时出现以下异常:

System.NotSupportedException:服务器模式 SSL 必须使用具有关联私钥的证书。

我试过使用serverCertificate = X509Certificate2.CreateFromCertFile(certificate)而不是serverCertificate = X509Certificate.CreateFromCertFile(certificate)但无济于事。

证书是使用 OpenSSL 生成的,并且在执行模数检查时,所有密钥和证书实际上都匹配。服务器证书使用 CA 证书进行签名。证书是使用jww在How do you sign a Certificate Signing Request with your Certification Authority的冗长回答生成的?

所以总结一下:在Ubuntu (而不是 Windows 10)上调用 sslStream.AuthenticateAsServer 时,会引发以下异常: System.NotSupportedException:服务器模式 SSL 必须使用具有关联私钥的证书。

我正在使用 .net-core 环境(显然需要在 Linux 上运行):-)

它与建议的可能重复X509Certificate2 不同,服务器模式 SSL 必须使用具有关联私钥的证书,因为它回答了证书的生成方式。但是,drake7707Mark Yuan的回答给了我一个提示。

于是问题解决如下: 替换这行代码

serverCertificate = X509Certificate.CreateFromCertFile(certificate);

serverCertificate = new X509Certificate2(certificate);

并将其声明从

static X509Certificate serverCertificate = null;

static X509Certificate2 serverCertificate = null;

所以总而言之,使用X509Certificate2确实可以解决问题。

标签: c#ubuntuauthentication.net-coresslstream

解决方案


于是问题解决如下: 替换这行代码

serverCertificate = X509Certificate.CreateFromCertFile(certificate);

serverCertificate = new X509Certificate2(certificate);

并将其声明从

static X509Certificate serverCertificate = null;

static X509Certificate2 serverCertificate = null;

所以总而言之,使用X509Certificate2确实可以解决问题。


推荐阅读