限制除 TLS 1.2 服务器端 WCF 之外的任何内容
Posted
技术标签:
【中文标题】限制除 TLS 1.2 服务器端 WCF 之外的任何内容【英文标题】:Restrict anything but TLS 1.2 serverside WCF 【发布时间】:2017-08-17 10:58:29 【问题描述】:我有一个简单的问题,但在任何地方都找不到答案。 我有一个 WCF 服务器应用程序。我希望它只使用 TLS1.2。
我无法控制客户端,也无法在机器上编辑 SCHANNEL 设置。
我已经尝试了以下似乎仅适用于传出连接(客户端)的方法
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
除了每个代码的 TLS 1.2 服务器端之外,还有什么方法可以限制任何东西?
编辑: 我正在使用 net.tcp 绑定并创建这样的绑定:
private static Binding CreateNetTcpBinding()
return new NetTcpBinding
ReceiveTimeout = TimeSpan.FromMinutes(10),
ReliableSession =
Enabled = true,
InactivityTimeout = TimeSpan.FromMinutes(1)
,
Security =
Mode = SecurityMode.Transport,
Transport =
ClientCredentialType = TcpClientCredentialType.Windows,
ProtectionLevel = ProtectionLevel.EncryptAndSign,
SslProtocols = SslProtocols.Tls12
,
Message =
AlgorithmSuite = SecurityAlgorithmSuite.xxx <-- not here on purpose,
ClientCredentialType = MessageCredentialType.Windows
;
如果有人能告诉我在哪里检查当前连接的 TLS 版本(某些上下文),那就足够了!
提前谢谢你!
【问题讨论】:
好久没有发现一个很好的 WCF 问题了! 您的问题似乎已在 .NET Framework 4.7 中得到解决 - 能够将默认邮件安全设置配置为 TLS 1.1 或 TLS 1.2 【参考方案1】:在SecurityProtocol
旁边的ServicePointManager中确实有几个属性是在认证步骤中检查的,但都是internal
。似乎也没有可见的后门来覆盖 SslStream
或 TcpTransportSecurity
的整个实现,它们正在实现 NetTcpBinding
的传输安全框架。
public partial class ServicePointManager
...
internal static bool DisableStrongCrypto
internal static bool DisableSystemDefaultTlsVersions
internal static SslProtocols DefaultSslProtocols
...
如果您拥有服务器机器注册表的写入权限,请查看@JohnLouros 一年前在how to disable weak protocols 和how to enable strong cryptography 上的帖子中很好地描述的内容。
这是来自@MattSmith 的另一个很好的answer,描述了操作系统本身如何在后台处理NetTcpBinding
的身份验证。
【讨论】:
嗯...所以似乎不可能像我在客户端上通过设置枚举值那样做一些事情。老实说,我当时对.NET 框架感到失望。也许这也是我没有理解正确的事情。 这就是为什么我认为开放其代码供社区贡献是很有意义的。您应该能够将此情况报告给团队,甚至可以将其提取出来并自己进行所需的更改。【参考方案2】:您是否尝试使用 ServicePointManager.ServerCertificateValidationCallback。此回调使您有机会自己验证服务器证书。例如:
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...
static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
//Your logic here for certificate validation
【讨论】:
它没有命中这个方法。可能是因为我使用的是 net.tcp 绑定而不是 https? 示例中没有使用显式证书以上是关于限制除 TLS 1.2 服务器端 WCF 之外的任何内容的主要内容,如果未能解决你的问题,请参考以下文章
在 WCF 和 .NET 4.0 中使用 TLS 1.1 或 1.2?
.NET 4.5.1 中的 WCF 客户端:使用 WebRequest 时如何启用 TLS 1.2?
带有 TransferMode.Streamed 的 WCF NetTcpBinding 在 WCF 绑定上使用 TLS 1.2 和 SslProtocols.None 的 Windows Serve
如何使 Windows 商店应用程序与 TLS 1.2 一起使用?