我已经阅读了大量与此问题相关的文档,但我仍然无法将所有内容整合在一起,所以我想问几个问题.
首先,我将简要描述一下我理解的身份验证过程,因为我在这方面可能会弄错:客户端启动连接,服务器使用公钥,某些元数据和数字签名来响应信任的权威.然后客户端决定是否信任服务器,使用公钥加密一些随机会话密钥并将其发回.该会话密钥只能用存储在服务器上的私钥解密.服务器执行此操作,然后HTTPS会话开始.
那么,如果我在上面是正确的,问题是如何在这种情况下发生中间人攻击?我的意思是,即使有人用公钥拦截服务器(例如www.server.com)的响应并且有一些方法让我认为他是www.server.com,他仍然无法解密我的会话密钥没有私钥.
谈到相互认证,是关于服务器对客户身份的信心吗?我的意思是,客户端已经可以确定她正在与正确的服务器进行通信,但现在服务器想要找出客户端是谁,对吧?
最后一个问题是关于相互认证的替代方案.如果我在所描述的情况下充当客户端,如果在SSL会话建立后在HTTP头中发送登录名/密码怎么办?正如我所看到的,这些信息无法被截获,因为连接已经被保护,服务器可以依赖它进行识别.我错了吗?与相互身份验证相比,这种方法有哪些缺点(只有安全问题很重要,而不是实现复杂性)?
运行以下代码,我得到一个例外:
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) …Run Code Online (Sandbox Code Playgroud) 这似乎是一个常见的错误,但是当我找到一个解决方法(见下文)时,我无法确定我首先得到它的原因.
我正在将SMTP功能写入我们的应用程序,并且我正在尝试将SSL功能添加到我们已有的工作SMTP中.
我正在测试使用我们公司的MS Exchange服务器,特别是在其上启用的webmail选项.我可以通过我的代码在内部发送电子邮件,不通过身份验证我的连接并匿名发送,但是由于我们公司的政策,这些电子邮件不会转发到外部电子邮件地址.除此之外,我正在为我们的客户编程,他们并不都允许开放中继和/或匿名连接.
我相信Exchange服务器正在使用显式SSL/TLS.我已经尝试telnet到端口25上的服务器地址并获得文本响应,人类可读的响应,根据我以前的一些搜索意味着它使用显式SSL/TLS.
我有以下测试代码
SmtpClient SMTPClient = new SmtpClient(webmailaddress);
SMTPClient.Port = 25;
SMTPClient.UseDefaultCredentials = true;
SMTPClient.EnableSsl = true;
System.Net.Mail.MailMessage Message = new `
System.Net.Mail.MailMessage(emailFrom,emailTo,subject,body);
SMTPClient.Send(Message);
Run Code Online (Sandbox Code Playgroud)
在我搜索解决方案期间,我遇到了"远程证书根据验证程序无效".使用Gmail SMTP服务器
从中我得到以下代码......
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
else
{
if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
return true;
else
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于我的测试代码.然而,我正在编写的实际过程(而不是我的测试代码)将在后台运行,并且无法真正询问用户(而是报告Windows错误日志中的错误).
在我开始时,我的问题就是为什么我会收到这个错误.如果我在浏览器中访问https:webmail.ourdomain.co.uk,它会显示一个有效的证书,并且没有安装证书的选项(正如我自己签署的那样).
然而,当我运行我的代码,并在ValidateServerCertificate方法调试中断Poing的,我看证书的价值观和看到我们的本地服务器的发行人"之前没有使用",且性能"后,不使用"今天.这与我得到的证书不符.
我还检查了ValidateServerCertificate调试中的sslPolicyErrors标志,它们显示"RemoteCertificateChainErrors"和"RemoteCertificateNameMismatch".
那么我对此缺少什么...为什么它没有使用正确的证书?如果我需要在本地安装证书才能使用它,那么我需要了解它们,这样我就可以告诉客户如果他们得到了这个,该怎么做.
我不想通过从ValidateServerCertificate方法返回true来绕过检查,并且因为它是后台进程我不能问用户,所以我需要了解如何让我的代码使用正确/可信证书.
希望有人可以提供建议.
我正在开发一个WCF服务(NetTcpBinding),它没有安全性就可以正常工作.我们从DigiCert购买了证书并将其安装在服务器上并使用DigicertUtil.exe进行配置.也安装在测试客户端机器上.
打开安全性我可以从我的开发PC连接到它没有问题.
服务器配置:
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
ServerHost.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
Properties.Settings.Default.CertificateName);
Run Code Online (Sandbox Code Playgroud)
客户端配置:
<binding name="EndPointTCP" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="1610612736"
maxReceivedMessageSize="1610612736">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="false" inactivityTimeout="00:10:00" enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign"/>
</security>
</binding>
<behaviors>
<endpointBehaviors>
<behavior name="behavior_ServerService">
<clientCredentials>
<clientCertificate findValue="*.domain.com"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="net.tcp://clients.domain.com:10001/Server/ServerService"
binding="netTcpBinding" bindingConfiguration="EndPointTCP" contract="ServerServiceReference.IServerWS"
name="EndPointTCP" behaviorConfiguration="behavior_ServerService">
<identity>
<dns value="*.domain.com" />
</identity>
</endpoint>
</client>
Run Code Online (Sandbox Code Playgroud)
(我修改了域名和服务名称以保护客户的隐私.)
从任何其他计算机尝试它我在客户端上收到以下错误:
套接字连接已中止.这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的.本地套接字超时为'00:00:59.9840000'. …
无法通过证书验证解决问题.
有Web API服务器,它使用HTTPS来处理请求.服务器的证书具有以下认证路径:RCA(root) - > ICA(中间) - > Web API服务器.RCA,ICA和Web API服务器是同一Active Directory域的成员.
客户端应用程序(桌面,计算机加入同一域)用于HttpClient与服务器通信并支持两种方案:
两种方案都使用基本身份验
RCA和ICA证书分别放在"受信任的根证书颁发机构"和"中间证书颁发机构"中,用于本地计算机帐户.RCA证书是自签名的.
现在,当客户端连接到公司网络时,证书验证按预期工作,用户可以与Web API"对话".
当客户端断开连接(只有Internet连接可用)时,证书验证失败AuthenticationException("远程证书根据验证过程无效").
我不想完全关闭证书验证,但只需要告诉验证系统,这个特定证书是有效的.此外,客户端应用程序使用SignalR,它默认使用它自己的传输.因此,这和这不是选项.
为什么将RCA ICA证书放到"Trusted ..."和"Intermediate ..."文件夹中没有帮助?
有没有解决方法?
我在本地计算机上通过http/https托管服务.当我通过http使用服务时,它工作得很好.当我在ajax上发出https请求时,它也有效.但是,当我尝试从客户端应用程序后面的代码中使用它时,它不起作用.它显示如下错误消息:
"The remote certificate is invalid according to the validation procedure"
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
我在生产环境中收到的错误:
根据验证程序,远程证书无效。
[AuthenticationException: 根据验证程序,远程证书无效。] System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception) +2755308
System.Net.Security.SslState.StartSendBlob(Byte[] coming) , Int32 计数, AsyncProtocolRequest asyncRequest) +470
生产环境采用三层架构,Web 与 App 对话,App 与数据库对话。Web 和应用程序使用 WCF 服务层通过 SSL (443) 进行通信。我们认为这可能是 IIS7 中的 SSL 证书中的配置或 WCF 配置问题。
我们尝试了什么:我将 App 和 Web 中的证书添加到“本地计算机”和“当前用户”的受信任机构中。
如果需要,我可以添加我的 WCF Web 配置。
我尝试了以下建议:
https://msdn.microsoft.com/en-us/library/ms734695.aspx
“根据验证程序,远程证书无效。” 使用 Gmail SMTP 服务器
https://msdn.microsoft.com/en-us/library/ms733813(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/hh556232%28v=vs.110%29.aspx
我正在尝试设置一个电子邮件 PowerShell 脚本,它可以让我在任务调度程序运行脚本时发送电子邮件。我遇到的问题是:
Exception calling "Send" with "1" argument(s): "The remote certificate is invalid according to the validation procedure."
Run Code Online (Sandbox Code Playgroud)
我正在运行以下代码:
$SMTPClient = New-Object Net.Mail.SmtpClient("SMTP", PORT)
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$MailMessage = (New-Object system.net.mail.mailmessage)
$MailMessage.from = ("FROM")
$MailMessage.To.Add("TO")
$MailMessage.Subject = ("Subject")
$MailMessage.Body = ("Body")
$Smtpclient.EnableSsl = ($true)
$SmtpClient.Timeout = (300000)
$SmtpClient.Send($MailMessage)
Write-Output "Message sent";
Run Code Online (Sandbox Code Playgroud)
它给了我上面指定的错误。我在 Windows Server 2012 R2 上运行此代码,此代码在普通 Windows 10、8 和 7 上运行,但不适用于服务器。请有人可以给我一个快速简便的解决方案。在这个开发阶段,安全性确实不是问题,因此欢迎任何解决方案。谢谢
每次我尝试通过 VS2015 和 IIS Express 在我的开发盒上运行我的 MVC 项目时,我都会收到一个错误。它使用此代码对我们的 ADFS 服务器进行身份验证。
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
Run Code Online (Sandbox Code Playgroud)
这是我在浏览器中遇到的错误。
[AuthenticationException: 根据验证程序,远程证书无效。]
System.Net.TlsStream.EndWrite(IAsyncResult asyncResult) +231
System.Net.PooledStream.EndWrite(IAsyncResult asyncResult) +15
System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult) ar) +119[WebException: 底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。]
System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) +606 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) + 64[HttpRequestException: 发送请求时发生错误。]
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter` 1.GetResult() +28 Microsoft.IdentityModel.Protocols.d__0.MoveNext() +453[IOException:无法从以下位置获取文档:https://adfs.DOMAIN.com/FederationMetadata/2007-06/FederationMetadata.xml] Microsoft.IdentityModel.Protocols.d__0.MoveNext() +830 System.Runtime.CompilerServices.TaskAwaiter。 ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() +28 Microsoft.IdentityModel.Protocols.<GetAsync>d__1.MoveNext() +606 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) …
标题几乎都说明了.有没有办法在不使用发送网格的情况下将电子邮件确认添加到我的应用程序?我的Azure帐户不允许我使用它,说它在我的区域中不可用,我似乎无法找到另一种解决方案.
我需要告诉我的C#soap web服务使用者不验证证书并接受它.这可能吗?
原因:我们发布了仅支持https的Web服务.客户端需要使用它但是有某种防火墙/代理(WebSense?),它会对证书执行某些操作以使其无法通过验证.在这一点上,我甚至不知道的细节是什么这样做,但顾客似乎是确定与丧失SSL的好处,所以我在寻找一个解决办法.
现在,这个问题在 Stack Overflow 中有多个版本,就像这个最受关注的问题一样,其中大多数答案都建议用户关闭 SSL 作为绕过代码的方法。
我在尝试发送电子邮件时遇到了同样的异常。
System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效。
这是我的代码
private void sendAMail(String toAddress, String messageBody)
{
String msg = "Sending mail to : " + toAddress;
MailMessage mail = new MailMessage();
mail.To.Add(toAddress);
mail.From = new MailAddress("from@mydomain.com");
mail.Subject = "Subject: Test Mail";
mail.Body = messageBody;
mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "myhostname.com";
smtp.Credentials = new System.Net.NetworkCredential("sender@sample.com", "");
smtp.EnableSsl = true;
smtp.Port = 587;
smtp.Send(mail);
}
Run Code Online (Sandbox Code Playgroud)
在尝试了几件事的同时,最后我尝试从服务器打印 SSL 证书,如此处所述。打印 SSL 证书
然后,异常就消失了。!!!我不明白为什么。
这是有效的代码
private void …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用具有自签名证书的本地 Web 服务器上的 REST API。在运行时,应用程序抛出错误
AuthenticationException:根据验证过程,远程证书无效。
我已尝试在此答案中进行修复: https: //stackoverflow.com/a/1386568/8980983,但错误仍然存在。代码如下:
static void Main(string[] args)
{
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Clear();
ServicePointManager.ServerCertificateValidationCallback = delegate (
object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
};
var loginPage = httpClient.GetAsync("https://<local IP address>/loginpage.html").GetAwaiter().GetResult();
//do stuff with response...
}
Run Code Online (Sandbox Code Playgroud)
我可以采取哪些措施来有效忽略 SSL 策略错误?
c# ×7
ssl ×6
wcf ×3
.net ×2
asp.net ×2
adfs3.0 ×1
asp.net-mvc ×1
certificate ×1
email ×1
events ×1
iis-7 ×1
owin ×1
pop3 ×1
powershell ×1
procedure ×1
security ×1
server ×1
smtp ×1
smtpclient ×1
soap ×1
validation ×1
web-services ×1
windows ×1