Linux AIA 憑證擷取限制為每次鏈建置兩次擷取次數

在 Linux 及其他基於 OpenSSL 的平台上,透過權威資訊存取(AIA)建立憑證鏈,現在每次鏈建置限制為兩次 AIA 擷取次數。 此限制使 Linux 行為與 Windows 保持一致,Windows 一直有兩次取取限制。

所推出的版本

.NET 11 預覽版 7

以前的行為

過去,在基於 OpenSSL 的平台上, X509Chain.Build(X509Certificate2) 會執行 AIA 擷取以下載中間憑證,直到完成整個鏈條。 例如,一條需要透過AIA下載三張中間憑證的鏈條可能成功:

using var cert = X509Certificate2.CreateFromPem(leafCertificateWithThreeAiaHops);
using var chain = new X509Chain();

// On Linux with .NET 10 and earlier, this could succeed even when three or more
// intermediate certificates needed to be downloaded via AIA.
bool result = chain.Build(cert);
Console.WriteLine(result); // Could print True with 3+ AIA fetches

新行為

從 .NET 11 開始,在基於 OpenSSL 的平台上,X509Chain.Build(X509Certificate2)每次鏈建化最多執行兩次 AIA 擷取,與 Windows 的行為相符。 若鏈需透過 AIA 下載超過兩個中間檔,則鏈建構無法僅靠 AIA 下載成功:

using var cert = X509Certificate2.CreateFromPem(leafCertificateWithThreeAiaHops);
using var chain = new X509Chain();

// On Linux with .NET 11+, if three or more AIA fetches are required,
// the build fails.
bool result = chain.Build(cert);
Console.WriteLine(result); // Prints False if more than two AIA fetches are needed.

破壞性變更的類型

此變更為行為變更。

變更原因

Windows 一直限制每次鏈建置 AIA 取取次數最多為兩次,而 Linux 實作則沒有此限制,導致跨平台間產生不一致。 Linux 上的相同限制使跨平台行為保持一致,並更好地限制建立憑證鏈所需的網路與記憶體資源。 更多資訊請參見 dotnet/runtime#130456。

如果您的應用程式在 Linux 上建立憑證鏈,需要透過 AIA 取得超過兩個中間憑證,請直接提供中間憑證,而非依賴 AIA 下載:

using var cert = X509Certificate2.CreateFromPem(leafCertPem);
using var intermediate1 = X509Certificate2.CreateFromPem(intermediate1Pem);
using var intermediate2 = X509Certificate2.CreateFromPem(intermediate2Pem);
using var intermediate3 = X509Certificate2.CreateFromPem(intermediate3Pem);

using var chain = new X509Chain();
chain.ChainPolicy.ExtraStore.Add(intermediate1);
chain.ChainPolicy.ExtraStore.Add(intermediate2);
chain.ChainPolicy.ExtraStore.Add(intermediate3);
// other ChainPolicy settings as appropriate

bool result = chain.Build(cert);

或者,將中間憑證安裝在使用者或系統的中間憑證儲存庫,讓所有鏈都能取得,無需 AIA 下載。

受影響的 API