考虑以下完整计划:
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都有缺陷证书。我做错了什么?
答案 0 :(得分:9)
您需要将"google.com"
传递给AuthenticateAsClient
- 它需要将服务器名称作为参数,而不是您的客户名称。
答案 1 :(得分:0)
刚刚在这里更新我的经验,最近,我在启用SSL的SMTP通信中遇到了同样的问题。问题是 - 我的客户端证书名称与服务器证书不匹配,并且在将我的客户端证书名称更改为服务器证书后修复了问题。
此致
阿都