c# - 为什么 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 必须使用具有关联私钥的证书,因为它回答了证书的生成方式。但是,drake7707对Mark Yuan的回答给了我一个提示。
于是问题解决如下: 替换这行代码
serverCertificate = X509Certificate.CreateFromCertFile(certificate);
和
serverCertificate = new X509Certificate2(certificate);
并将其声明从
static X509Certificate serverCertificate = null;
至
static X509Certificate2 serverCertificate = null;
所以总而言之,使用X509Certificate2
确实可以解决问题。
解决方案
于是问题解决如下: 替换这行代码
serverCertificate = X509Certificate.CreateFromCertFile(certificate);
和
serverCertificate = new X509Certificate2(certificate);
并将其声明从
static X509Certificate serverCertificate = null;
至
static X509Certificate2 serverCertificate = null;
所以总而言之,使用X509Certificate2
确实可以解决问题。
推荐阅读
- javascript - 如何使用 createElement 渲染函数在 javascript 中编写 vue .sync
- pentaho - 替换字符串,删除停用词
- android - 我无法在 Android SqlLite 中存储 MySql 时间戳
- python - spotfire - 选择过滤器中的值时消失的线条
- ruby-on-rails - 如何使用 CarrierWave 获取图像高度和宽度?
- xcode - 运行 git,投诉 Executable 至少需要 macOS 10.13。有解决方法吗?
- c - 如何使用 openssl 库生成密钥对并将其用于 C 中的加密/解密?
- python - 将样本存储在 numpy 数组中的正确方法
- ios - Ibeacons 核心位置库
- sensenet - 当在多步保存操作中二进制保存出错时,我们如何解锁内容?