從 .NET 10 開始,接受字串編碼辨別名稱的 X500DistinguishedName 建構函式可能會拒絕先前接受的無效輸入,或在非 Windows 系統上以不同的方式編碼。 這與編碼規格和 Windows 行為一致。
先前的行為
非 Windows 系統上舊版的 .NET 允許不正確的辨別名稱,或以 X.520 編碼規則不允許的方式編碼。 X500DistinguishedNameFlags.ForceUTF8Encoding 旗標強制元件使用UTF8String,即使它不是有效的表示法也一樣。
新行為
從 .NET 10 開始,違反編碼規則的元件在非 Windows 系統上會丟擲 CryptographicException 錯誤,與 Windows 的行為一致。 當允許時,X500DistinguishedNameFlags.ForceUTF8Encoding 旗標只會對元件進行 UTF-8 編碼。
引進的版本
.NET 10
重大變更的類型
這項變更是 行為改變。
變更的原因
不同的 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();