我正在努力减轻我们对Poodle SSL 3.0 Fallback攻击的漏洞.我们的管理员已经开始禁用SSL,转而使用TLS进行服务器的入站连接.我们还建议我们的团队在其Web浏览器中禁用SSL.我现在正在查看我们的.NET代码库,它通过System.Net.HttpWebRequest启动与各种服务的HTTPS连接.我相信如果这些连接允许从TLS回退到SSL,则它们可能容易受到MITM攻击.这是我到目前为止所确定的.有人可以仔细检查一下以确认我是对的吗?这个漏洞是全新的,所以我还没有看到微软如何在.NET中缓解它的任何指导:
System.Net.Security.SslStream类的允许协议(支持.NET中的安全通信)通过System.Net.ServicePointManager.SecurityProtocol属性为每个AppDomain全局设置.
.NET 4.5中此属性的默认值是Ssl3 | Tls(虽然我找不到支持它的文档.)SecurityProtocolType是带有Flags属性的枚举,因此它是这两个值的按位OR.您可以使用以下代码行在您的环境中进行检查:
Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol.ToString());
在应用程序中启动任何连接之前Tls,应该将其更改为正好或者可能Tls12:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls;
重要提示:由于该属性支持多个按位标志,因此我假设SslStream 在握手期间不会自动回退到其他未指定的协议.否则,支持多个标志会有什么意义?
TLS 1.0与1.1/1.2的更新:
根据Google安全专家Adam Langley的说法,如果没有正确实施,TLS 1.0后来被发现容易受到POODLE的影响,因此您应该考虑专门转移到TLS 1.2.
我遇到了一个问题,试图返回一个包含子对象集合的对象,这些对象又可以容纳一组孙对象.我收到一个错误,'连接被主机强行关闭'.
有没有办法让这项工作?我目前的结构类似于:
伪代码:
Person:
IEnumerable<Order>
Order:
IEnumerable<OrderLine>
Run Code Online (Sandbox Code Playgroud)
所有三个对象都具有DataContract属性,我想要公开的所有公共属性(包括IEnumerable)都具有DataMember属性.
我的服务上有多个OperationContract,所有返回单个对象的方法或对象的IEnumerable都可以正常工作.只有当我尝试嵌套IEnumerable时才会变坏.同样在我的客户服务参考中,我选择了通用列表作为我的集合类型.我只想强调一下,只有我的一个操作/方法因此错误而失败 - 其余的操作完美无缺.
编辑(更详细的错误描述):
[SocketException (0x2746): An existing connection was forcibly closed by
the remote host]
[IOException: Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.]
[WebException: The underlying connection was closed: An unexpected
error occurred on a receive.]
[CommunicationException: An error occurred while receiving the HTTP
response to http://myservice.mydomain.dk/MyService.svc. This could
be due to the service endpoint binding …Run Code Online (Sandbox Code Playgroud) 我目前有一个使用.NET 3.5框架的Web应用程序,我想知道它是否与TLS 1.2兼容.我们的代码中没有在哪里指示TLS版本.这是一个遗留应用程序,并且重新编译现在不在桌面上.我没有找到关于您是否可以获得的信息,但我认为兼容性更依赖于操作系统版本.看起来最小值是2008 R2.目标是让paypal在7月1日正确沟通.
这似乎是一个常见错误(还有其他具有类似问题的帖子) - 但是,我已经浏览了所有这些帖子和 MSDN 文章(https://docs.microsoft.com/en-us/dotnet/framework/wcf/功能详细信息/使用证书)。场景:尝试访问具有 HTTPS 端点的服务。在代码中设置客户端证书(证书加载正确)。至于服务器证书,我尝试了以下两个选项:client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
我已将服务器证书导入到个人和机器存储(受信任的根证书颁发机构/证书)。奇怪的是,当我使用 Charles Proxy 作为 SSL 代理时,调用正在进行。其他设置:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) =>
{
//Console.WriteLine(cert.GetCertHashString());
if (cert.GetCertHashString() == "[actual hash here]")
return true;
else
return false;
};
Run Code Online (Sandbox Code Playgroud)
当 Charles 代理运行时,上述哈希检查工作正常。没有代理运行,回调甚至不会被调用。
任何反馈表示赞赏。
(可能值得注意的是,使用 Apache CXF 库的 Java 客户端可以正常工作 - 针对相同的服务。)
更新:为完整起见,原始错误也包含以下文本:这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。