Mono HttpListener客户端证书

时间:2014-08-06 22:47:14

标签: c# ssl mono httplistener

我使用HttpListener创建了一个服务器。它在没有SSL的情况下工作得很好,但是使用SSL会发生一些奇怪的事情。

我已经使用httpcfg安装了证书,甚至使用我自己的程序,它安装正确,监听器启动并提供HTTPS请求,但始终要求提供客户端证书。

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

这是单声道错误还是有任何方法可以禁用客户端证书协商?

感谢。

2 个答案:

答案 0 :(得分:2)

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

我遇到this PR试图将此硬编码值更改为false,但由于&#34而目前已被半拒绝;我宁愿不为另一个更改一个硬编码值硬编码的价值。"

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

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

我密切注意尚待释放的Mono 4.6。通过对TLS的彻底检查以及在运行时插入备用实现的能力,这可以为我们提供一条前进的道路而不使用nginx反向代理。

答案 1 :(得分:0)

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

使用Gusman的拉取请求#1#2(取决于您的Mono版本)作为解决方法,对于高效环境应该是正常的,如果是最新的Mono版本&# 39;使用源代码。

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

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