【问题标题】:Mono HttpListener client certificateMono HttpListener 客户端证书
【发布时间】:2014-09-30 01:07:21
【问题描述】:

我已经使用 HttpListener 创建了一个服务器。它在没有 SSL 的情况下完美运行,但使用 SSL 会发生一些奇怪的事情。

我已经使用 httpcfg 安装了证书,即使使用我自己的程序,它也可以正确安装,侦听器启动并提供 HTTPS 请求,但总是要求提供客户端证书。

它不会在 Windows/.net 上发生,仅在 Linux/mono 上发生(我使用的是 3.4.0 版)并且非常烦人,我不希望用户每次尝试登录时都被询问用于客户端证书。

这是一个单声道错误还是有什么方法可以禁用客户端证书协商?

谢谢。

【问题讨论】:

    标签: c# ssl mono httplistener


    【解决方案1】:

    我也有同样的问题。我发现这是在 Mono 中硬编码的。在mcs/class/System/System.Net/HttpConnection.cs 中,当调用constructor of SslServerStream 时,您会注意到requestClientCertificate 被硬编码为true

    我遇到了 this PR,它试图将此硬编码值更改为 false,但由于“我宁愿不将一个硬编码值更改为另一个硬编码值”,它目前已被半拒绝。

    [更新] 而我现在才意识到 (OP) 是 PR 的作者 :)

    [2016 年 9 月 21 日更新] 看起来这个问题仍然很受欢迎。如果它对任何人有帮助,我们很久以前就使用 nginx 作为反向代理,当时我们无法解决这个问题。我很高兴我们做到了,而且应该早点做到。它在处理 SSL/TLS 方面比 Mono 快得多,并且允许我们更仔细地控制加密套件并及时更新安全补丁。

    我正在关注尚未发布的Mono 4.6。凭借他们对 TLS 的彻底改造以及在运行时插入替代实现的能力,这可能会给我们提供一条不使用 nginx 反向代理的前进道路。

    【讨论】:

    • 感谢您出于安全和性能原因使用 Nginx。在找到这个问题之前,我发现关于 Mono SSL 的 SO 上还有其他挥之不去的问题。我将在此处添加 cmets 以将它们链接起来。给你一个问题:在 2019 年,使用 Nginx 并完全放弃单声道 HttpListener 仍然是你建议的方法吗?
    • 还有一件事,在使用 Nginx 时,是否必须采取一些步骤来确保传入 Nancy 或其他应用程序的数据的安全性?在其他地方(对不起,我在所有搜索中都丢失了链接),我看到有人提到 Nancy 特有的一个问题,Nancy 不知道它在 HTTPS 上下文中运行,因为它在 Nginx 后面。因此,您不能在 Nancy 应用程序中使用 HTTPS 检查:例如,您不能让您的应用程序在允许执行特定功能之前验证连接是通过 HTTPS 建立的。
    • 对于专门寻找一种在他们的应用程序中嵌入带有 SSL 的 http 服务器的方法并且绝对不想将他们的应用程序放在 Nginx 或其他主机之后的任何人,一个选项是使用 Ceen HTTPd。它是一个承诺假设 SSL 的库,并且可以在应用程序级别处理证书,而无需操作系统级别的配置。我发现它在这里讨论过:softwarerecs.stackexchange.com/questions/52304/…
    • 即使现在是 2020 年 12 月,硬编码的值仍然很痛苦。这个答案促使我检查了 Nginx,我很高兴我做到了——这太神奇了!将使用它作为反向代理来处理 HTTPS 并在 localhost 上侦听 HTTP 转发到我的应用程序。
    【解决方案2】:

    唯一的选择(仍然..)是:

    使用 Gusman 的拉取请求 #1#2(取决于您的 Mono 版本)作为解决方法,如果使用最新的 Mono 版本的源代码,这对于生产环境应该是可以的。

    Mono v4.2.3.4 示例:

    echo -e -n "83c83\n< \t\t\t\tSslServerStream ssl_stream = new SslServerStream (new NetworkStream (sock, false), cert, false, true, false);\n---\n> \t\t\t\tSslServerStream ssl_stream = new SslServerStream (new NetworkStream (sock, false), cert, false, false, false);\n" > nocerts.diff
    tar xvjf mono-4.2.3.4.tar.bz2
    cd mono-4.2.3.4 
    patch ./mcs/class/System/System.Net/HttpConnection.cs ../nocerts.diff
    ./configure --prefix=/usr
    make
    make install
    

    或者使用没有客户端证书的最新 Mono 版本(即 v3.10.0)。

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2017-01-02
      • 2016-01-27
      • 2017-06-08
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多