C# Mono与.NET-服务器证书验证方面的差异?

C# Mono与.NET-服务器证书验证方面的差异?,c#,ssl,xamarin,mono,tls1.2,C#,Ssl,Xamarin,Mono,Tls1.2,我有以下代码: class MainClass { public static void Main (string[] args) { ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback; HttpWebRequest.CreateHttp("https://www.badssl.com/").GetRespo

我有以下代码:

class MainClass
{
    public static void Main (string[] args)
    {
        ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;

        HttpWebRequest.CreateHttp("https://www.badssl.com/").GetResponse();
        HttpWebRequest.CreateHttp("https://wrong.host.badssl.com/").GetResponse();

        Console.ReadLine();

    }

    private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        Console.WriteLine(((HttpWebRequest) sender).RequestUri + " " + sslPolicyErrors); 

        return true;
    }
}
我在Windows8和MacOSX上运行它

MacOSX

https://www.badssl.com/ None
https://www.badssl.com/ None
https://wrong.host.badssl.com/ RemoteCertificateChainErrors
Windows(.net 4.5):


知道我为什么会得到不同的结果吗?我想在Mac OS X上也安装
RemoteCertificateMatch
,因为我认为它是正确的

Mono有自己的TLS堆栈实现。NET使用本机Windows堆栈(SChannel)。这两个堆栈在行为和功能上都有很大的不同(比如没有使用Mono的TLS1.2)。除此之外,Mono中的错误可能来自不同的根CA,即Mono将找不到指向受信任根CA的路径,甚至在检查名称之前都不会提前进行投诉,而.NET将查找受信任路径,并在稍后根据URL验证证书主题时进行投诉。

您是否尝试在Windows上的Mono上运行它?可能值得一试。我会在Mono源代码中滚动,因为他们似乎正在使用本机OS-X函数来派生证书问题<代码>评估系统
检查使用情况
等`在windows上的Mono上测试,我得到了RemoteCertificateNameMismatch。我试图通过首先验证来隔离根CA问题,结果很好。仅供参考:如果使用新的TLS提供程序,Mono确实有1.2支持@SushinHangover:当然你可以使用一个尚未正式发布的堆栈(即Mono版本中未包含的堆栈),该堆栈包含明确的免责声明:。@SteffenUllrich如果你使用该“测试”提供程序,请完全理解。。。但我和其他许多人一样使用本机操作系统提供程序。@sushingover:我现在发现已经存在此类本机提供程序的信息。该链接仅包含将来某一天实现此类提供者的意图。
https://www.badssl.com/ None
https://www.badssl.com/ None
https://wrong.host.badssl.com/ RemoteCertificateNameMismatch