在Linux上使用SslStream进行身份验证时出现RemoteCertificateNameMismatch

时间:2018-07-11 12:25:45

标签: linux ssl tcp .net-core

在Linux环境上运行dotnet-core应用程序时,我遇到了dotnet SslStream的一些奇怪行为。

代码如下:

TcpClient cl = new TcpClient();
cl.Connect("52.209.63.190", 443);
var ssl = new SslStream(cl.GetStream());
ssl.AuthenticateAsClient("api.bitfinex.com");

在Windows上运行时,验证结果成功。 但是,在Linux上,相同的代码以auth错误(RemoteCertificateNameMismatch)结尾。

dotnet --info:

.NET命令行工具(2.1.4)

产品信息:  版本:2.1.4  提交SHA-1哈希:5e8add2190

运行时环境:  操作系统名称:fedora  操作系统版本:27  操作系统平台:Linux  RID:linux-x64  基本路径:/usr/share/dotnet/sdk/2.1.4 /

Microsoft .NET Core共享框架主机

版本:2.0.5   内部版本:17373eb129b3b05aa18ece963f8795d65ef8ea54

为什么代码行为在Linux上是如此不同? 如何处理并通过ssl auth?

提前谢谢

2 个答案:

答案 0 :(得分:0)

因此,您可以使用

连接到该主机。
TcpClient cl = new TcpClient();
cl.Connect("api.bitfinex.com", 443);
var ssl = new SslStream(cl.GetStream());
ssl.AuthenticateAsClient("api.bitfinex.com");

我不知道您如何获得api.bitfinex.com的IP地址,但是它处于cloudflare下,也许您不需要将bitfinex与他的真实IP地址连接起来。

但是如果需要连接该特殊IP地址,则可以在进行任何连接之前覆盖验证回调

System.Net.ServicePointManager.ServerCertificateValidationCallback =
    (sender, certificate, chain, errors) => true;

答案 1 :(得分:0)

看起来答案很简单:dotnet版本太旧。

2.0似乎有一些ssl问题,自2.1起已修复

当我安装最新版本(2.1.3)时,我的应用仍无法正常工作,因为我必须手动卸载上一版本(2.0.5)才能使用2.1.3

现在,该应用程序在Windows和Linux环境中均以相同的结果结束。

非常感谢M. Hovhannisyan。我已经开始尝试不同的linux版本,并弄清楚我做错了什么