为什么我每次都遇到RemoteCertificateNameMismatch?

时间:2014-07-28 18:17:05

标签: c# ssl x509certificate

考虑以下完整计划:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace RemoteCertNameMismatchDiagnosis
{
class Program
{
    private static bool AcceptAllCertificates(object sender, X509Certificate certificate,
                                                                                        X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        Console.WriteLine(sslPolicyErrors.ToString());
        return true;
    }

    static void Main(string[] args)
    {
        TcpClient client;
        SslStream sslStream;

        bool acceptAnyCert = false;

        client = new TcpClient("google.com", 443);
        if (acceptAnyCert)
            sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(AcceptAllCertificates), null);
        else
            sslStream = new SslStream(client.GetStream(), false);

        try
        {
            sslStream.AuthenticateAsClient("test client");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        Console.ReadLine();
    }
  }
}

报告此异常

  

System.Security.Authentication.AuthenticationException:远程   证书根据验证程序无效。

每一次。通过在第26行将acceptAnyCert更改为true,我可以将其输出

  

RemoteCertificateNameMismatch

,让我相信它对证书上的名字不满意。

无论我指向google.com,amazon.com还是第28行的其他任何地方,此行为都会持续存在。我不认为google,microsoft和amazon都有缺陷证书。我做错了什么?

2 个答案:

答案 0 :(得分:9)

您需要将"google.com"传递给AuthenticateAsClient - 它需要将服务器名称作为参数,而不是您的客户名称。

答案 1 :(得分:0)

刚刚在这里更新我的经验,最近,我在启用SSL的SMTP通信中遇到了同样的问题。问题是 - 我的客户端证书名称与服务器证书不匹配,并且在将我的客户端证书名称更改为服务器证书后修复了问题。

此致

阿都