Mono vs .NET - 服务器证书验证的差异?

时间:2016-05-22 18:19:33

标签: c# ssl xamarin mono tls1.2

我有以下代码:

<?php
define (DB_NAME,'seller');
define (DB_USER,'root');
define (DB_PASSWORD,'');
define (DB_HOST,'localhost');

$link = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
if (!$link)
{die('Could not connect: '.mysql_error());}

$db_selected = mysql_select_db(DB_NAME,$link);

if(!$db_selected){die('Cant use '.DB_NAME.':'.mysql_error();}

echo'SUCESS';
$value = $_POST['adtitle'];
$value2 = $_POST['sellersname'];
$value3 = $_POST['email'];
$value4 = $_POST['description'];
$value5 = $_POST['category'];
$value6 = $_POST['phone number'];
$value7 = $_POST['base'];
$value8 = $_POST['cutoff'];

$sql ="INSERT INTO seller (adtitle,sellersname,email,description,category,phone number,base,cutoff) VALUES('$value',$value2,$value3,$value4,$value5,$value6,$value7,$value8)";


mysql_close();

?>

我在Windows 8和Mac OSX上运行它。

Mac OS X

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;
    }
}

Windows(.net 4.5):

https://www.badssl.com/ None
https://www.badssl.com/ None
https://wrong.host.badssl.com/ RemoteCertificateChainErrors

为什么我得到不同结果的任何想法?我想在Mac OS X案例中也有https://www.badssl.com/ None https://www.badssl.com/ None https://wrong.host.badssl.com/ RemoteCertificateNameMismatch 因为我认为它是正确的。

1 个答案:

答案 0 :(得分:1)

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