SYSLIB0057:二进制和文件内容的 X509Certificate2 和 X509Certificate 构造函数已过时

从 .NET 9 开始,X509CertificateX509Certificate2 上接受内容为 byte[]ReadOnlySpan<byte>string 文件路径的构造函数已过时。 X509Certificate2Collection 上的 Import 方法也已过时。 在代码中调用这些方法会在编译时生成警告 SYSLIB0057

过时的原因

受影响的 API 支持加载多种格式的证书。 例如,new X509Certificate2(data) 从名为 databyte[] 加载证书。 data 可以是任何一种受支持的格式,包括 X.509、PKCS7 或 PKCS12/PFX。

虽然此方法易于使用,但当用户提供的数据以不同于预期的格式传递时,就会产生问题。 这可能会导致在只打算加载 X.509 内容的情况下加载 PKCS12。 或者,以不同的方式处理数据可能会产生互操作性问题。

解决方法

使用不同的 API 加载证书内容,具体取决于预期的内容类型。

名为 X509CertificateLoader 的新类可用于加载 X.509 或 PKCS12 内容:

  • 如果要加载 X.509 内容,请使用 X509CertificateLoader.LoadCertificateX509CertificateLoader.LoadCertificateFromFile
  • 如果要加载 PKCS12 内容,请使用 X509CertificateLoader.LoadPkcs12X509CertificateLoader.LoadPkcs12FromFileX509CertificateLoader.LoadPkcs12CollectionX509CertificateLoader.LoadPkcs12CollectionFromFile
  • 如果要加载 PKCS7 内容,请使用 System.Security.Cryptography.Pkcs 包中的 SignedCms 检查 PKCS7 内容中的证书。
  • 如果不确定你在加载的内容类型,请使用 GetCertContentType 来确定内容类型并调用相应的 API。

Microsoft.Bcl.Cryptography 包为 .NET Framework 和 .NET Standard 提供 X509CertificateLoader

抑制警告

如果必须使用已过时的 API,可在代码或项目文件中禁止显示警告。

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

// Disable the warning.
#pragma warning disable SYSLIB0057

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0057

若要禁止显示项目中的所有 SYSLIB0057 警告,请将属性 <NoWarn> 添加到项目文件。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0057</NoWarn>
  </PropertyGroup>
</Project>

有关详细信息,请参阅取消警告