SYSLIB0057:二进制和文件内容的 X509Certificate2 和 X509Certificate 构造函数已过时
从 .NET 9 开始,X509Certificate 和 X509Certificate2 上接受内容为 byte[]
、ReadOnlySpan<byte>
或 string
文件路径的构造函数已过时。 X509Certificate2Collection 上的 Import 方法也已过时。 在代码中调用这些方法会在编译时生成警告 SYSLIB0057
。
过时的原因
受影响的 API 支持加载多种格式的证书。 例如,new X509Certificate2(data)
从名为 data
的 byte[]
加载证书。 data
可以是任何一种受支持的格式,包括 X.509、PKCS7 或 PKCS12/PFX。
虽然此方法易于使用,但当用户提供的数据以不同于预期的格式传递时,就会产生问题。 这可能会导致在只打算加载 X.509 内容的情况下加载 PKCS12。 或者,以不同的方式处理数据可能会产生互操作性问题。
解决方法
使用不同的 API 加载证书内容,具体取决于预期的内容类型。
名为 X509CertificateLoader
的新类可用于加载 X.509 或 PKCS12 内容:
- 如果要加载 X.509 内容,请使用
X509CertificateLoader.LoadCertificate
或X509CertificateLoader.LoadCertificateFromFile
。 - 如果要加载 PKCS12 内容,请使用
X509CertificateLoader.LoadPkcs12
、X509CertificateLoader.LoadPkcs12FromFile
、X509CertificateLoader.LoadPkcs12Collection
或X509CertificateLoader.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>
有关详细信息,请参阅取消警告。