Compartir vía


La validación de X500DistinguishedName es más estricta

A partir de .NET 10, el constructor de X500DistinguishedName que acepta un nombre distintivo con codificación de cadena podría rechazar la entrada no válida anteriormente aceptada o codificarla de forma diferente en sistemas que no son windows. Esto se alinea con las especificaciones de codificación y el comportamiento de Windows.

Comportamiento anterior

Las versiones anteriores de .NET en sistemas que no son de Windows permitían nombres distintivos incorrectos o los codificaban de forma no permitida por las reglas de codificación X.520. La bandera X500DistinguishedNameFlags.ForceUTF8Encoding obligaba a los componentes a usar una cadena UTF8, aunque no fuera una representación válida.

Nuevo comportamiento

A partir de .NET 10, los componentes que infringen las reglas de codificación lanzan una excepción CryptographicException en sistemas que no son Windows, coincidiendo con el comportamiento de Windows. La marca X500DistinguishedNameFlags.ForceUTF8Encoding solo codifica los componentes UTF-8 cuando se permite.

Versión introducida

.NET 10 Preview 1

Tipo de cambio disruptivo

Este cambio es un cambio de comportamiento .

Motivo del cambio

Los distintos componentes X.500 tienen reglas de codificación específicas. Por ejemplo, id-at-telephoneNumber debe codificarse como asn.1 PrintableString. El carácter de signo de exclamación no es válido para printableString. Tenga en cuenta el código siguiente:

new X500DistinguishedName("Phone=!!");

Este código produjo una excepción en Windows, pero se codificó como UTF8String en no Windows. Del mismo modo, el uso de X500DistinguishedNameFlags.ForceUTF8Encoding forzaba la codificación UTF8String incluso cuando no estaba permitido:

new X500DistinguishedName("Phone=000-555-1234", X500DistinguishedNameFlags.ForceUTF8Encoding);

Este cambio garantiza que la codificación se alinee con las especificaciones y el comportamiento de Windows.

Por lo general, no se necesita ninguna acción a menos que se requiera compatibilidad con la codificación incorrecta. Use System.Security.Cryptography.X509Certificates.X500DistinguishedNameBuilder para crear instancias con la codificación deseada:

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();

APIs afectadas