Downloads de certificados AIA no SslStream do lado do servidor desativados por padrão

A partir do .NET 11, o SslStream não descarrega por padrão os certificados intermédios em falta usando a extensão Authority Information Access (AIA) ao validar certificados de cliente como servidor.

Versão introduzida

.NET 11 Prévia 3

Comportamento anterior

Anteriormente, quando SslStream validava os certificados do cliente como servidor, tentava descarregar certificados intermédios em falta usando a extensão AIA caso o cliente não os fornecesse durante o handshake TLS. Este comportamento ocorria mesmo quando não havia um costume CertificateChainPolicy especificado.

Por exemplo, o seguinte código tentaria descarregar certificados intermédios via AIA se o cliente os omitisse:

var sslStream = new SslStream(networkStream);

await sslStream.AuthenticateAsServerAsync(new SslServerAuthenticationOptions
{
    ServerCertificate = serverCertificate,
    ClientCertificateRequired = true,
    CertificateRevocationCheckMode = X509RevocationMode.Online
});

Novo comportamento

A partir de .NET 11, o SslStream desativa o download de certificados AIA ao operar como servidor que valida certificados de clientes. Se o cliente não fornecer todos os certificados intermédios necessários durante o handshake TLS, o servidor deixa de tentar descarregá-los. O handshake falha com um erro de validação de certificado, a menos que o servidor esteja configurado com os certificados intermédios necessários.

Esta alteração só se aplica quando não há qualquer configuração personalizada CertificateChainPolicy. Se um X509ChainPolicy personalizado for especificado, o valor de DisableCertificateDownloads é respeitado.

Tipo de mudança disruptiva

Esta alteração é de natureza comportamental .

Motivo da mudança

Permitir os downloads AIA durante o handshake TLS pode levar a uma degradação significativa do desempenho se o servidor AIA for lento ou não responsivo. Além disso, fazer pedidos HTTP de saída para endpoints fornecidos pelo cliente introduz riscos potenciais de segurança, uma vez que um atacante pode influenciar quais endpoints externos o servidor contacta. Para mais detalhes, consulte o pull request que introduziu esta alteração.

Escolha uma das seguintes opções:

  • Garantir que o cliente envia todos os certificados intermédios necessários: Configure o cliente para incluir todos os certificados intermédios no handshake TLS. No lado do cliente, use ClientCertificateContext com um SslStreamCertificateContext que inclua toda a cadeia. Na maioria dos cenários, criar SslStreamCertificateContext gere automaticamente certificados intermédios.

  • Fornecer certificados intermédios na política da cadeia do servidor: Utilizar ExtraStore para fornecer os certificados intermédios necessários ao servidor:

    var chainPolicy = new X509ChainPolicy
    {
        // Disable AIA downloads (SslStream sets this to true on its internal policy by default in .NET 11;
        // when you supply a custom X509ChainPolicy, set it explicitly to match that behavior)
        DisableCertificateDownloads = true,
    
        // Add any necessary intermediate certificates
        ExtraStore = { intermediateCertificate },
    
        // If client certificates are issued by a private root CA, specify custom trust
        TrustMode = X509ChainTrustMode.CustomRootTrust,
        CustomTrustStore = { rootCertificate }
    };
    
    var sslStream = new SslStream(networkStream);
    
    await sslStream.AuthenticateAsServerAsync(new SslServerAuthenticationOptions
    {
        ServerCertificateContext = serverCertificateContext,
        ClientCertificateRequired = true,
        CertificateChainPolicy = chainPolicy
    });
    
  • Permitir explicitamente downloads do AIA (não recomendado): Restaurar o comportamento anterior definindo DisableCertificateDownloads para false. Esta abordagem não é recomendada devido aos riscos associados de desempenho e segurança.

APIs afetadas