限制除 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。似乎也没有可见的后门来覆盖 SslStreamTcpTransportSecurity 的整个实现,它们正在实现 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 一起使用?

Azure 应用服务:如何限制除一个 IP 地址之外的所有内容

如何限制 WCF 服务的请求执行时间?