次の方法で共有


X500DistinguishedName の検証がより厳密である

.NET 10 以降では、文字列でエンコードされた識別名を受け入れる X500DistinguishedName コンストラクターは、以前に受け入れられていた無効な入力を拒否したり、Windows 以外のシステムで異なる方法でエンコードしたりする可能性があります。 これは、エンコード仕様と Windows の動作に合わせて調整されます。

以前の動作

Windows 以外のシステムの以前のバージョンの .NET では、正しくない識別名が許可されていたり、X.520 エンコード規則で許可されていない方法でエンコードされたりしていました。 X500DistinguishedNameFlags.ForceUTF8Encoding フラグを設定すると、有効な表現ではない場合でも、コンポーネントで UTF8String が強制的に使用されます。

新しい動作

.NET 10 以降では、エンコード規則に違反するコンポーネントは、Windows 以外のシステムで Windows の動作と一致する CryptographicException をスローします。 X500DistinguishedNameFlags.ForceUTF8Encoding フラグは、許容される場合は UTF-8 でのみコンポーネントをエンコードします。

導入されたバージョン

.NET 10 Preview 1

破壊的変更の種類

この変更は、動作変更です。

変更の理由

X.500 コンポーネントが異なると、特定のエンコード規則があります。 たとえば、id-at-telephoneNumber は ASN.1 PrintableStringとしてエンコードする必要があります。 PrintableString の感嘆符文字が無効です。 次のコードについて考えてみましょう。

new X500DistinguishedName("Phone=!!");

このコードは、Windows では例外が発生しましたが、Windows 以外の環境では UTF8 文字列としてエンコードされました。 同様に、許可されていない場合でも、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