我使用HttpListener创建了一个服务器。它在没有SSL的情况下工作得很好,但是使用SSL会发生一些奇怪的事情。
我已经使用httpcfg安装了证书,甚至使用我自己的程序,它安装正确,监听器启动并提供HTTPS请求,但始终要求提供客户端证书。
它不会发生在Windows / .net上,只有Linux / mono(我使用的是ver 3.4.0)并且非常烦人,我不希望每次尝试登录时都会询问用户获得客户证书。
这是单声道错误还是有任何方法可以禁用客户端证书协商?
感谢。
答案 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版本。