根据验证程序,远程证书无效

Ela*_*nda 42 c# ssl pop3

运行以下代码,我得到一个例外:

using (var client = new Pop3Client())
{
    client.Connect(provider.ServerWithoutPort, provider.Port, true);
}
Run Code Online (Sandbox Code Playgroud)

我得到的例外情况:

The remote certificate is invalid according to the validation procedure.


   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost)
   at OpenPop.Pop3.Pop3Client.Connect(String hostname, Int32 port, Boolean useSsl, Int32 receiveTimeout, Int32 sendTimeout, RemoteCertificateValidationCallback certificateValidator)
   at OpenPop.Pop3.Pop3Client.Connect(String hostname, Int32 port, Boolean useSsl)
   at Ugi.Server.Sources.Logic.SourcesService.IsValidPop3Connection(String email, String emailPassword) in C:\Users\elad\Documents\Visual Studio 2010\Projects\SVN\UGI\Ugi\Server\Sources\Logic\SourcesService.cs:line 246
Run Code Online (Sandbox Code Playgroud)

bri*_*010 55

甚至更短版本的Dominic Zukiewicz解决方案:

ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => true;
Run Code Online (Sandbox Code Playgroud)

但这意味着您将信任所有证书.对于不仅在本地运行的服务,需要更聪明的东西.在第一个实例中,您可以使用此代码来测试它是否解决了您的问题.

  • 在这里添加此内容是为了帮助人们,答案已锁定,但如果您使用 HttpClient 和 dotnet core,您将需要执行类似的操作,同样不是一个安全的解决方案,但对于本地开发概念来说很方便;HttpClientHandler 处理程序 = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; _client = new HttpClient(处理程序); (6认同)
  • 在生产中不使用似乎相当明显.但是为了进入发展阶段,这是一个上帝派 (3认同)
  • 请参阅此答案,了解为什么您应该在极少数情况下执行此操作:http://stackoverflow.com/a/6613434/1955317 (2认同)

And*_*bel 52

这通常是因为以下任何一种情况都是如此:

  • 证书是自签名的,不会添加为可信证书.
  • 证书已过期.
  • 证书由未在计算机上安装的根证书签名.
  • 探测撤销列表,但无法找到/使​​用.

尝试获取有关服务器证书的一些信息,并查看是否需要在客户端上安装任何特定证书才能使其正常工作.

  • 继续回到这个问题。根证书,每次。谢谢一堆!:D (2认同)
  • 该死的......再次回到这里,这次没有以上几点:/ (2认同)
  • 不幸的是不是@XYZ,我们最终做了别的事情:/ (2认同)
  • 我收到此错误的原因与证书无关(证书很好),但我在传出请求中使用的端点不正确 (2认同)
  • 现在在“sslPolicyErrors”中遇到“RemoteCertificateNameMismatch”问题。主题名称似乎不匹配,并且替代名称未完全检查(该名称在替代名称中作为主题 IP 地址存在,并且在浏览器中有效)。但可以使用 DNS 名称。这似乎在最新的 .NET 和/或 Windows 中已修复。 (2认同)

Dom*_*icz 23

.NET在连接的另一端看到无效的SSL证书.有一种解决方法,但显然不建议用于生产代码:

// Put this somewhere that is only once - like an initialization method
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateCertificate);
...

static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
   return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到两次提示。连接后和文件上传后一次。这正常吗?我按照您的指示插入了代码。一个在初始化时,一个在我的 FTP 类中。 (2认同)
  • 这种方法还允许您在决定(始终)返回“true”之前检查 X509Certificate 的其他选项 (2认同)

sta*_*low 15

我在测试一个项目时遇到了同样的问题,并且它发现运行Fiddler是导致此错误的原因.!!

如果您使用Fiddler拦截http请求,请将其关闭...

这是导致此类错误的众多原因之一.

要修复Fiddler,您可能需要重置Fiddler Https证书.

  • 我的朋友,你是冠军:)快速而简单地解决了一个潜在的压倒性问题! (2认同)