在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?
提前谢谢
答案 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版本,并弄清楚我做错了什么