confianca-certificado-dev-dotnet

Diagnostique e corrija problemas de confiança do certificado de desenvolvimento HTTPS do .NET no Linux. Abrange todo o ciclo de vida do certificado, desde a geração até a inclusão no pacote de CAs do sistema, com orientações específicas para Ubuntu, Fedora, Arch e WSL2.

O que é confianca-certificado-dev-dotnet?

Esta skill soluciona um problema comum no desenvolvimento .NET no Linux: o comando `dotnet dev-certs https --trust` não configura totalmente a confiança no certificado de desenvolvimento, ao contrário do Windows e macOS. Ela diagnostica e corrige todos os passos necessários para que o certificado seja aceito por aplicações .NET, OpenSSL, curl e navegadores. A skill oferece um procedimento de diagnóstico de 5 pontos para identificar falhas, um procedimento completo de recuperação, e considerações específicas para distribuições como Ubuntu, Fedora, Arch e WSL2. É especialmente útil para desenvolvedores usando Aspire 13.1.0+, que requer TLS para Redis por padrão, e para configurações de CI/CD. A abordagem foca em entender a arquitetura de confiança de certificados no Linux para evitar soluções improvisadas, destacando a etapa crítica de reconstruir o pacote de CAs com `update-ca-certificates` ou comandos equivalentes.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Aaronontheweb/dotnet-skills/tree/main/skills/dotnet-devcert-trust

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Confiança do Certificado de Desenvolvimento .NET no Linux

Quando Usar Esta Skill

Use esta skill quando:

  • Conexões TLS do Redis falharem com UntrustedRoot ou RemoteCertificateNameMismatch no Aspire
  • dotnet dev-certs https --check --trust retornar código de saída 7
  • Conexões HTTPS localhost falharem com erros de validação de certificado
  • Após executar dotnet dev-certs https --clean e precisar restaurar a confiança
  • Configurando uma nova máquina de desenvolvimento Linux para desenvolvimento .NET HTTPS
  • O dashboard do Aspire ou chamadas gRPC entre serviços falharem com erros TLS
  • Atualizando do Aspire < 13.1.0 (que não usava TLS no Redis por padrão)

O Problema

No Windows e macOS, dotnet dev-certs https --trust lida com tudo automaticamente — ele gera o certificado, instala no repositório do usuário e o adiciona ao repositório de confiança do sistema. No Linux, ele não faz quase nada de útil. O comando gera o certificado e o coloca no repositório do usuário, mas:

  1. Ele não exporta o certificado para o diretório de CAs do sistema
  2. Ele não executa update-ca-certificates para reconstruir o pacote de CAs
  3. Ele não adiciona o certificado aos repositórios de confiança do navegador (NSS/NSSDB)
  4. A flag --trust é bem-sucedida silenciosamente, mas o certificado permanece não confiável

Isso significa que aplicações .NET, OpenSSL, curl e navegadores rejeitam o certificado de desenvolvimento — mesmo que dotnet dev-certs https --check informe que ele existe.

Por Que Isso Aparece com Aspire 13.1.0+

Antes do Aspire 13.1.0, as conexões Redis usavam texto simples. A partir do 13.1.0, o Aspire habilita TLS no Redis por padrão. Se seu certificado de desenvolvimento não for confiável no nível do sistema, as conexões Redis falham imediatamente com:

System.Security.Authentication.AuthenticationException:
  The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot

Como Funciona a Confiança do Certificado no Linux

Entender a arquitetura evita depuração sem método:

┌─────────────────────────────────────────────────────┐
│ Application (.NET, curl, OpenSSL)                   │
│   lê: /etc/ssl/certs/ca-certificates.crt            │
│        (pacote de CA consolidado)                   │
└──────────────────────┬──────────────────────────────┘
                       │ construído por
┌──────────────────────▼──────────────────────────────┐
│ update-ca-certificates                              │
│   lê de:                                             │
│     /usr/share/ca-certificates/      (CAs da distro) │
│     /usr/local/share/ca-certificates/ (CAs locais)   │
│   escreve em:                                        │
│     /etc/ssl/certs/ca-certificates.crt (pacote)     │
│     /etc/ssl/certs/*.pem (links simbólicos individuais)│
└─────────────────────────────────────────────────────┘

Insight chave: Colocar um arquivo .crt em /usr/local/share/ca-certificates/ é necessário, mas não suficiente. O pacote consolidado em /etc/ssl/certs/ca-certificates.crt deve ser reconstruído executando update-ca-certificates. As aplicações leem o pacote, não os arquivos individuais.

Procedimento de Diagnóstico de 5 Pontos

Execute estas verificações em ordem. Pare no primeiro FAIL e aplique sua correção antes de continuar.

Verificação 1: Existência do Certificado de Desenvolvimento

dotnet dev-certs https --check
echo "Código de saída: $?"
Código de SaídaSignificadoAção
0Certificado existe no repositório do usuárioPASS — continue
Diferente de zeroNenhum cert. de desenvolvimento válidoExecute dotnet dev-certs https

Verificação 2: Repositório de Confiança do Sistema — Certificado Único, Permissões Corretas

ls -la /usr/local/share/ca-certificates/ | grep -iE 'dotnet|aspnet'
ResultadoSignificado
Apenas dotnet-dev-cert.crt com -rw-r--r-- (644)PASS
Múltiplos arquivos de certificado, permissões erradas ou arquivos aspnet* obsoletosFAIL

Arquivos obsoletos comuns de sessões anteriores:

ArquivoProblema
aspnetcore-dev.crtFrequentemente criado com permissões 0600 (ilegível para update-ca-certificates)
aspnet/https.crtConvenção antiga, pode ter uma impressão digital diferente do certificado de desenvolvimento atual
dotnet-dev-cert.crt com 0600Nome correto, mas permissões erradas

Correção:

# Remova TODOS os arquivos de certificado obsoletos
sudo rm -f /usr/local/share/ca-certificates/aspnetcore-dev.crt
sudo rm -rf /usr/local/share/ca-certificates/aspnet/

# Garanta permissões corretas no certificado de desenvolvimento (se existir)
sudo chmod 644 /usr/local/share/ca-certificates/dotnet-dev-cert.crt

Verificação 3: Inclusão no Pacote de CA

Esta é a verificação que mais comumente falha. O arquivo de certificado existe, mas nunca foi adicionado ao pacote.

openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt \
  /usr/local/share/ca-certificates/dotnet-dev-cert.crt
ResultadoSignificado
dotnet-dev-cert.crt: OKPASS — o certificado está no pacote consolidado
error 20 at 0 depth lookup: unable to get local issuer certificateFAIL — o pacote nunca foi reconstruído
error 2 at 0 depth lookup: unable to get issuer certificateFAIL — mesmo problema, versão diferente do OpenSSL

Correção:

sudo update-ca-certificates
# A saída esperada inclui "1 added" ou similar

# Re-verifique
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt \
  /usr/local/share/ca-certificates/dotnet-dev-cert.crt

Verificação 4: Substituições de Variáveis de Ambiente

Variáveis de ambiente SSL podem redirecionar as consultas de certificado para longe do pacote do sistema:

echo "SSL_CERT_DIR=${SSL_CERT_DIR:-<não definido>}"
echo "SSL_CERT_FILE=${SSL_CERT_FILE:-<não definido>}"
echo "DOTNET_SSL_CERT_DIR=${DOTNET_SSL_CERT_DIR:-<não definido>}"
echo "DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=${DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER:-<não definido>}"
ResultadoSignificado
Todos <não definido>PASS
Qualquer variável definidaFAIL — pode redirecionar consultas de certificado

Correção: Remova as variáveis problemáticas do seu perfil de shell (~/.bashrc, ~/.zshrc, ~/.profile) e inicie um novo shell.

Verificação 5: Integridade dos Links Simbólicos

Links simbólicos obsoletos de certificados removidos anteriormente podem confundir o OpenSSL:

find /etc/ssl/certs/ -xtype l 2>/dev/null | head -5
ResultadoSignificado
Nenhuma saídaPASS
Links simbólicos quebrados listadosFAIL

Correção:

sudo update-ca-certificates --fresh
# Reconstrói TODOS os links simbólicos do zero

Procedimento Completo de Recuperação

Quando várias verificações falharem ou você quiser começar do zero, execute esta sequência completa:

#!/usr/bin/env bash
set -euo pipefail

echo "=== Recuperação da Confiança do Certificado de Desenvolvimento .NET ==="

# Passo 1: Remova TODOS os arquivos de certificado obsoletos
echo "--- Removendo arquivos de certificado obsoletos ---"
sudo rm -f /usr/local/share/ca-certificates/aspnetcore-dev.crt
sudo rm -rf /usr/local/share/ca-certificates/aspnet/
sudo rm -f /usr/local/share/ca-certificates/dotnet-dev-cert.crt

# Passo 2: Limpe e regenere o certificado de desenvolvimento
echo "--- Regenerando o certificado de desenvolvimento ---"
dotnet dev-certs https --clean
dotnet dev-certs https

# Passo 3: Exporte como PEM e instale no repositório de confiança do sistema
echo "--- Instalando no repositório de confiança do sistema ---"
dotnet dev-certs https --export-path /tmp/dotnet-dev-cert.crt --format PEM --no-password
sudo cp /tmp/dotnet-dev-cert.crt /usr/local/share/ca-certificates/dotnet-dev-cert.crt
sudo chmod 644 /usr/local/share/ca-certificates/dotnet-dev-cert.crt
rm /tmp/dotnet-dev-cert.crt

# Passo 4: Reconstrua o pacote de CA (CRÍTICO — etapa mais comumente esquecida)
echo "--- Reconstruindo o pacote de CA ---"
sudo update-ca-certificates

# Passo 5: Verifique
echo "--- Verificando ---"
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt \
  /usr/local/share/ca-certificates/dotnet-dev-cert.crt

echo "=== Pronto! Reinicie sua aplicação .NET. ==="

Salve isso como ~/fix-devcert.sh e execute com bash ~/fix-devcert.sh quando necessário.

Notas Específicas por Distribuição

Ubuntu / Debian

O procedimento acima foi escrito para Ubuntu/Debian e funciona como está.

  • Diretório de CA: /usr/local/share/ca-certificates/
  • Comando do pacote: sudo update-ca-certificates
  • Saída do pacote: /etc/ssl/certs/ca-certificates.crt
  • Formato do certificado: PEM com extensão .crt necessária

Fedora / RHEL / CentOS

Fedora usa update-ca-trust em vez de update-ca-certificates:

# Exporte o certificado
dotnet dev-certs https --export-path /tmp/dotnet-dev-cert.pem --format PEM --no-password

# Instale no repositório de confiança do Fedora (diretório diferente!)
sudo cp /tmp/dotnet-dev-cert.pem /etc/pki/ca-trust/source/anchors/dotnet-dev-cert.pem
sudo chmod 644 /etc/pki/ca-trust/source/anchors/dotnet-dev-cert.pem
rm /tmp/dotnet-dev-cert.pem

# Reconstrua o pacote de confiança
sudo update-ca-trust

# Verifique
openssl verify /etc/pki/ca-trust/source/anchors/dotnet-dev-cert.pem

Principais diferenças:

Ubuntu/DebianFedora/RHEL
Diretório de CA/usr/local/share/ca-certificates//etc/pki/ca-trust/source/anchors/
Comando de reconstruçãoupdate-ca-certificatesupdate-ca-trust
Caminho do pacote/etc/ssl/certs/ca-certificates.crt/etc/pki/tls/certs/ca-bundle.crt
Extensão.crt.pem (qualquer extensão funciona)

Arch Linux

Arch usa a mesma abordagem update-ca-trust que o Fedora:

sudo cp /tmp/dotnet-dev-cert.pem /etc/ca-certificates/trust-source/anchors/dotnet-dev-cert.pem
sudo chmod 644 /etc/ca-certificates/trust-source/anchors/dotnet-dev-cert.pem
sudo update-ca-trust

WSL2

WSL2 executa um kernel Linux real com seu próprio repositório de certificados — separado do host Windows. O procedimento padrão Ubuntu/Debian funciona, mas fique atento a:

  1. Sistema de arquivos compartilhado (/mnt/c/) — arquivos de certificado no sistema de arquivos Windows têm permissões do Windows que podem não ser 644. Sempre copie para um caminho Linux nativo primeiro.
  2. systemd não está em execução — algumas configurações mais antigas do WSL2 não têm systemd, do qual os hooks do update-ca-certificates podem depender. Se o comando travar, tente sudo dpkg-reconfigure ca-certificates como alternativa.
  3. Integração com Docker Desktop — Se estiver usando o backend WSL2 do Docker Desktop, os contêineres herdam o pacote de CA da distribuição WSL2. Corrigir a confiança no WSL2 também a corrige para os contêineres.

Considerações Específicas do Aspire

Redis TLS (Aspire 13.1.0+)

Aspire 13.1.0 habilita TLS no Redis por padrão. Se você vir:

UntrustedRoot

nos erros de conexão Redis, o certificado de desenvolvimento não é confiável no nível do sistema. Execute o procedimento completo de recuperação acima.

Dashboard HTTPS do Aspire

O dashboard do Aspire usa o certificado de desenvolvimento para HTTPS. Se o dashboard mostrar avisos de certificado no navegador, o certificado não está no repositório de confiança do navegador. Para desenvolvimento, clicar para ignorar o aviso é aceitável — a confiança no nível do sistema (necessária para Redis, gRPC, etc.) é a prioridade.

ASPIRE_ALLOW_UNSECURED_TRANSPORT

Definir ASPIRE_ALLOW_UNSECURED_TRANSPORT=true é uma solução alternativa, não uma correção. Ele desabilita o TLS para comunicação entre serviços, o que:

  • Mascara o problema de confiança subjacente
  • Não corresponde ao comportamento de produção
  • Pode causar bugs diferentes daqueles que você veria em produção

Corrija a confiança do certificado.

Ciclo de Vida do Certificado

O certificado de desenvolvimento é válido por 1 ano a partir da criação. Quando expirar:

  1. dotnet dev-certs https --check informará que não há certificado válido
  2. Execute o procedimento completo de recuperação para gerar um novo certificado
  3. O arquivo de certificado antigo em /usr/local/share/ca-certificates/ será substituído
  4. update-ca-certificates trocará o certificado antigo pelo novo no pacote

Nenhuma reinicialização do sistema é necessária. As aplicações captam o novo pacote no próximo handshake TLS (reinicie sua aplicação).

Automação: Pipelines CI/CD

Em CI/CD em executores Linux, certificados de desenvolvimento raramente são necessários (você normalmente testa com certificados reais ou desabilita a validação TLS em estruturas de teste). No entanto, se seus testes de integração exigirem certificados de desenvolvimento confiáveis:

GitHub Actions

- name: Confiar no Certificado de Desenvolvimento .NET
  run: |
    dotnet dev-certs https
    dotnet dev-certs https --export-path /tmp/dotnet-dev-cert.crt --format PEM --no-password
    sudo cp /tmp/dotnet-dev-cert.crt /usr/local/share/ca-certificates/dotnet-dev-cert.crt
    sudo chmod 644 /usr/local/share/ca-certificates/dotnet-dev-cert.crt
    rm /tmp/dotnet-dev-cert.crt
    sudo update-ca-certificates

Azure DevOps

- script: |
    dotnet dev-certs https
    dotnet dev-certs https --export-path /tmp/dotnet-dev-cert.crt --format PEM --no-password
    sudo cp /tmp/dotnet-dev-cert.crt /usr/local/share/ca-certificates/dotnet-dev-cert.crt
    sudo chmod 644 /usr/local/share/ca-certificates/dotnet-dev-cert.crt
    rm /tmp/dotnet-dev-cert.crt
    sudo update-ca-certificates
  displayName: 'Confiar no Certificado de Desenvolvimento .NET'

Armadilhas Comuns

1. Certificado colocado, mas pacote nunca reconstruído

Sintoma: O arquivo de certificado existe em /usr/local/share/ca-certificates/ mas openssl verify falha.

Causa: update-ca-certificates nunca foi executado após colocar o arquivo.

Correção: sudo update-ca-certificates

Este é o erro mais comum. O diretório de CA é uma entrada para o processo de geração do pacote, não o pacote em si.

2. Arquivos de certificado obsoletos com permissões erradas

Sintoma: update-ca-certificates é executado, mas informa 0 added.

Causa: Arquivos de certificado com permissões 0600 são ilegíveis para update-ca-certificates (que é executado como root, mas lê arquivos por meio de um processo que pode verificar a legibilidade mundial). Os arquivos devem ser 644.

Correção: sudo chmod 644 /usr/local/share/ca-certificates/*.crt

3. Múltiplos arquivos de certificado de sessões diferentes

Sintoma: update-ca-certificates adiciona vários certificados, mas as aplicações ainda falham.

Causa: Arquivos de certificado antigos de ciclos anteriores de dotnet dev-certs https --clean / regeneração permanecem no diretório de CA. A impressão digital do certificado antigo não corresponde ao certificado de desenvolvimento atual.

Correção: Remova todos os arquivos dotnet* e aspnet*, depois re-exporte o certificado atual.

4. Incompatibilidade de impressão digital após limpeza/regeneração

Sintoma: openssl verify passa, mas o .NET ainda informa UntrustedRoot.

Causa: O certificado em /usr/local/share/ca-certificates/ foi exportado de um certificado de desenvolvimento anterior. Após dotnet dev-certs https --clean && dotnet dev-certs https, um novo certificado é gerado com uma impressão digital diferente. O arquivo no diretório de CA ainda contém o certificado antigo.

Correção: Execute o procedimento completo de recuperação para garantir que o certificado atual seja exportado e instalado.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

akka-hosting-actor-patterns

Patterns for building entity actors with Akka.Hosting - GenericChildPerEntityParent, message extractors, cluster sharding abstraction, akka-reminders, and ITimeProvider. Supports both local testing and clustered production modes.

akka-net-aspire-configuration

Configure Akka.NET with .NET Aspire for local development and production deployments. Covers actor system setup, clustering, persistence, Akka.Management integration, and Aspire orchestration patterns.

akka-net-best-practices

Critical Akka.NET best practices including EventStream vs DistributedPubSub, supervision strategies, error handling, Props vs DependencyResolver, work distribution patterns, and cluster/local mode abstractions for testability.

akka-net-management

Akka.Management for cluster bootstrapping, service discovery (Kubernetes, Azure, Config), health checks, and dynamic cluster formation without static seed nodes.

akka-net-testing-patterns

Write unit and integration tests for Akka.NET actors using modern Akka.Hosting.TestKit patterns. Covers dependency injection, TestProbes, persistence testing, and actor interaction verification. Includes guidance on when to use traditional TestKit.

api-design

Design stable, compatible public APIs using extend-only design principles. Manage API compatibility, wire compatibility, and versioning for NuGet packages and distributed systems.

aspire-configuration

Configure Aspire AppHost to emit explicit app config via environment variables; keep app code free of Aspire clients and service discovery.

aspire-integration-testing

Write integration tests using .NET Aspire

aspire-service-defaults

Create a shared ServiceDefaults project for Aspire applications. Centralizes OpenTelemetry, health checks, resilience, and service discovery configuration across all services.

crap-analysis

Analyze code coverage and CRAP (Change Risk Anti-Patterns) scores to identify high-risk code. Use OpenCover format with ReportGenerator for Risk Hotspots showing cyclomatic complexity and untested code paths.

csharp-concurrency-patterns

Choosing the right concurrency abstraction in .NET - from async/await for I/O to Channels for producer/consumer to Akka.NET for stateful entity management. Avoid locks and manual synchronization unless absolutely necessary.

database-performance

Database access patterns for performance. Separate read/write models, avoid N+1 queries, use AsNoTracking, apply row limits, and never do application-side joins. Works with EF Core and Dapper.

dependency-injection-patterns

Organize DI registrations using IServiceCollection extension methods. Group related services into composable Add* methods for clean Program.cs and reusable configuration in tests.

dotnet-local-tools

Managing local .NET tools with dotnet-tools.json for consistent tooling across development environments and CI/CD pipelines.

dotnet-project-structure

Modern .NET project structure including .slnx solution format, Directory.Build.props, central package management, SourceLink, version management with RELEASE_NOTES.md, and SDK pinning with global.json.

dotnet-slopwatch

Use Slopwatch to detect LLM reward hacking in .NET code changes. Run after every code modification to catch disabled tests, suppressed warnings, empty catch blocks, and other shortcuts that mask real problems.

efcore-patterns

Entity Framework Core best practices including NoTracking by default, query splitting for navigation collections, migration management, dedicated migration services, and common pitfalls to avoid.

ilspy-decompile

Understand implementation details of .NET code by decompiling assemblies. Use when you want to see how a .NET API works internally, inspect NuGet package source, view framework implementation, or understand compiled .NET binaries.

mailpit-integration

Test email sending locally using Mailpit with .NET Aspire. Captures all outgoing emails without sending them. View rendered HTML, inspect headers, and verify delivery in integration tests.

marketplace-publishing

Workflow for publishing skills and agents to the dotnet-skills Claude Code marketplace. Covers adding new content, updating plugin.json, validation, and release tagging.

Habilidades Relacionadas