从 .NET 10 开始,接受字符串编码的可分辨名称的 X500DistinguishedName 构造函数可能会拒绝以前接受的无效输入或在非 Windows 系统上以不同的方式对其进行编码。 这与编码规范和 Windows 行为保持一致。
以前的行为
非 Windows 系统上早期版本的 .NET 允许不正确的可分辨名称或以 X.520 编码规则不允许的方式对其进行编码。 X500DistinguishedNameFlags.ForceUTF8Encoding 标志强制组件使用 UTF8String,即使它不是有效的表示形式。
新行为
从 .NET 10 开始,违反编码规则的组件会在非 Windows 系统上引发 CryptographicException,从而匹配 Windows 行为。 在允许的情况下,X500DistinguishedNameFlags.ForceUTF8Encoding 标志仅对组件进行 UTF-8 编码。
引入的版本
.NET 10 预览版 1
中断性变更的类型
此更改为行为更改。
更改原因
不同的 X.500 组件具有特定的编码规则。 例如,id-at-telephoneNumber 必须编码为 ASN.1 PrintableString。 PrintableString 的感叹号字符无效。 请考虑以下代码:
new X500DistinguishedName("Phone=!!");
此代码在 Windows 上引发异常,但在非 Windows 上编码为 UTF8String。 类似地,即便是不允许的情况下,也使用 X500DistinguishedNameFlags.ForceUTF8Encoding 强制进行 UTF8String 编码:
new X500DistinguishedName("Phone=000-555-1234", X500DistinguishedNameFlags.ForceUTF8Encoding);
此更改可确保编码与规范和 Windows 行为保持一致。
建议的操作
通常,除非需要与不正确的编码兼容,否则不需要执行任何操作。 使用 System.Security.Cryptography.X509Certificates.X500DistinguishedNameBuilder 创建具有所需编码的实例:
using System.Formats.Asn1;
using System.Security.Cryptography.X509Certificates;
X500DistinguishedNameBuilder builder = new();
builder.Add("2.5.4.20", "000-555-1234", UniversalTagNumber.UTF8String);
X500DistinguishedName dn = builder.Build();