Поделиться через


Проверка X500DistinguishedName является более строгой

Начиная с .NET 10 конструктор X500DistinguishedName, который принимает различающееся имя, закодированное строкой, может отклонить ранее принятые недопустимые входные данные или кодировать его по-разному в системах, отличных от Windows. Это соответствует спецификациям кодирования и поведению Windows.

Предыдущее поведение

Предыдущие версии .NET на системах, отличных от Windows, допускали неправильные уникальные имена или кодировали их таким образом, который не разрешается правилами кодирования X.520. Флаг X500DistinguishedNameFlags.ForceUTF8Encoding принуждает компоненты использовать UTF8String, даже если он не является допустимым представлением.

Новое поведение

Начиная с .NET 10 компоненты, которые нарушают правила кодирования, вызывают CryptographicException в системах, отличных от Windows, в соответствии с поведением Windows. Флаг X500DistinguishedNameFlags.ForceUTF8Encoding кодирует только компоненты UTF-8, если это допустимо.

Представленная версия

.NET 10 (предварительная версия 1)

Тип изменения, нарушающего совместимость

Это изменение поведения.

Причина изменения

Разные компоненты X.500 имеют определенные правила кодирования. Например, id-at-telephoneNumber необходимо закодировать как ASN.1 PrintableString. Символ восклицательного знака недопустим для PrintableString. Рассмотрим следующий код:

new X500DistinguishedName("Phone=!!");

Этот код вызвал исключение в Windows, но был закодирован как UTF8String в системах, отличных от Windows. Аналогично, 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();

Затронутые API