CA5361:不禁用 SChannel 使用强加密

属性
规则 ID CA5361
标题 不禁用 SChannel 使用强加密
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

AppContext.SetSwitch 方法调用将 Switch.System.Net.DontEnableSchUseStrongCrypto 设置为 true

默认情况下,此规则会分析整个代码库,但这是可配置的。

规则说明

Switch.System.Net.DontEnableSchUseStrongCrypto 设置为 true,从而降低传出传输层安全性连接中使用的加密性。 较弱的加密性会泄露应用程序与服务器之间通信的机密性,使攻击者更易于窃听敏感数据。 有关详细信息,请参阅 .NET Framework 中的传输层安全性 (TLS) 最佳做法

如何解决冲突

  • 如果应用程序面向 .NET Framework v4.6 或更高版本,则可以删除 AppContext.SetSwitch 方法调用,或将开关的值设置为 false
  • 如果应用程序面向 .NET Framework 早于 v4.6 的版本,并在 .NET Framework v4.6 或更高版本上运行,则将开关的值设置为 false
  • 否则,请参阅 .NET Framework 中的传输层安全性 (TLS) 最佳做法来缓解问题。

何时禁止显示警告

如需连接到无法升级为使用安全 TLS 配置的旧服务,可以禁止显示此警告。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA5361
// The code that's violating the rule is on this line.
#pragma warning restore CA5361

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA5361.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(安全性)中的所有规则配置这些选项。 有关详细信息,请参阅代码质量规则配置选项

排除特定符号

可以从分析中排除特定符号,如类型和方法。 例如,若要指定规则不应针对名为 MyType 的类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

选项值中允许的符号名称格式(用 | 分隔):

  • 仅符号名称(包括具有相应名称的所有符号,不考虑包含的类型或命名空间)。
  • 完全限定的名称,使用符号的文档 ID 格式。 每个符号名称都需要带有一个符号类型前缀,例如表示方法的 M:、表示类型的 T:,以及表示命名空间的 N:
  • .ctor 表示构造函数,.cctor 表示静态构造函数。

示例:

选项值 总结
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType 匹配名为 MyType 的所有符号。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 匹配名为 MyType1MyType2 的所有符号。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 匹配带有指定的完全限定签名的特定方法 MyMethod
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) 匹配带有各自的完全限定签名的特定方法 MyMethod1MyMethod2

排除特定类型及其派生类型

可以从分析中排除特定类型及其派生类型。 例如,若要指定规则不应针对名为 MyType 的类型及其派生类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

选项值中允许的符号名称格式(用 | 分隔):

  • 仅类型名称(包括具有相应名称的所有类型,不考虑包含的类型或命名空间)。
  • 完全限定的名称,使用符号的文档 ID 格式,前缀为 T:(可选)。

示例:

选项值 总结
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType 匹配名为 MyType 的所有类型及其所有派生类型。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 匹配名为 MyType1MyType2 的所有类型及其所有派生类型。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 匹配带有给定的完全限定名称的特定类型 MyType 及其所有派生类型。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 匹配带有各自的完全限定名称的特定类型 MyType1MyType2 及其所有派生类型。

伪代码示例

冲突

using System;

public class ExampleClass
{
    public void ExampleMethod()
    {
        // CA5361 violation
        AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", true);
    }
}
Imports System

Public Class ExampleClass
    Public Sub ExampleMethod()
        ' CA5361 violation
        AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", true)
    End Sub
End Class

解决方案

using System;

public class ExampleClass
{
    public void ExampleMethod()
    {
        AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", false);
    }
}
Imports System

Public Class ExampleClass
    Public Sub ExampleMethod()
        AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", false)
    End Sub
End Class