【问题标题】:RemoteCertificateNameMismatch when auth using SslStream on linux在 linux 上使用 SslStream 进行身份验证时 RemoteCertificateNameMismatch
【发布时间】:2018-12-19 11:50:23
【问题描述】:

在 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 上运行时,验证结果是成功的。 但是相同的代码以 auth 错误(RemoteCertificateNameMismatch)结尾,当 linux 时。

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 身份验证?

提前谢谢你

【问题讨论】:

  • 你能不能这样测试一下 cl.Connect("api.bitfinex.com", 443);
  • 它可以工作,但 dns 是用我不想连接的不同 ip 解析的。
  • 不知道你是怎么得到api.bitfinex.com的IP地址的,但是api.bitfinex.com在cloudflare下,那个域是用cloudflare解析的。
  • 这与 cloudflare 或特定主机和 ip 无关,它与不同平台上的应用程序行为有关
  • .NET Core 在 Windows 上使用 Win32 API 来实现 SSL,而在 Linux 上它目前使用 openssl。因此,行为可能略有不同。没什么好惊讶的。

标签: linux ssl tcp .net-core


【解决方案1】:

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

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

当我安装最新版本 (2.1.3) 后,我的应用仍然无法运行,因为我必须手动卸载旧版本 (2.0.5) 才能使用 2.1.3

现在应用程序在 windows 和 linux 环境下都以相同的结果结束。

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

【讨论】:

    【解决方案2】:

    因此,您可以使用

    连接到该主机
    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;
    

    【讨论】:

    • 我不需要覆盖 Windows 上的验证回调。为什么?我可以使用默认的 linux 工具(如 curl 或 wscat)轻松地通过此 IP 访问主机。以相同方式编写的简单 C++ 示例也通过了身份验证。所以它看起来像 dotnet 和 linux 特定问题
    • 我刚刚尝试在我的 Linux 环境中运行你的代码,并且它在没有任何 RemoteCertificateNameMismatch 的情况下运行
    • 我在我的问题中更新了 dotnet --info。你用什么 linux 和 dotnet?
    • 我用的是 Arch Linux,dotnet 2.1.300 版本
    • 嗯.. 我会尝试测试不同的 linux 环境。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多