【问题标题】:C# HttpListener (netsh) problems with SelfSigned Certificate自签名证书的 C# HttpListener (netsh) 问题
【发布时间】:2022-08-16 22:03:39
【问题描述】:

我的 HttpListener 有一些问题。我已经搜索并阅读了一些讨论。 例如:Httplistener with HTTPS support

首先,我尝试描述我的场景: 我想创建一个支持 SSL/HTTPS 的 HTTP 侦听器。那是主要目标。 我使用 OpenSSL 创建了自己的 CA,并创建了自己的服务器证书。 我现在有:

  • myCa.key
  • myCa.pem
  • myCa.srl
  • myServer.key
  • myServer.csr
  • myServer.crt

我将 myCa.pem 和 myServer.crt 证书安装到我的本地计算机上。我将 CA 移到了受信任的存储中,并将服务器证书移到了“自己的证书”中

然后我获取了我的服务器证书的指纹(certHash)。 我使用管理员权限创建了 netsh 条目

netsh http add sslcert ipport=0.0.0.0:9649 appid= \'{0a5ce-569a-4dc6-8ed7-9ef91241dec3}\' certhash=4F556BDC3F97B31D555266DA74F573777FCCAA55

我的 C# 植入比较简单:

    this.Listener = new HttpListener();
    this.Listener.Prefixes.Add(\"https://*:9649\");
    this.Listener.Start();
    this.Listener.BeginGetContext(new AsyncCallback(ProcessClient), this.Listener);

   //Process an incoming connection
   private void ProcessClient(IAsyncResult result)
   {
      var listener = (HttpListener)result.AsyncState;
      var clientContext = listener.EndGetContext(result);
   }

当我在我的 TcpStack 中实现 SSL 时,我使用了 SSL-Stream,我可以在那里使用 ValidationCallback 验证证书。我不确定这是否可行。我试过了 ServicePointManager.ServerCertificateValidationCallback += ValidateCert; 但我从来没有在那里达到断点。

现在解决问题:

当我尝试连接自己的 HttpClient(.NET HttpClient 类)时,SSL 层上总是出现RemoteNameMismatch 错误。我没有在ProcessClient 方法中遇到断点。我尝试不使用特定证书(自动检测),并且还尝试向客户端建议相同的证书(具有相同的哈希)。在这两种情况下,我都遇到了同样的错误。当我在客户端和服务器端使用相同的证书时,我不明白为什么会出现任何错误。我一直认为 netsh 会比较证书。

当我尝试与 Postman 连接时,我点击了 ProcessClient 函数。但是 Postman 收到一个错误,即他无法检查证书。但我认为问题在于我的证书不是官方证书。但是数据交换正在工作。

另一点是:我也想在带有 unix 操作系统的容器中推出我的应用程序。 .NET60 专为跨平台设计。但是 netsh 的 unix 挂件是什么?是否可以在 unix 上使用 https 运行我的监听器?应用程序和证书之间的映射如何工作? 也许我必须改变我的技术?替代HttpListener?主要是我不想使用第三方的东西。

更新解决方案:请看下面我的回答

感谢您的阅读和帮助。

问候

  • 您提供的链接来自 2012 年,SSL/TLS 发生了很多变化。首先 SSL、TLS 1.0 和 TLS 1.1 已过时,已在 Windows 服务器上禁用。所以你必须使用 TLS 1.2 或 TLS 1.3。某些加密模式已被禁用,因此您的证书可能不好(请参阅:en.wikipedia.org/wiki/…)。 TLS 在发送 HTTP 请求之前执行,因此如果您不验证证书,则永远不会发送请求。确定 TLS 是否通过的最佳方法是使用嗅探器。检查 TLS 版本并查看是否曾经发送过请求。
  • TLS 客户端使用 TLS 版本发送请求。然后服务器返回一个带有可能证书名称的证书块。然后,客户端在存储中查找证书名称以找到匹配的证书。证书是具有加密模式和到期日期的文本文件。日期和加密模式都必须对正在使用的 TLS 版本有效。
  • RemoteNameMismatch 表示您连接的地址与证书不匹配。发生这种情况的典型情况是,如果您使用机器名称 MyMachine 连接而不使用 FQDN MyMachine.MyDomain.co.uk
  • 是否可以将其设置为通配符证书?然后我的开发团队中的每个人都可以使用该证书。当我将它设置为我的计算机名称时,它与我个人绑定。我理解对了吗?谢谢

标签: c# .net ssl https netsh


【解决方案1】:

就像那些家伙在 in cmets 中所说的那样。 FDQN 是问题所在。简单来说:我创建了自己的 CA,然后针对 CA 创建了服务器证书签名请求。在服务器证书中,CN 与我的个人计算机的 DNS 匹配。与我的 HTTP 侦听器的连接现在正在工作。谢谢您的帮助!

【讨论】:

  • 做了编辑。谢谢你的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2020-09-20
  • 2021-02-14
  • 2018-11-16
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多