Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Capítulo 1: Criptografia, Estrutura PKI e Fundamentos

Antes de Começar: Este capítulo constrói a base conceitual que você precisa antes de tocar em um único certificado. Ao final, você entenderá por que a criptografia existe, como ela funciona em nível prático, e o que acontece nos bastidores quando duas máquinas estabelecem uma conexão segura.


1.1 Por Que Usar Criptografia?

Imagine enviar um cartão postal. Qualquer pessoa que o manipule—carteiros, vizinhos, desconhecidos—pode lê-lo. Agora imagine que o cartão postal contém sua senha bancária. É assim que o tráfego de rede não criptografado se parece.

Cada pacote que viaja por uma rede pode ser interceptado, lido, modificado ou forjado. Sem criptografia:

AmeaçaO que aconteceExemplo real
EspionagemAtacante lê seus dadosCaptura de senhas em Wi-Fi público
AdulteraçãoAtacante modifica dados em trânsitoInjeção de malware em download de software
PersonificaçãoAtacante finge ser outra pessoaSite bancário falso coletando credenciais
RepúdioRemetente nega ter enviado uma mensagemNegar uma transação financeira

A criptografia resolve todos os quatro problemas. Ela não é opcional em sistemas modernos—é a base de toda comunicação segura.


1.2 Os Quatro Pilares da Segurança da Informação

A criptografia fornece quatro garantias fundamentais. Todo sistema seguro depende de uma combinação destas:

Confidencialidade — “Só você pode ler isto”

A confidencialidade garante que os dados são legíveis apenas pelo destinatário pretendido. Mesmo se um atacante interceptar os dados, ele vê apenas ruído sem sentido.

Como é implementada:

  • Criptografia simétrica (AES-256): A mesma chave cifra e decifra. Rápida, usada para dados em massa.
  • Criptografia assimétrica (RSA, ECC): Chave pública cifra, chave privada decifra. Usada para troca de chaves.

Contra o que protege: Espionagem.

Integridade — “Isto não foi alterado”

A integridade garante que os dados não foram alterados entre remetente e destinatário. Se um único bit mudar, a modificação é detectada.

Como é implementada:

  • Funções hash (SHA-256): Produzem uma impressão digital de tamanho fixo dos dados.
  • HMAC: Hash combinado com uma chave secreta para integridade autenticada.
  • Assinaturas digitais: Hash assinado com uma chave privada.
 Original:  "Transferir R$100 para Bob"  → SHA-256 → a1b2c3d4...
 Adulterado:"Transferir R$900 para Bob"  → SHA-256 → f7e8d9c0...  ← DIFERENTE!

Contra o que protege: Adulteração.

Autenticidade — “Você é quem diz ser”

A autenticidade prova a identidade da parte comunicante. Quando você se conecta ao site do seu banco, precisa ter certeza de que é realmente seu banco, não um impostor.

Como é implementada:

  • Certificados digitais (X.509): Vinculam uma chave pública a uma identidade.
  • Autoridades Certificadoras (CAs): Terceiros confiáveis que verificam identidades.
  • Assinaturas digitais: Provam que uma mensagem foi criada pelo remetente alegado.

Contra o que protege: Personificação.

Não-Repúdio — “Você não pode negar isto”

O não-repúdio garante que o remetente não pode negar ter enviado uma mensagem ou realizado uma ação. É o equivalente digital de uma assinatura manuscrita em um contrato.

Como é implementado:

  • Assinaturas digitais com chaves privadas: Apenas o detentor da chave pode produzir a assinatura.
  • Carimbos de tempo: Provam quando uma ação ocorreu.
  • Logs de auditoria com integridade criptográfica: Registros à prova de adulteração.

Contra o que protege: Repúdio (negar responsabilidade).

Resumo: Os Quatro Pilares

PilarPergunta que respondeImplementado porProtege contra
ConfidencialidadeAlguém mais pode ler?Criptografia (AES, RSA)Espionagem
IntegridadeFoi modificado?Hashes (SHA-256), HMACAdulteração
AutenticidadeQuem enviou?Certificados, assinaturasPersonificação
Não-repúdioO remetente pode negar?Assinaturas digitaisRepúdio

1.3 Funções Hash: Impressões Digitais de Dados

Uma função hash recebe uma entrada de qualquer tamanho e produz uma saída de tamanho fixo. Pense nela como uma impressão digital para dados.

Propriedades Essenciais

1. Determinística — A mesma entrada sempre produz a mesma saída.

SHA-256("Hello") → 185f8db32271...  (sempre)
SHA-256("Hello") → 185f8db32271...  (sempre)

2. Unidirecional (Resistência a Pré-imagem) — Não é possível descobrir a entrada a partir da saída.

185f8db32271... → ???  (computacionalmente inviável encontrar a entrada)

3. Resistente a Colisões — É praticamente impossível encontrar duas entradas diferentes que produzam a mesma saída.

SHA-256("entrada A") → hash1
SHA-256("entrada B") → hash2
hash1 ≠ hash2  (com probabilidade esmagadora)

4. Efeito Avalanche — Uma mudança mínima na entrada produz uma saída completamente diferente.

SHA-256("Hello World")  → a591a6d40bf420404a011733cfb7b190...
SHA-256("Hello World!") → 7f83b1657ff1fc53b92dc18148a1d65d...
                                     ↑ completamente diferente!

Hashes São Seguros?

Nem todos os algoritmos hash são iguais. Alguns foram quebrados:

AlgoritmoTamanho da SaídaEstadoPor quê
MD5128 bitsQUEBRADOColisões encontradas em segundos. Nunca use para segurança.
SHA-1160 bitsQUEBRADOGoogle demonstrou colisão prática em 2017 (SHAttered).
SHA-256256 bitsSEGUROSem ataques práticos conhecidos. Padrão atual.
SHA-384384 bitsSEGUROMargem de segurança maior.
SHA-512512 bitsSEGUROSegurança máxima da família SHA-2.
SHA-3256+ bitsSEGURODesign diferente (Keccak). Alternativa à prova de futuro.
BLAKE2256+ bitsSEGUROMuito rápido, usado em aplicações modernas.

“Quebrado” significa: Um atacante pode encontrar duas entradas diferentes que produzem o mesmo hash (colisão). Isso permite forjar documentos, certificados ou assinaturas.

# Verifique você mesmo — calcule hashes em qualquer sistema RHEL:
echo -n "Hello World" | sha256sum
# a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

echo -n "Hello World" | md5sum
# b10a8db164e0754105b7a99be72e3fe5  ← NÃO confie nisto para segurança!

Usos Reais de Hashes

Caso de usoComoExemplo
Armazenamento de senhasArmazena o hash, não a senha/etc/shadow no Linux
Integridade de arquivosCompara hash antes/depoissha256sum pacote.rpm
Assinaturas digitaisAssina o hash, não os dadosAssinatura de certificados
DeduplicaçãoIdentifica arquivos idênticosSistemas de backup
BlockchainCadeia de hashesProva de trabalho do Bitcoin

1.4 Criptografia Simétrica vs Assimétrica

Simétrica: Uma Chave para Tudo

Remetente e destinatário compartilham a mesma chave secreta. Como um cadeado onde ambas as partes têm uma cópia da mesma chave.

PropriedadeValor
VelocidadeMuito rápida (AES acelerado por hardware)
Tamanho da chave128 ou 256 bits
ProblemaComo compartilhar a chave de forma segura?
ExemplosAES-128, AES-256, ChaCha20

Assimétrica: Duas Chaves, Dois Papéis

Cada parte tem um par de chaves: uma chave pública (compartilhe livremente) e uma chave privada (nunca compartilhe).

PropriedadeValor
VelocidadeLenta (1000x mais lenta que simétrica)
Tamanho da chave2048–4096 bits (RSA) ou 256 bits (ECC)
VantagemNão precisa compartilhar chave secreta previamente
ExemplosRSA, ECDSA, Ed25519

Por Que Precisamos de Ambas: Criptografia Híbrida

A criptografia assimétrica resolve o problema de distribuição de chaves, mas é lenta demais para dados em massa. A solução: usar assimétrica para trocar uma chave simétrica, depois usar simétrica para os dados.

Isto é exatamente o que acontece em cada conexão HTTPS.


1.5 Entendendo a Troca de Chaves: A Analogia da Mistura de Cores

Antes de mergulhar no handshake TLS/RSA real, vamos construir uma intuição com uma analogia visual. Isto explica a troca de chaves Diffie-Hellman, o mecanismo usado no TLS moderno para estabelecer um segredo compartilhado.

O Problema

Alice e Bob querem concordar em uma cor secreta compartilhada que Eve (a bisbilhoteira) não consiga descobrir, mesmo que Eve possa ver tudo que eles enviam um ao outro.

Por Que Eve Não Consegue Trapacear

Misturar tinta é fácil de fazer mas impossível de reverter. Não se consegue separar tinta misturada de volta em seus componentes. Em matemática, isto é análogo a:

  • Fácil: Multiplicar dois primos grandes → obter um produto (misturar)
  • Difícil: Fatorar um produto grande → encontrar os primos (separar)

Esta é a função unidirecional que faz a criptografia funcionar.

De Cores para Números

Analogia de CoresEquivalente Criptográfico
Cor pública (Amarelo)Parâmetros públicos (primo grande, gerador)
Segredo de Alice (Vermelho)Chave privada de Alice
Segredo de Bob (Azul)Chave privada de Bob
Cor misturada enviada (Laranja/Verde)Chave pública (calculada a partir da privada)
Segredo final compartilhado (Marrom)Chave de sessão compartilhada
“Não se consegue separar a tinta”O problema do logaritmo discreto é computacionalmente difícil

1.6 O Handshake TLS: Como uma Conexão Segura Realmente Funciona

Agora vamos ver o que realmente acontece quando seu navegador se conecta a https://banco.com. Isto combina tudo que aprendemos: hashes, criptografia assimétrica, criptografia simétrica, certificados e troca de chaves.

Passo a Passo Detalhado

Passos 1-2 (Hello): Cliente e servidor trocam capacidades e números aleatórios. Esses números aleatórios adicionam frescor — garantem que cada sessão é única, mesmo entre as mesmas partes.

Passo 3 (Certificate): O servidor prova sua identidade enviando seu certificado X.509 contendo sua chave pública.

Passo 4 (Verificação): Este é o passo crítico de confiança. O cliente percorre a cadeia de confiança.

Cada assinatura é verificada usando a chave pública do emissor. Se qualquer elo se quebrar, o handshake falha.

Passo 5 (Troca de Chaves): O cliente gera 48 bytes aleatórios (PreMasterSecret), cifra com a chave pública RSA do servidor e envia. Apenas a chave privada do servidor pode decifrar — esta é a mágica assimétrica.

Passo 6 (Derivação de Chaves): Ambos os lados calculam independentemente as mesmas chaves de sessão usando uma Função Pseudo-Aleatória (PRF). É aqui que transitamos de assimétrica lenta para simétrica rápida.

Passos 7-9 (Comunicação Criptografada): A partir daqui, tudo é cifrado com AES-256 — milhares de vezes mais rápido que RSA.

TLS 1.3 Moderno: Mais Simples e Rápido

O TLS 1.3 simplificou o handshake removendo a troca de chaves RSA (sigilo futuro agora é obrigatório) e reduzindo viagens de ida e volta:


1.7 Estrutura PKI: A Arquitetura de Confiança

Infraestrutura de Chaves Públicas (PKI) é o sistema que gerencia certificados digitais e chaves públicas. Ela responde à pergunta: “Como sei que esta chave pública realmente pertence a banco.com?”

Por Que uma Cadeia?

CAs Raiz são extremamente valiosas — se comprometidas, cada certificado que já assinaram torna-se não confiável. Por isso CAs Raiz são:

  • Armazenadas em módulos de segurança de hardware (HSMs) offline, isolados da rede
  • Usadas apenas para assinar certificados de CAs Intermediárias
  • Válidas por 20-30 anos

CAs Intermediárias fazem o trabalho diário de emitir certificados. Se comprometidas:

  • Apenas os certificados daquela Intermediária são afetados
  • A Raiz pode revogar a Intermediária e criar uma nova
  • O dano é contido

Revogação: O Que Acontece Quando a Confiança Quebra

Quando uma chave privada é comprometida ou um certificado não deve mais ser confiável:

MétodoComo funcionaCompensação
LCR (Lista de Certificados Revogados)CA publica lista de números de série revogadosPode estar desatualizada (atualizada periodicamente)
OCSP (Protocolo de Status de Certificado Online)Cliente pergunta à CA “este cert ainda é válido?” em tempo realRequer rede, preocupação de privacidade
OCSP StaplingServidor busca sua própria resposta OCSP e anexa ao handshakeMelhor dos dois mundos

1.8 Juntando Tudo: Um Exemplo Completo

Vamos rastrear uma conexão HTTPS completa do início ao fim, vendo cada conceito em ação:


1.9 Conclusões Principais

Antes de prosseguir para o gerenciamento de certificados específico do RHEL, certifique-se de entender:

ConceitoResumo em uma frase
HashesImpressões digitais unidirecionais que detectam qualquer alteração (use SHA-256+).
Criptografia simétricaA mesma chave cifra e decifra — rápida, mas distribuição da chave é difícil.
Criptografia assimétricaPares de chaves pública/privada — resolve distribuição, mas é lenta.
Criptografia híbridaUsa assimétrica para trocar chaves, depois simétrica para dados (o TLS faz isto).
Assinaturas digitaisHash + chave privada = prova de identidade e integridade.
CertificadosVinculam uma chave pública a uma identidade, assinados por uma CA confiável.
PKIA arquitetura de confiança: CA Raiz → CA Intermediária → Certificado entidade final.
Handshake TLSAutentica servidor, troca chaves, depois cifra tudo.
Sigilo futuroUsa chaves efêmeras (ECDHE) para que sessões passadas permaneçam seguras.

Navegação do Capítulo

Capítulo 2: Introdução aos Certificados no RHEL

Bem-vindo! Este tutorial levará você de não saber nada sobre certificados digitais a resolver problemas de certificados com confiança em sistemas Red Hat Enterprise Linux.


2.1 Por Que Este Tutorial?

Você é um administrador RHEL. Um dia, algo quebra:

  • Apache se recusa a iniciar: SSL_CTX_use_certificate:ca md too weak
  • Conexões LDAP falham: TLS: hostname does not match CN
  • certmonger mostra: CA_UNREACHABLE
  • curl retorna: SSL certificate problem: unable to get local issuer certificate

Parece familiar? Estes são problemas de certificados, e estão em todos os lugares em sistemas Linux modernos.

Este tutorial ensina você a:

  • ✅ Entender o que são certificados (perspectiva RHEL)
  • ✅ Configurar certificados para serviços comuns RHEL
  • Resolver problemas de certificados (objetivo principal!)
  • ✅ Automatizar ciclo de vida de certificados com ferramentas RHEL
  • ✅ Lidar com diferenças de versões RHEL (7, 8, 9, 10)
  • ✅ Passar auditorias (FIPS, STIG, conformidade)

2.2 Para Quem é Este Tutorial?

Público Principal:

  • Administradores e engenheiros RHEL
  • Engenheiros de suporte resolvendo problemas de certificados
  • Qualquer pessoa gerenciando sistemas RHEL com HTTPS, LDAPS ou TLS

Pré-requisitos:

  • Conhecimento básico de linha de comando Linux
  • Acesso a sistemas RHEL (7, 8, 9 ou 10)
  • Não é necessário conhecimento prévio de certificados!

2.3 O Que São Certificados? (Em 60 Segundos)

Imagine que você visita https://example.com. Como seu navegador sabe que está realmente falando com example.com e não com um impostor?

Resposta: Certificados digitais.

Um certificado é como uma carteira de identidade digital que:

  1. Prova identidade (“Eu sou example.com”)
  2. Habilita criptografia (comunicação segura)
  3. É assinado por autoridade confiável (como uma CA)

Em Sistemas RHEL

Certificados são usados em todos os lugares:

  • Servidores web (Apache, NGINX) → HTTPS
  • Serviços de diretório (OpenLDAP, FreeIPA) → LDAPS
  • Servidores de email (Postfix, Dovecot) → SMTPS/IMAPS
  • Bancos de dados (PostgreSQL, MySQL) → Conexões TLS
  • APIs e serviços (REST, microserviços) → mTLS
  • Túneis VPN → Conexões seguras
  • Registros de contêiner → Imagens seguras

Resumo: Se está em rede e é seguro no RHEL, provavelmente usa certificados.


2.4 Sua Primeira Inspeção de Certificado

Vamos ser práticos imediatamente. SSH em qualquer sistema RHEL e execute:

# Ver certificado do servidor SSH do seu sistema
sudo openssl s_client -connect localhost:22 -starttls smtp 2>/dev/null | openssl x509 -noout -text

# Exemplo melhor: Verificar um certificado web
echo | openssl s_client -connect access.redhat.com:443 2>/dev/null | openssl x509 -noout -text | head -20

Você verá uma saída como:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0a:5d:d2:48:fc:4e:2f:e2:99:81:09:74:2d:4c:d5:69
        Signature Algorithm: ecdsa-with-SHA384
        Issuer: C=US, O=DigiCert Inc, CN=DigiCert Global G3 TLS ECC SHA384 2020 CA1
        Validity
            Not Before: Oct 30 00:00:00 2025 GMT
            Not After : Oct 27 23:59:59 2026 GMT
        Subject: C=US, ST=North Carolina, L=Raleigh, O=Red Hat, Inc., CN=access.redhat.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:fc:08:bf:d2:d8:63:0c:84:a4:c8:dd:04:9c:8c:
                    99:4f:cb:93:31:7f:9e:64:27:ea:3d:a7:18:fd:3e:
                    4c:c2:58:8b:cb:f2:5c:6e:95:bf:f3:97:ba:b8:2b:
                    49:c6:51:30:f4:71:88:e3:fa:d4:f1:73:74:1d:e3:
                    2b:49:bc:9e:6e

O que você está vendo:

  • Issuer: Quem assinou este certificado
  • Subject: A quem este certificado pertence
  • Validity: Quando é válido (expira 15 de março de 2025)
  • Signature Algorithm: Como está protegido (SHA-256 com RSA)

🎉 Parabéns! Você acabou de inspecionar seu primeiro certificado.


2.5 Como Funcionam os Certificados (Contexto RHEL)

Os Três Componentes Chave

  1. Certificado (.crt, .pem)

    • Informação pública: “Eu sou server.example.com”
    • Contém a chave pública
    • Armazenado em /etc/pki/tls/certs/ no RHEL
  2. Chave Privada (.key, .pem)

    • Segredo! Nunca compartilhe isso
    • Usado para provar que você possui o certificado
    • Armazenado em /etc/pki/tls/private/ no RHEL (modo 600!)
  3. Autoridade Certificadora (CA)

    • Emite e assina certificados
    • Pode ser pública (Let’s Encrypt, DigiCert)
    • Ou interna (FreeIPA, CA corporativa)
    • CAs confiáveis armazenadas em /etc/pki/ca-trust/ no RHEL

A Cadeia de Confiança

CA Raiz (confiável pelo sistema RHEL)
  └─ CA Intermediária
      └─ Certificado do Servidor (seu servidor web)

Quando alguém se conecta ao seu servidor RHEL:

  1. Servidor envia seu certificado
  2. Cliente verifica cadeia de assinatura até CA raiz confiável
  3. Se cadeia é válida → conexão prossegue
  4. Se cadeia quebra → erro (e você recebe a chamada de suporte!)

2.6 Arquitetura de Certificados do RHEL

Diretórios Chave

/etc/pki/
├── ca-trust/
│   ├── source/anchors/      ← Coloque CAs personalizadas aqui
│   └── extracted/           ← Repositório de confiança do sistema
│       ├── pem/             ← CAs em formato PEM
│       ├── openssl/         ← Confiança OpenSSL
│       └── java/            ← Confiança Java (cacerts)
├── tls/
│   ├── certs/               ← Certificados de servidor
│   ├── private/             ← Chaves privadas (modo 700!)
│   └── cert.pem             ← Link simbólico de certificado padrão
└── nssdb/                   ← Base de dados NSS (Firefox, etc.)

Ferramentas Chave

# OpenSSL - Canivete suíço de certificados
openssl version  # Verificar sua versão

# Ferramentas NSS - Para bases de dados NSS
certutil -L -d /etc/pki/nssdb

# Gestão de Confiança - Adicionar/remover CAs
update-ca-trust  # Atualizador de repositório de confiança do RHEL

# Gerenciador de Certificados - Renovação automática (RHEL 7+)
getcert list  # Mostrar certificados rastreados

# Crypto-Policies - Segurança em todo o sistema (RHEL 8+)
update-crypto-policies --show  # Verificar política atual

2.7 Um Dia na Vida: Cenários de Certificados

Cenário 1: Adicionar uma CA Personalizada

# Você tem uma CA corporativa que assinou seus servidores internos
sudo cp corporate-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract

# Agora RHEL confia em certificados assinados por sua CA corporativa!

Cenário 2: Configurar Apache HTTPS

# Instalar Apache com SSL/TLS
sudo dnf install httpd mod_ssl

# Gerar uma chave privada
sudo openssl genpkey -algorithm RSA -out /etc/pki/tls/private/server.key \
  -pkeyopt rsa_keygen_bits:2048

# Gerar uma solicitação de assinatura de certificado (CSR)
sudo openssl req -new -key /etc/pki/tls/private/server.key \
  -out /tmp/server.csr \
  -subj "/CN=web.example.com"

# Enviar CSR para CA, obter certificado de volta, instalá-lo
sudo cp server.crt /etc/pki/tls/certs/

# Configurar Apache, reiniciar
sudo systemctl restart httpd

Cenário 3: Resolver um Certificado Expirado

# Serviço falha com: "certificate has expired"
# Verificar expiração do certificado
sudo openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates

# Saída mostra:
# notAfter=Jan 15 23:59:59 2024 GMT  ← Ops, expirado!

# Renovar certificado, substituir arquivo, reiniciar serviço

2.8 Diferenças de Versão RHEL (Prévia)

A gestão de certificados evoluiu significativamente entre versões RHEL:

Versão RHELCaracterística ChaveFoco de Solução de Problemas
RHEL 7Abordagem tradicionalConfiguração manual, problemas TLS legados
RHEL 8Crypto-policiesConflitos de política, integração certmonger
RHEL 9OpenSSL 3.xProblemas de provedor, validação mais rigorosa
RHEL 10Padrões fortalecidosSomente moderno, ferramentas aprimoradas

Não se preocupe! O Capítulo 8 cobre essas diferenças de versão em detalhes.


2.9 Problemas Comuns de Certificados (Prévia)

Você aprenderá a resolver:

Problemas de Configuração:

  • Desajuste de certificado/chave
  • Permissões de arquivo incorretas
  • Caminhos incorretos em arquivos de configuração

Problemas de Confiança:

  • Certificados autoassinados rejeitados
  • Erros de CA desconhecida
  • Falhas de validação de cadeia

Problemas de Expiração:

  • Certificados expirados
  • Problemas de desvio de relógio
  • Falhas de renovação

Problemas de Versão:

  • Desajustes de versão TLS
  • Problemas de suite de cifra
  • Conflitos de crypto-policy (RHEL 8+)
  • Compatibilidade OpenSSL 3.x (RHEL 9+)

Específicos de Serviço:

  • Apache: Erros SSLCertificateFile
  • NGINX: Problemas ssl_certificate
  • Postfix: Falhas de handshake TLS
  • LDAP: TLS: hostname does not match

2.10 Visão Geral do Caminho de Aprendizagem

Este tutorial está organizado para administradores RHEL:

Parte 1: Fundamentos (Capítulos 1-7)

Comece aqui. Aprenda básicos de certificados em contexto RHEL.

Parte 2: Específico por Versão (Capítulos 8-13)

Mergulho profundo nas diferenças RHEL 7, 8, 9, 10.

Parte 3: Serviços (Capítulos 14-21)

Configure certificados para Apache, NGINX, Postfix, LDAP, etc.

Parte 4: Automatização (Capítulos 22-26)

Domine certmonger, crypto-policies, Let’s Encrypt, Ansible.

Parte 5: Solução de Problemas (Capítulos 27-33) ⭐

É aqui que você se torna um especialista! Solução sistemática de problemas, erros comuns, procedimentos de emergência.

Parte 6: Migração (Capítulos 34-37)

Atualizações de versão RHEL e migração de certificados.

Parte 7: Segurança (Capítulos 38-41)

Modo FIPS, conformidade, fortalecimento, auditoria.

Apêndices

Tópicos avançados opcionais (Kubernetes, Vault, Zero Trust, etc.)


2.11 Como Usar Este Tutorial

Para Novos Usuários

📖 Leia os capítulos em ordem. Cada um se baseia no conhecimento anterior.

Para Usuários Experientes

🎯 Pule para solução de problemas (Parte 5) ou serviços específicos (Parte 3).

Para Engenheiros de Suporte

🚨 Comece com Capítulo 27 (Metodologia de Solução de Problemas de Certificados RHEL), depois mergulhe em detalhes.

Labs Práticos

Cada capítulo inclui exemplos práticos. Você precisará:

  • Um sistema RHEL (VM ou contêiner serve)
  • Acesso root ou sudo
  • Conectividade à internet (para instalações de pacotes)

2.12 Conceitos Chave a Dominar

Ao final deste tutorial, você entenderá:

  • O que são certificados e por que RHEL os usa
  • Como funciona a confiança em sistemas RHEL
  • Onde vivem os certificados (/etc/pki/)
  • Quais ferramentas usar (openssl, certutil, certmonger)
  • Diferenças de versão (RHEL 7 vs 8 vs 9 vs 10)
  • Como resolver problemas de qualquer certificado
  • Como automatizar o ciclo de vida de certificados
  • Como proteger sistemas (FIPS, conformidade)

2.13 Impacto no Mundo Real

Problemas de certificados causam:

  • ❌ Interrupções de serviço (certificados expirados)
  • ❌ Vulnerabilidades de segurança (cifras fracas)
  • ❌ Migrações falhadas (atualizações RHEL)
  • ❌ Falhas de conformidade (rejeições de auditoria)
  • ❌ Perda de produtividade (tempo de solução de problemas)

Após este tutorial:

  • ✅ Prevenir problemas antes que aconteçam
  • ✅ Resolver problemas em minutos, não horas
  • ✅ Automatizar gestão de certificados
  • ✅ Passar auditorias de segurança
  • ✅ Migrar versões RHEL com confiança

2.14 Seu Primeiro Exercício

Vamos verificar que seu sistema RHEL está pronto:

# Verificar versão RHEL
cat /etc/redhat-release

# Verificar OpenSSL
openssl version

# Verificar se certmonger está instalado
rpm -q certmonger

# Verificar se você pode usar sudo
sudo whoami

# Verificar conectividade à internet (para instalações de pacotes)
ping -c 3 access.redhat.com

# Listar CAs confiáveis atuais (amostra)
trust list | head -20

✅ Se todos os comandos funcionam, você está pronto para prosseguir!


2.15 Vamos Começar!

Agora você entende:

  • O que são certificados
  • Por que importam no RHEL
  • Onde vivem no sistema de arquivos
  • Quais ferramentas você usará
  • O que você aprenderá neste tutorial

Pronto para mergulhar mais fundo?


Referência Rápida

┌─────────────────────────────────────────────────────────────────┐
│ INÍCIO RÁPIDO DE CERTIFICADO (RHEL)                             │
├─────────────────────────────────────────────────────────────────┤
│ Ver cert:           openssl x509 -in cert.crt -noout -text      │
│ Ver expiração:      openssl x509 -in cert.crt -noout -dates     │
│ Adicionar CA:       cp ca.crt /etc/pki/ca-trust/source/anchors/ │
│                     sudo update-ca-trust                        │
│ Listar rastreados:  getcert list                                │
│ Ver política:       update-crypto-policies --show  (RHEL 8+)    │
└─────────────────────────────────────────────────────────────────┘

Localização cert:  /etc/pki/tls/certs/
Localização key:   /etc/pki/tls/private/  (modo 600!)
Confiança CA:      /etc/pki/ca-trust/

🧪 Laboratório Prático

Lab 01: Configuração do Ambiente

Valide seu ambiente RHEL e instale ferramentas essenciais de gerenciamento de certificados

  • 📁 Localização: labs/pt_BR/01-environment-setup/
  • ⏱️ Tempo: 15-20 minutos
  • 🎯 Nível: Iniciante

Navegação do Capítulo

Capítulo 3: Visão Geral das Ferramentas de Certificados do RHEL

Objetivo de Aprendizagem: Familiarize-se com as ferramentas essenciais para gerenciar certificados no RHEL para que você saiba qual ferramenta usar para cada tarefa.


3.1 Sua Caixa de Ferramentas de Certificados

Ao trabalhar com certificados no RHEL, você usará estas ferramentas principais:

FerramentaUso PrincipalVersões RHELQuando Usar
opensslOperações de certificados, testesTodasGerar chaves/CSRs, inspecionar certs, testar conexões
certutilGerenciamento de base de dados NSSTodasBDs de cert estilo Firefox/Mozilla
update-ca-trustGerenciamento de repositório de confiançaTodasAdicionar/remover CAs confiáveis
certmongerRenovação automáticaTodasRastrear e renovar certificados automaticamente
crypto-policiesSegurança em todo o sistemaRHEL 8+Controlar versões TLS e cifras
getcertCLI do certmongerTodasSolicitar e gerenciar certs rastreados
trustGerenciamento de confiança P11-kitTodas (aprimorado RHEL 8+)Operações avançadas de confiança

3.2 OpenSSL - O Canivete Suíço

Disponível: Todas as versões RHEL Pacote: openssl

Diferenças de Versão

# Verificar sua versão
openssl version

# RHEL 7: OpenSSL 1.0.2k-26
# RHEL 8: OpenSSL 1.1.1k-14
# RHEL 9: OpenSSL 3.5.5-2
# RHEL 10: OpenSSL 3.5.5-2

Usos Comuns

#============================================#
# INSPECIONAR CERTIFICADOS
#============================================#

# Ver detalhes do certificado
openssl x509 -in cert.crt -noout -text

# Verificar expiração
openssl x509 -in cert.crt -noout -dates
openssl x509 -in cert.crt -noout -checkend 86400  # Verificar se expira em 24h

# Ver assunto do certificado
openssl x509 -in cert.crt -noout -subject -issuer


#============================================#
# GERAR CHAVES
#============================================#

# Estilo RHEL 7 (ainda funciona em todas as versões)
openssl genrsa -out server.key 2048

# Estilo moderno RHEL 8+ (recomendado)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

# Chave EC RHEL 9+ (curva elíptica)
openssl genpkey -algorithm EC -out ec.key -pkeyopt ec_paramgen_curve:P-256


#============================================#
# CRIAR CSR (Solicitação de Assinatura de Certificado)
#============================================#

# CSR básico
openssl req -new -key server.key -out server.csr \
  -subj "/C=US/ST=State/L=City/O=Organization/CN=server.example.com"

# CSR com SANs (requerido para navegadores modernos!)
openssl req -new -key server.key -out server.csr \
  -subj "/CN=server.example.com" \
  -addext "subjectAltName=DNS:server.example.com,DNS:www.example.com"


#============================================#
# TESTAR CONEXÕES
#============================================#

# Testar HTTPS
openssl s_client -connect server.example.com:443 -servername server.example.com

# Testar versão TLS específica
openssl s_client -connect server.example.com:443 -tls1_2
openssl s_client -connect server.example.com:443 -tls1_3

# Testar LDAPS
openssl s_client -connect ldap.example.com:636

# Testar SMTP com STARTTLS
openssl s_client -connect mail.example.com:25 -starttls smtp

Diferenças Específicas por Versão

RHEL 7 (OpenSSL 1.0.2k):

  • ✅ Estável e bem testado
  • ❌ Sem suporte TLS 1.3
  • ❌ Sintaxe de comando mais antiga

RHEL 8 (OpenSSL 1.1.1k):

  • ✅ Suporte TLS 1.3
  • ✅ Sintaxe de comando moderna
  • ✅ Melhores padrões

RHEL 9/10 (OpenSSL 3.5.5):

  • ✅ Arquitetura de provedores
  • ✅ Suporte FIPS aprimorado
  • ⚠️ Mudanças na API (afeta apps personalizadas)
  • ⚠️ Algoritmos legados requerem -provider legacy

3.3 certutil - Ferramenta de Base de Dados NSS

Disponível: Todas as versões RHEL Pacote: nss-tools

Usado para bases de dados de certificados estilo Mozilla/Firefox.

Usos Comuns

#============================================#
# GERENCIAR BASE DE DADOS NSS
#============================================#

# Criar nova base de dados
certutil -N -d /etc/pki/nssdb

# Listar certificados
certutil -L -d /etc/pki/nssdb

# Adicionar certificado CA
certutil -A -n "My CA" -t "CT,C,C" -d /etc/pki/nssdb -i ca.crt

# Deletar certificado
certutil -D -n "Certificate Name" -d /etc/pki/nssdb

# Exportar certificado
certutil -L -n "Certificate Name" -d /etc/pki/nssdb -a > exported.crt

Quando Usar certutil

  • Gerenciar certificados Firefox/Thunderbird
  • Trabalhar com aplicações que usam NSS (muitos serviços Red Hat)
  • Quando você vê arquivos .db em /etc/pki/nssdb/

3.4 update-ca-trust - Gerenciamento de Repositório de Confiança

Disponível: Todas as versões RHEL Pacote: ca-certificates (instalado por padrão)

Gerencia quais Autoridades Certificadoras (CAs) seu sistema confia.

Como Funciona

Suas CAs Personalizadas
  ↓
/etc/pki/ca-trust/source/anchors/
  ↓
update-ca-trust extract
  ↓
/etc/pki/ca-trust/extracted/
  ├── pem/tls-ca-bundle.pem       (OpenSSL/Python/Ruby)
  ├── openssl/ca-bundle.trust.crt (Específico OpenSSL)
  └── java/cacerts                (Aplicações Java)

Usos Comuns

#============================================#
# ADICIONAR CA PERSONALIZADA
#============================================#

# Passo 1: Copiar certificado CA
sudo cp corporate-ca.crt /etc/pki/ca-trust/source/anchors/

# Passo 2: Atualizar repositório de confiança
sudo update-ca-trust extract

# É isso! Agora todas as aplicações confiam nesta CA


#============================================#
# REMOVER/BLOQUEAR CA (RHEL 8+)
#============================================#

# Bloquear uma CA comprometida
sudo cp compromised-ca.crt /etc/pki/ca-trust/source/blacklist/
sudo update-ca-trust extract


#============================================#
# VERIFICAR CONFIANÇA
#============================================#

# Verificar se certificado é confiável
openssl verify /path/to/cert.crt

# Listar todas as CAs confiáveis
trust list | grep "certificate-authority"

# Procurar CA específica
trust list | grep -i "Let's Encrypt"

Diretórios Chave

/etc/pki/ca-trust/
├── source/
│   ├── anchors/          ← Adicione suas CAs confiáveis aqui
│   └── blacklist/        ← CAs na lista negra (RHEL 8+)
└── extracted/
    ├── pem/              ← Usado pela maioria das apps
    ├── openssl/          ← Específico OpenSSL
    └── java/             ← Aplicações Java

3.5 certmonger - Renovação Automática de Certificados

Disponível: Todas as versões RHEL Pacote: certmonger

A ferramenta “configure e esqueça” para certificados.

O Que Faz

certmonger:

  • Rastreia datas de expiração de certificados
  • Renova automaticamente antes de expirar
  • Funciona com múltiplas CAs (IPA, Let’s Encrypt, externa)
  • Executa comandos pós-renovação (ex: reiniciar serviços)

Fluxo de Trabalho Básico

#============================================#
# INSTALAÇÃO
#============================================#

sudo dnf install certmonger
sudo systemctl enable --now certmonger


#============================================#
# SOLICITAR CERTIFICADO
#============================================#

# De FreeIPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -D web.example.com \
  -K host/web.example.com@REALM

# Autoassinado (para testes)
sudo getcert request \
  -f /etc/pki/tls/certs/test.crt \
  -k /etc/pki/tls/private/test.key


#============================================#
# MONITORAR CERTIFICADOS
#============================================#

# Listar todos os certificados rastreados
sudo getcert list

# Verificar certificado específico
sudo getcert list -f /etc/pki/tls/certs/web.crt

# Observar renovação
sudo journalctl -u certmonger -f

Recursos Chave por Versão

RHEL 7:

  • Rastreamento e renovação básicos
  • Integração IPA
  • Configuração manual

RHEL 8:

  • Integração IPA aprimorada
  • Melhor relatório de erros
  • Comandos pós-salvamento

RHEL 9:

  • Suporte ACME (Let’s Encrypt!)
  • Monitoramento aprimorado
  • Melhor relatório de status
# RHEL 9 - Integração Let's Encrypt
sudo getcert request \
  -f /etc/pki/tls/certs/acme.crt \
  -k /etc/pki/tls/private/acme.key \
  -D example.com \
  -c acme-letsencrypt \
  -C "systemctl reload httpd"

3.6 crypto-policies - Segurança em Todo o Sistema (RHEL 8+)

Disponível: Apenas RHEL 8, 9, 10 Pacote: crypto-policies (instalado por padrão)

MUDANÇA DE JOGO: Controle versões TLS, cifras e tamanhos de chave em todo o sistema!

A Grande Ideia

Em vez de configurar cada aplicação individualmente:

❌ FORMA ANTIGA (RHEL 7):
- Configurar cifras SSL do Apache
- Configurar cifras SSL do NGINX
- Configurar ajustes TLS do Postfix
- Configurar ajustes TLS do OpenLDAP
- Configurar cada aplicação...

✅ FORMA NOVA (RHEL 8+):
- Definir UMA política do sistema
- Todas as aplicações seguem automaticamente!

Políticas Disponíveis

# Verificar política atual
update-crypto-policies --show

# Políticas:
# DEFAULT  - Segurança equilibrada (TLS 1.2+, RSA 2048+)
# LEGACY   - Modo de compatibilidade (permite TLS 1.0/1.1)
# FUTURE   - Segurança mais rigorosa (TLS 1.2+, RSA 3072+)
# FIPS     - Modo de conformidade federal

Comparação de Políticas

CaracterísticaLEGACYDEFAULTFUTUREFIPS
TLS 1.0/1.1✅ Permitido❌ Bloqueado❌ Bloqueado❌ Bloqueado
TLS 1.2✅ Sim✅ Sim✅ Sim✅ Sim
TLS 1.3✅ Sim✅ Sim✅ Sim✅ Sim
RSA Mín1024 bits2048 bits3072 bits2048 bits
Assinaturas SHA-1⚠️ Permitido❌ Bloqueado❌ Bloqueado❌ Bloqueado
Cifra 3DES⚠️ Permitido❌ Bloqueado❌ Bloqueado❌ Bloqueado

Usos Comuns

#============================================#
# MUDAR POLÍTICA
#============================================#

# Definir política FUTURE (mais rigorosa)
sudo update-crypto-policies --set FUTURE
# Reiniciar ou reiniciar serviços

# Usar temporariamente LEGACY (para sistemas antigos)
sudo update-crypto-policies --set LEGACY
# Nota: LEGACY deve ser temporário!


#============================================#
# POLÍTICAS PERSONALIZADAS (RHEL 9+)
#============================================#

# Subpolíticas - modificar política existente
sudo update-crypto-policies --set DEFAULT:NO-SHA1
sudo update-crypto-policies --set FUTURE:AD-SUPPORT


#============================================#
# RESOLVER PROBLEMAS DE POLÍTICA
#============================================#

# Se serviço falha após mudança de política:
# 1. Verificar política atual
update-crypto-policies --show

# 2. Verificar configuração de aplicação
cat /etc/crypto-policies/back-ends/opensslcnf.config

# 3. Testar com LEGACY temporariamente
sudo update-crypto-policies --set LEGACY
sudo systemctl restart <service>

O Que crypto-policies Controla

Configura automaticamente:

  • OpenSSL
  • GnuTLS
  • NSS
  • OpenJDK/Java
  • BIND
  • Kerberos
  • OpenSSH
  • E mais!

Resumo: Mude uma configuração, atualize a segurança de todo o sistema. Brilhante!


3.7 Guia de Seleção de Ferramenta

“Qual ferramenta devo usar?”

┌─────────────────────────────────────────────────────────────┐
│ ÁRVORE DE DECISÃO DE FERRAMENTA DE CERTIFICADO              │
└─────────────────────────────────────────────────────────────┘

Eu preciso...
│
├─ Inspecionar um certificado
│  └─ Usar: openssl x509 -in cert.crt -noout -text
│
├─ Gerar uma chave/CSR
│  └─ Usar: openssl genpkey / openssl req
│
├─ Testar uma conexão TLS
│  └─ Usar: openssl s_client -connect host:port
│
├─ Adicionar uma CA confiável em todo o sistema
│  └─ Usar: copiar para /etc/pki/ca-trust/source/anchors/
│           depois: update-ca-trust
│
├─ Renovar certificados automaticamente
│  └─ Usar: certmonger (getcert/ipa-getcert)
│
├─ Mudar política TLS do sistema (RHEL 8+)
│  └─ Usar: update-crypto-policies --set <POLICY>
│
├─ Trabalhar com bases de dados Firefox/NSS
│  └─ Usar: certutil
│
└─ Resolver problemas de certificados
   └─ Usar: Metodologia do Capítulo 27!

3.8 Matriz de Disponibilidade de Ferramentas

FerramentaRHEL 7RHEL 8RHEL 9RHEL 10Notas
openssl1.0.2k1.1.1k3.5.53.5.5Ferramenta principal
certutilFerramenta NSS
update-ca-trust✅ Aprimorado✅ Aprimorado✅ AprimoradoGestão confiança
certmonger✅ Aprimorado✅ ACME✅ ACMERenovação auto
crypto-policies✅ Subpolíticas✅ AprimoradoPolítica sistema
getcertCLI certmonger
trust✅ BásicoFerramenta p11-kit

3.9 Verificação de Instalação

Verifique que você tem as ferramentas essenciais:

#============================================#
# VERIFICAR FERRAMENTAS INSTALADAS
#============================================#

# OpenSSL (deve estar instalado por padrão)
openssl version

# Ferramentas NSS
rpm -q nss-tools || echo "Instalar com: sudo dnf install nss-tools"

# certmonger
rpm -q certmonger || echo "Instalar com: sudo dnf install certmonger"

# Verificar crypto-policies (apenas RHEL 8+)
which update-crypto-policies &>/dev/null && \
  echo "Crypto-policies disponível: $(update-crypto-policies --show)" || \
  echo "Crypto-policies não disponível (RHEL 7 ou anterior)"

3.10 Comandos de Referência Rápida

# === OpenSSL ===
openssl version                          # Verificar versão
openssl x509 -in cert.crt -noout -text   # Inspecionar certificado
openssl s_client -connect host:443       # Testar HTTPS

# === Repositório de Confiança ===
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust                     # Adicionar CA confiável

# === certmonger ===
sudo getcert list                        # Listar certs rastreados
sudo getcert list -f /path/to/cert.crt   # Verificar cert específico
sudo journalctl -u certmonger -f         # Ver logs

# === Crypto-Policies (RHEL 8+) ===
update-crypto-policies --show            # Política atual
sudo update-crypto-policies --set <POL>  # Mudar política

# === NSS ===
certutil -L -d /etc/pki/nssdb            # Listar certs NSS

3.11 O Que Vem a Seguir?

Agora que você conhece as ferramentas, você aprenderá:

  • Capítulo 4: Conceitos básicos de criptografia
  • Capítulo 5: Entendendo certificados X.509
  • Capítulo 6: Mergulho profundo em repositório de confiança RHEL
  • Capítulo 22: Domínio de certmonger (detalhado)
  • Capítulo 23: Mergulho profundo em Crypto-policies (detalhado)

Cartão de Referência Rápida

┌────────────────────────────────────────────────────────────┐
│ FOLHA DE DICAS DE FERRAMENTAS DE CERTIFICADOS RHEL         │
├────────────────────────────────────────────────────────────┤
│ Inspecionar:   openssl x509 -in cert.crt -noout -text      │
│ Testar:        openssl s_client -connect host:443          │
│ Adicionar CA:  cp ca.crt /etc/pki/ca-trust/source/anchors/ │
│                sudo update-ca-trust                        │
│ Renovar auto:  sudo getcert list                           │
│ Política:      update-crypto-policies --show  (RHEL 8+)    │
│ NSS:           certutil -L -d /etc/pki/nssdb               │
└────────────────────────────────────────────────────────────┘

Navegação do Capítulo

Capítulo 4: Criptografia Básica para Administradores RHEL

Foco Prático: Aprenda os conceitos de criptografia necessários para gerenciar certificados no RHEL - não é necessário um doutorado!

4.1 Simétrica vs Assimétrica

Criptografia simétrica (ex. AES) depende de um único segredo compartilhado. Em contraste, criptografia assimétrica fornece duas chaves complementares:

  • Chave pública — compartilhe livremente, usada para criptografia ou verificação de assinatura.
  • Chave privada — mantenha secreta, usada para descriptografia ou assinatura.

4.2 RSA em Poucas Palavras

  1. Selecione dois números primos grandes p e q.
  2. Calcule o módulo n = p × q.
  3. Derive o expoente público e e o expoente privado d tal que e × d ≡ 1 (mod φ(n)).
  4. O par (n, e) é público; (n, d) é privado.

A força deriva da dificuldade de fatorar n.

4.3 Criptografia de Curva Elíptica (ECC)

ECC oferece segurança comparável com tamanhos de chave muito menores ao operar sobre pontos em curvas elípticas. Curvas populares incluem secp256r1 (P-256) e Curve25519.

AlgoritmoTamanho de chave para segurança de 128 bits
RSA3072 bits
ECC256 bits

4.4 Lab de Geração de Chaves (OpenSSL)

# Gerar chave privada RSA de 3072 bits
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out rsa.key.pem

# Extrair chave pública
openssl pkey -in rsa.key.pem -pubout -out rsa.pub.pem

# Gerar par de chaves EC P-256
openssl ecparam -genkey -name prime256v1 -out ec.key.pem
openssl pkey -in ec.key.pem -pubout -out ec.pub.pem

Reutilizaremos essas chaves em capítulos posteriores para criar certificados.

4.5 Criptografia Híbrida

No TLS, uma chave de sessão simétrica é trocada usando criptografia assimétrica (RSA ou ECDHE). Isso fornece o melhor dos dois mundos: eficiência e troca segura de chaves.


4.6 Considerações Específicas do RHEL

Geração de Chaves no RHEL por Versão

RHEL 7 (OpenSSL 1.0.2k):

# Estilo antigo (ainda funciona em todas as versões)
openssl genrsa -out server.key 2048

# Extrair chave pública
openssl rsa -in server.key -pubout -out server.pub

RHEL 8+ (OpenSSL 1.1.1k / 3.5.5):

# Estilo moderno (recomendado)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

# Extrair chave pública
openssl pkey -in server.key -pubout -out server.pub

Tamanhos Mínimos de Chave por Versão RHEL

Versão RHELRSA MínimoECC MínimoAplicado Por
RHEL 7Nenhum (fraco permitido)NenhumConfiguração manual
RHEL 82048 bitsP-256crypto-policy DEFAULT
RHEL 92048 bitsP-256crypto-policy DEFAULT
RHEL 102048 bitsP-256crypto-policy DEFAULT

Recomendação: Sempre use RSA 2048+ ou ECC P-256+ para compatibilidade!

Testes no RHEL

# Gerar par de chaves de teste (RHEL 8+)
openssl genpkey -algorithm RSA -out test.key -pkeyopt rsa_keygen_bits:2048

# Verificar chave
openssl pkey -in test.key -text -noout

# Criar dados de teste
echo "Olá RHEL" > message.txt

# Assinar com chave privada
openssl dgst -sha256 -sign test.key -out message.sig message.txt

# Verificar com chave pública
openssl dgst -sha256 -verify test.pub -signature message.sig message.txt
# Verified OK

Referência Rápida

┌─────────────────────────────────────────────────────────────────┐
│ CRIPTOGRAFIA PARA ADMINISTRADORES RHEL                          │
├─────────────────────────────────────────────────────────────────┤
│ Assimétrica:   Chave pública (compartilhar) + Privada (secreta) │
│ Algoritmos:    RSA, ECC (Curva Elíptica)                        │
│                                                                 │
│ Tamanhos RSA:  2048 bits (mínimo no RHEL 8+)                    │
│                4096 bits (recomendado)                          │
│                                                                 │
│ Curvas ECC:    P-256 (secp256r1) - mínimo                       │
│                P-384 (secp384r1) - recomendado                  │
│                                                                 │
│ RHEL 7:        openssl genrsa -out key 2048                     │
│ RHEL 8/9/10:   openssl genpkey -algorithm RSA -out key          │
│                                                                 │
│ Caso de uso:   Certificados TLS/SSL                             │
│ Segurança:     Chave privada DEVE ser protegida (chmod 600)     │
└─────────────────────────────────────────────────────────────────┘

🧪 Laboratório Prático

Lab 02: Geração de Chaves

Gere pares de chaves RSA e ECC, extraia chaves públicas e compare algoritmos

  • 📁 Localização: labs/pt_BR/02-key-generation/
  • ⏱️ Tempo: 20-25 minutos
  • 🎯 Nível: Iniciante

Navegação do Capítulo

Capítulo 5: Certificados X.509 no RHEL

Formato Padrão: X.509 é o padrão de certificado usado em todos os lugares no RHEL. Aprenda sua estrutura e como trabalhar com ele em sistemas Red Hat.

5.1 Origens do Padrão

X.509 emergiu do projeto de diretório X.500 (ITU-T, 1988) para definir um certificado de identidade padrão—um documento que vincula uma chave pública a um nome de assunto, assinado por uma autoridade confiável.

5.2 Anatomia do Certificado

CampoPropósito
VersionGeralmente v3 (adiciona extensões)
Serial NumberÚnico por CA
Signature Algorithmex. sha256WithRSAEncryption
IssuerNome Distinguido (DN) da CA
ValidityDatas Not Before e Not After
SubjectDN da entidade (CN, O, C…)
Subject Public Key InfoAlgoritmo + Chave
ExtensionsKey Usage, SAN, CRL DP, etc.
SignatureAssinatura digital da CA

5.3 Extensões Comuns

  • Subject Alternative Name (SAN) — Hosts/IPs vinculados ao cert.
  • Key Usage / Extended Key Usage — Operações permitidas (servidor TLS, assinatura de código…).
  • Basic Constraints — Indica se cert pode assinar outros (CA:TRUE).

5.4 Visualizar um Certificado

openssl x509 -in server.crt -noout -text

Observe que cada seção corresponde à tabela acima.

5.5 Codificações PEM vs DER

  • PEM — Base64 + cabeçalhos -----BEGIN CERTIFICATE----- (mais comum no RHEL).
  • DER — ASN.1 binário, útil para dispositivos embarcados.

5.6 X.509 em Sistemas RHEL

Localizações de Certificados no RHEL

# Localizações padrão de certificados RHEL
/etc/pki/tls/certs/          # Certificados de servidor (públicos)
/etc/pki/tls/private/        # Chaves privadas (modo 600!)
/etc/pki/ca-trust/           # Certificados CA confiáveis
/etc/pki/nssdb/              # Base de dados NSS (Firefox, etc.)

# Localizações específicas de serviço
/etc/httpd/conf/ssl.crt/     # Apache (alternativa)
/etc/nginx/certs/            # NGINX (personalizado)
/var/lib/pgsql/data/         # PostgreSQL
/etc/openldap/certs/         # OpenLDAP

Visualizar Certificados no RHEL

# Ver detalhes completos do certificado
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -text

# Verificações rápidas (foco sysadmin RHEL)
openssl x509 -in server.crt -noout -subject             # Para quem é?
openssl x509 -in server.crt -noout -issuer              # Quem assinou?
openssl x509 -in server.crt -noout -dates               # Quando é válido?
openssl x509 -in server.crt -noout -ext subjectAltName  # SANs (crítico!)

# Verificar se expirou
openssl x509 -in server.crt -noout -checkend 0
# Saída 0 = válido, Saída 1 = expirado

Diferenças de Versão RHEL para X.509

Versão RHELOpenSSLRigor de ValidaçãoMudanças Chave
RHEL 71.0.2kPadrãoSANs recomendados
RHEL 81.1.1kMais rigorosoSANs fortemente recomendados
RHEL 93.5.5Muito rigorosoSANs requeridos, SHA-1 bloqueado
RHEL 103.5.5Muito rigorosoIgual ao RHEL 9

Ponto Chave: Navegadores modernos e RHEL 9+ requerem SANs (Subject Alternative Names)!

Criar Certificados X.509 no RHEL

# Fluxo de trabalho completo no RHEL

# Passo 1: Gerar chave privada
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

# Passo 2: Criar CSR (Solicitação de Assinatura de Certificado)
openssl req -new -key server.key -out server.csr \
  -subj "/C=US/ST=State/O=Company/CN=server.example.com" \
  -addext "subjectAltName=DNS:server.example.com,DNS:www.example.com"

# Passo 3: Autoassinado (apenas para testes!)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

# Passo 4: Ver seu certificado X.509
openssl x509 -in server.crt -noout -text

# Passo 5: Instalar no RHEL
sudo cp server.crt /etc/pki/tls/certs/
sudo cp server.key /etc/pki/tls/private/
sudo chmod 600 /etc/pki/tls/private/server.key

Referência Rápida

┌────────────────────────────────────────────────────────────────────┐
│ CERTIFICADOS X.509 NO RHEL                                         │
├────────────────────────────────────────────────────────────────────┤
│ Padrão:       X.509 v3 (com extensões)                             │
│ Codificação:  PEM (Base64, legível por humanos)                    │
│                                                                    │
│ Ver:          openssl x509 -in cert.crt -noout -text               │
│ Assunto:      openssl x509 -in cert.crt -noout -subject            │
│ Expiração:    openssl x509 -in cert.crt -noout -dates              │
│ SANs:         openssl x509 -in cert.crt -noout -ext subjectAltName │
│                                                                    │
│ Localização:  /etc/pki/tls/certs/ (certificados)                   │
│               /etc/pki/tls/private/ (chaves, modo 600!)            │
│                                                                    │
│ Crítico:      SANs são REQUERIDOS no RHEL 9+                       │
│               Assinatura SHA-256+ requerida no RHEL 8+             │
└────────────────────────────────────────────────────────────────────┘

🧪 Laboratório Prático

Lab 04: Certificados X.509

Crie certificados autoassinados, gere CSRs, inspecione certificados e converta formatos

  • 📁 Localização: labs/pt_BR/04-x509-certificates/
  • ⏱️ Tempo: 25-30 minutos
  • 🎯 Nível: Iniciante

Navegação do Capítulo

Capítulo 6: Mergulho Profundo no Repositório de Confiança RHEL

Arquitetura de Confiança: Entender como o RHEL valida certificados e gerencia CAs confiáveis é essencial para solucionar problemas de certificados. Este capítulo vai além do básico: ele cobre os mecanismos internos do update-ca-trust, como o p11-kit processa fontes de confiança, o que acontece com certificados duplicados e como depurar problemas de confiança com trust list.

6.1 Arquitetura do Repositório de Confiança RHEL

Como o RHEL Valida Certificados

Quando qualquer aplicação no RHEL valida um certificado:

  1. Verificar assinatura do certificado usando a chave pública do emissor
  2. Encontrar certificado do emissor no repositório de confiança
  3. Repetir até alcançar a raiz confiável da CA
  4. Verificar se a CA raiz é confiável pelo sistema RHEL

Localização do repositório de confiança: /etc/pki/ca-trust/

O Papel do p11-kit

O repositório de confiança do RHEL não é um arquivo plano que as aplicações leem diretamente. É um sistema gerenciado construído sobre o p11-kit, que fornece um módulo de confiança PKCS#11. Os componentes principais são:

ComponenteFunção
p11-kitMiddleware que carrega módulos de confiança e os expõe via PKCS#11
p11-kit-trustO módulo de confiança (/usr/lib64/pkcs11/p11-kit-trust.so) que lê os certificados de origem
update-ca-trustScript shell que invoca p11-kit extract para regenerar os bundles extraídos
trustInterface CLI para inspecionar e modificar objetos de confiança gerenciados pelo p11-kit

Aplicações como curl, wget, OpenSSL, GnuTLS e NSS consomem os bundles extraídos. Elas nunca leem os diretórios de origem diretamente.


6.2 Estrutura de Diretórios do Repositório de Confiança

RHEL 7/8:

/etc/pki/ca-trust/
├── source/
│   ├── anchors/                   ← Certificados CA confiáveis adicionados pelo admin
│   ├── blacklist/                 ← Certificados desconfiados adicionados pelo admin
│   └── ca-bundle.legacy.crt       ← Bundle legado (apenas para compatibilidade)
├── extracted/
│   ├── pem/
│   │   ├── tls-ca-bundle.pem      ← Para clientes TLS (curl, wget, Python...)
│   │   ├── email-ca-bundle.pem    ← Para validação de email S/MIME
│   │   └── objsign-ca-bundle.pem  ← Para verificação de assinatura de código
│   ├── openssl/
│   │   └── ca-bundle.trust.crt    ← Formato "certificado confiável" do OpenSSL
│   ├── java/
│   │   └── cacerts                ← Keystore JKS do Java
│   └── edk2/
│       └── cacerts.bin            ← Formato de firmware UEFI
└── README

/usr/share/pki/ca-trust-source/
├── anchors/                       ← Âncoras de confiança fornecidas por pacotes (de RPMs)
├── blacklist/                     ← Certificados desconfiados fornecidos por pacotes
└── ca-bundle.trust.p11-kit        ← Bundle de CAs Mozilla fornecido pelo RPM ca-certificates

RHEL 9/10+: O diretório blacklist/ foi renomeado para blocklist/:

/etc/pki/ca-trust/
├── source/
│   ├── anchors/                   ← Certificados CA confiáveis adicionados pelo admin
│   ├── blocklist/                 ← Certificados desconfiados adicionados pelo admin
│   └── ca-bundle.legacy.crt       ← Bundle legado (apenas para compatibilidade)
├── extracted/
│   └── (mesma estrutura acima)
└── README

/usr/share/pki/ca-trust-source/
├── anchors/                       ← Âncoras de confiança fornecidas por pacotes (de RPMs)
├── blocklist/                     ← Certificados desconfiados fornecidos por pacotes
└── ca-bundle.trust.p11-kit        ← Bundle de CAs Mozilla fornecido pelo RPM ca-certificates

Convenção de nomenclatura: Ao longo deste capítulo, blacklist/ refere-se ao nome de diretório do RHEL 7/8 e blocklist/ refere-se ao nome de diretório do RHEL 9/10+. Ambos servem o mesmo propósito. Quando você vir um caminho como source/blacklist/, substitua por source/blocklist/ no RHEL 9+.

Prioridade dos Diretórios de Origem

O pipeline update-ca-trust lê certificados de múltiplos diretórios de origem, processados em uma ordem definida:

PrioridadeDiretórioGerenciado por
1 (mais baixa)/usr/share/pki/ca-trust-source/Pacotes RPM (ca-certificates)
2 (mais alta)/etc/pki/ca-trust/source/Administrador do sistema

Dentro de cada localização:

  • anchors/ — Certificados colocados aqui são tratados como CAs confiáveis
  • blacklist/ (RHEL 7/8) ou blocklist/ (RHEL 9+) — Certificados colocados aqui são tratados como explicitamente desconfiados

Os caminhos /etc/pki/ sempre sobrescrevem os caminhos /usr/share/pki/. Isso segue a convenção padrão do RHEL: /usr/share/ contém padrões de pacotes, /etc/ contém personalizações do administrador.


6.3 O Que Acontece Quando Você Executa update-ca-trust

O Pipeline de Execução

update-ca-trust é um script shell (inspecione você mesmo: cat /usr/bin/update-ca-trust). Quando você executa sudo update-ca-trust, a seguinte sequência ocorre:

Passo 1: Coletar todas as fontes de confiança

O p11-kit lê cada arquivo de certificado desses diretórios:

/usr/share/pki/ca-trust-source/anchors/
/usr/share/pki/ca-trust-source/blacklist/    ← RHEL 7/8
/usr/share/pki/ca-trust-source/blocklist/    ← RHEL 9+
/usr/share/pki/ca-trust-source/ca-bundle.trust.p11-kit
/etc/pki/ca-trust/source/anchors/
/etc/pki/ca-trust/source/blacklist/          ← RHEL 7/8
/etc/pki/ca-trust/source/blocklist/          ← RHEL 9+

Ele aceita os formatos PEM (.pem, .crt), DER (.der) e objetos de confiança p11-kit (.p11-kit).

Passo 2: Analisar atributos de confiança

Para cada certificado, o p11-kit determina sua disposição de confiança. O formato PEM do arquivo de certificado importa:

  • -----BEGIN TRUSTED CERTIFICATE----- (formato “confiável” do OpenSSL) — Contém o certificado mais dados auxiliares de confiança: listas explícitas de OIDs de uso de chave confiáveis e rejeitados. O p11-kit lê esses atributos de confiança/rejeição incorporados diretamente.
  • -----BEGIN CERTIFICATE----- (PEM simples) ou DER — Contém apenas o certificado sem metadados de confiança. O p11-kit atribui confiança baseado exclusivamente no diretório onde o arquivo está colocado (anchors/ = confiável, blacklist//blocklist/ = desconfiado).
  • Arquivos no formato .p11-kit — Contêm objetos de confiança PKCS#11 com atributos granulares (trusted, x-distrusted, OIDs de propósito). Usado pelo arquivo ca-bundle.trust.p11-kit fornecido com o pacote ca-certificates.

Crítico: Os formatos BEGIN TRUSTED CERTIFICATE e BEGIN CERTIFICATE não são intercambiáveis. Um arquivo BEGIN TRUSTED CERTIFICATE carrega dados auxiliares de confiança — listas explícitas de OIDs de uso confiável e/ou rejeitado. Quando nenhum uso é listado (atributos de confiança vazios), o p11-kit interpreta como “confiável para nada” — efetivamente desconfiado. Se o mesmo certificado também existe como BEGIN CERTIFICATE simples (que implica confiança para todos os propósitos), o p11-kit detecta afirmações de confiança contraditórias e marca o certificado como desconfiado. Este conflito ocorre em dois casos: (1) o BEGIN TRUSTED CERTIFICATE tem usos rejeitados explícitos, ou (2) tem atributos de confiança vazios (nenhum uso confiável, nenhum uso rejeitado). Veja a Seção 6.6 para detalhes.

Passo 3: Mesclar e resolver conflitos

Quando o mesmo certificado (correspondido pelo seu conteúdo codificado em DER) aparece em múltiplas localizações de origem, o p11-kit aplica regras de mesclagem:

  1. Desconfiança prevalece sobre confiança. Se um certificado aparece tanto em anchors/ quanto em blacklist//blocklist/, ele é desconfiado.

  2. Admin sobrescreve pacotes. Atributos de confiança definidos em /etc/pki/ca-trust/source/ sobrescrevem aqueles de /usr/share/pki/ca-trust-source/.

  3. Atributos explícitos sobrescrevem padrões. Um arquivo .p11-kit com restrições de propósito específicas sobrescreve a confiança genérica dada a um PEM simples em anchors/.

  4. Formatos de confiança conflitantes causam desconfiança. Se o mesmo certificado (impressão digital idêntica) aparece como BEGIN TRUSTED CERTIFICATE (ou .p11-kit) e como BEGIN CERTIFICATE, a desconfiança ocorre em dois casos:

    • O BEGIN TRUSTED CERTIFICATE tem usos rejeitados explícitos — a rejeição contradiz a confiança implícita total do PEM simples.
    • O BEGIN TRUSTED CERTIFICATE tem atributos de confiança vazios (nenhum uso confiável, nenhum uso rejeitado) — o p11-kit interpreta “nenhum uso listado” como “confiável para nada”, o que contradiz o implícito “confiável para todos os propósitos” do PEM simples.

    Em ambos os casos, o p11-kit marca o certificado como desconfiado.

Esta é a causa mais comum de desconfiança inesperada. Um administrador copia um arquivo PEM simples em source/anchors/ sem perceber que o mesmo certificado já existe em ca-bundle.trust.p11-kit com atributos de uso rejeitado ou confiança vazia. O resultado: a CA é desconfiada após update-ca-trust, e serviços que dependem dela quebram silenciosamente.

Passo 4: Extrair para bundles específicos de formato

O p11-kit executa comandos de extração para cada formato de saída:

# Bundle PEM para TLS (mais comumente consumido)
p11-kit extract --format=pem-bundle \
    --filter=ca-anchors \
    --overwrite \
    --purpose=server-auth \
    /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

# Bundle PEM para email (S/MIME)
p11-kit extract --format=pem-bundle \
    --filter=ca-anchors \
    --overwrite \
    --purpose=email-protection \
    /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem

# Bundle PEM para assinatura de código
p11-kit extract --format=pem-bundle \
    --filter=ca-anchors \
    --overwrite \
    --purpose=code-signing \
    /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem

# Formato "certificado confiável" do OpenSSL (inclui atributos de confiança/rejeição)
p11-kit extract --format=openssl-bundle \
    --filter=certificates \
    --overwrite \
    /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt

# Keystore Java
p11-kit extract --format=java-cacerts \
    --filter=ca-anchors \
    --overwrite \
    --purpose=server-auth \
    /etc/pki/ca-trust/extracted/java/cacerts

# Formato UEFI EDK2
p11-kit extract --format=edk2-cacerts \
    --filter=ca-anchors \
    --overwrite \
    --purpose=server-auth \
    /etc/pki/ca-trust/extracted/edk2/cacerts.bin

Passo 5: Atualizar symlinks de compatibilidade

O sistema mantém symlinks para que caminhos legados apontem para os bundles extraídos:

/etc/pki/tls/certs/ca-bundle.crt → /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
/etc/pki/tls/certs/ca-bundle.trust.crt → /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
/etc/pki/java/cacerts → /etc/pki/ca-trust/extracted/java/cacerts

update-ca-trust vs update-ca-trust extract

Estes são funcionalmente idênticos. O script update-ca-trust aceita extract como subcomando, mas executar update-ca-trust sem argumentos assume a ação extract como padrão. Não há diferença no comportamento.

# Esses dois comandos produzem resultados idênticos:
sudo update-ca-trust
sudo update-ca-trust extract

O subcomando extract existe para explicitude em scripts e documentação. Historicamente, update-ca-trust também suportava os subcomandos enable e disable (para alternar entre o novo repositório de confiança gerenciado pelo p11-kit e a abordagem legada de arquivo plano), mas esses não são mais relevantes em sistemas RHEL modernos onde o gerenciamento pelo p11-kit está sempre ativo.

# Verificar status atual (apenas informativo no RHEL moderno)
update-ca-trust check

Verificando o Que Mudou

Após executar update-ca-trust, você pode verificar o resultado:

# Contar CAs confiáveis no bundle PEM
grep -c '^-----BEGIN CERTIFICATE-----' /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

# Listar todas as CAs confiáveis via p11-kit
trust list --filter=ca-anchors | grep "label:" | wc -l

# Verificar se uma CA específica está presente
trust list | grep -A 4 "My Company CA"

6.4 Adicionando Certificados CA Personalizados

Passo a Passo

# Passo 1: Copiar certificado CA (formato PEM ou DER)
sudo cp company-ca.crt /etc/pki/ca-trust/source/anchors/

# Passo 2: Atualizar repositório de confiança
sudo update-ca-trust

# Passo 3: Verificar adição
trust list | grep -i "company"

# Passo 4: Testar
curl https://internal-server.example.com

Funciona de forma idêntica no RHEL 7, 8, 9, 10.

Adicionando com Restrições de Propósito

Se uma CA deve ser confiável apenas para autenticação de servidor TLS (não para assinatura de email ou assinatura de código), use o comando trust em vez da abordagem simples de cópia de arquivo:

# Confiar apenas para autenticação de servidor TLS
sudo trust anchor --store /path/to/company-ca.crt

# Ou com restrição explícita de propósito via formato p11-kit
# Criar um arquivo .p11-kit com confiança restrita:
cat > /tmp/company-ca.p11-kit <<'EOF'
[p11-kit-object-v1]
class: x-certificate-extension
label: "My Company CA"
x-public-key-info: <extracted-from-cert>

[p11-kit-object-v1]
class: certificate
label: "My Company CA"
certificate-type: x-509
java-midp-security-domain: 0
trusted: true
x-distrusted: false

[p11-kit-object-v1]
class: x-certificate-extension
label: "My Company CA"
object-id: 2.5.29.37
value: "%06%08%2b%06%01%05%05%07%03%01"
EOF

O comando trust anchor --store lida com isso automaticamente e é a abordagem recomendada no RHEL 8+.


6.5 Recursos do Repositório de Confiança por Versão RHEL

Evolução do Gerenciamento de Confiança

Versão RHELComando trustDesconfiançaDiretório de DesconfiançaNotas
RHEL 7BásicoLimitadablacklist/Gerenciamento manual
RHEL 8AprimoradoSuporte completoblacklist/Integração com p11-kit
RHEL 9AprimoradoSuporte completoblocklist/Renomeado de blacklist/
RHEL 10AprimoradoSuporte completoblocklist/Igual ao RHEL 9

Aprimoramento RHEL 8+:

# Gerenciamento avançado de confiança (RHEL 8+)
trust anchor /path/to/ca.crt --purpose server-auth
trust anchor --remove "pkcs11:id=%CERT_ID%"
trust list --filter=ca-anchors

# Desconfiar de uma CA comprometida
# RHEL 7/8:
sudo cp compromised.crt /etc/pki/ca-trust/source/blacklist/
# RHEL 9+:
sudo cp compromised.crt /etc/pki/ca-trust/source/blocklist/

sudo update-ca-trust

6.6 Certificados Duplicados: O Que Acontece e Como Lidar

Variantes de Formato PEM e Implicações de Confiança

Antes de discutir duplicatas, é essencial entender os três formatos de cabeçalho PEM que o RHEL usa, pois o formato em si carrega semântica de confiança:

Cabeçalho PEMDados de ConfiançaOnde Aparece
-----BEGIN CERTIFICATE-----Nenhum — apenas certificado X.509 brutoArquivos que você baixa, respostas de CSR, exportações manuais
-----BEGIN TRUSTED CERTIFICATE-----Incorporados — inclui listas auxiliares de OIDs de confiança/rejeiçãoBundle extraído do OpenSSL (ca-bundle.trust.crt), alguns arquivos fornecidos por vendedores
Formato .p11-kit (não PEM)Estruturados — objetos de confiança PKCS#11 com atributos granularesca-bundle.trust.p11-kit fornecido pelo RPM ca-certificates

Você pode inspecionar os atributos de confiança incorporados em um arquivo BEGIN TRUSTED CERTIFICATE:

# Mostrar os dados auxiliares de confiança
openssl x509 -in cert.crt -noout -text -trustout 2>/dev/null | grep -A 5 "Trusted Uses\|Rejected Uses"

Um arquivo BEGIN TRUSTED CERTIFICATE com “Rejected Uses: TLS Web Server Authentication” e um arquivo BEGIN CERTIFICATE para o mesmo cert (que não carrega informação de rejeição) são contraditórios da perspectiva do p11-kit.

Entendendo Certificados “Duplicados”

Dois certificados podem ser duplicados em diferentes níveis:

Nível de CorrespondênciaO Que SignificaComo o p11-kit Trata
Codificação DER idêntica, mesmo formatoMesmo certificado byte a byte, mesmo encapsulamento de confiançaDeduplicado — aparece uma vez na saída
Codificação DER idêntica, formato de confiança diferenteMesmo certificado, mas um tem atributos BEGIN TRUSTED CERTIFICATE / .p11-kit e o outro tem BEGIN CERTIFICATEDESCONFIADO se o formato confiável tem usos rejeitados OU atributos de confiança vazios (nenhum uso listado = “confiável para nada”)
Mesmo Subject + Serial + Issuer, DER diferenteMesmo certificado lógico, mas recodificadoTratados como objetos separados — ambos são carregados
Mesmo Subject DN, Serial diferenteCertificados diferentes para a mesma entidade (ex.: CA reemitida)Ambos válidos, ambos carregados independentemente

A distinção crítica: o p11-kit identifica duplicatas pelo conteúdo do certificado codificado em DER, não por campos de metadados. No entanto, “corresponder” o conteúdo DER é apenas metade da história — o que acontece depois depende inteiramente de se os formatos de encapsulamento de confiança concordam:

  • Se os bytes DER brutos do certificado são idênticos e todas as fontes concordam na disposição de confiança → deduplicado, confiável
  • Se os bytes DER brutos do certificado são idênticos mas uma fonte tem OIDs de uso rejeitado incorporados e a outra não → afirmações de confiança contraditórias → DESCONFIADO
  • Se os bytes DER brutos do certificado são idênticos mas uma fonte tem BEGIN TRUSTED CERTIFICATE com atributos de confiança vazios (nenhum uso confiável, nenhum uso rejeitado) → p11-kit interpreta como “confiável para nada” → contradiz confiança implícita total → DESCONFIADO
  • Se os bytes DER brutos do certificado são idênticos e uma fonte tem BEGIN TRUSTED CERTIFICATE com apenas usos confiáveis explícitos (sem usos rejeitados) → certificado é aceito com os propósitos de confiança especificados
  • Se os bytes DER brutos do certificado diferem (mesmo por um único byte) → o p11-kit os trata como certificados separados e ambos são incluídos

Cenário: Formatos de Confiança Conflitantes (Mais Perigoso)

Este é o problema de “duplicata” mais comum e mais prejudicial. Acontece silenciosamente quando um administrador copia um certificado em source/anchors/ sem perceber que o mesmo certificado já existe no bundle do sistema com OIDs de uso rejeitado ou atributos de confiança vazios em seus dados de confiança.

Exemplo:

/usr/share/pki/ca-trust-source/ca-bundle.trust.p11-kit
  → Contém "My Corp CA" como objeto de confiança p11-kit com atributos de confiança específicos
    INCLUINDO usos rejeitados (ex.: "Rejected Uses: TLS Web Server Authentication")
    OU com atributos de confiança vazios (nenhum uso confiável, nenhum uso rejeitado listado)

/etc/pki/ca-trust/source/anchors/my-corp-ca.crt
  → Mesmo "My Corp CA" como PEM simples (-----BEGIN CERTIFICATE-----)
    (sem atributos de confiança — depende do posicionamento no diretório para confiança implícita)

Resultado: O mesmo conteúdo DER do certificado agora tem descrições de confiança contraditórias. O objeto de confiança p11-kit ou rejeita explicitamente certos usos, ou não lista nenhum uso (o que o p11-kit interpreta como “confiável para nada”). O PEM simples não carrega metadados de confiança, implicando confiança para todos os propósitos. O p11-kit não consegue reconciliar estas contradições, e marca o certificado como desconfiado. Após executar update-ca-trust:

  • O certificado desaparece de tls-ca-bundle.pem
  • trust list o mostra com trust: distrusted
  • Todos os serviços que dependem desta CA começam a falhar com certificate verify failed

O mesmo problema ocorre com o formato BEGIN TRUSTED CERTIFICATE do OpenSSL quando contém usos rejeitados OU confiança vazia:

/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  → Contém o certificado como -----BEGIN TRUSTED CERTIFICATE-----
    (com OIDs de "Rejected Uses" incorporados, OU sem nenhum uso confiável/rejeitado listado)

/etc/pki/ca-trust/source/anchors/certificate.crt
  → Mesmo certificado como -----BEGIN CERTIFICATE-----
    (sem dados de confiança incorporados — sem informação de rejeição)

Resultado: Mesmo resultado — a rejeição ou confiança vazia em uma fonte contradiz a confiança implícita na outra, certificado marcado como desconfiado.

Informação chave: Em um BEGIN TRUSTED CERTIFICATE, “nenhum uso confiável/rejeitado listado” NÃO significa “confiável para todos os propósitos.” Significa “confiável para nada.” Esta é a distinção crítica em relação a um BEGIN CERTIFICATE simples em anchors/, onde o posicionamento no diretório concede confiança implícita total. Para depurar, procure certificados duplicados em /etc/pki/ca-trust/source/ e /usr/share/pki/ca-trust-source/ e verifique se existe algum BEGIN TRUSTED CERTIFICATE com nenhum Reject ou confiança vazia que possa conflitar com uma cópia PEM simples.

Como corrigir:

# Opção 1: Remover o PEM simples duplicado de anchors/
sudo rm /etc/pki/ca-trust/source/anchors/my-corp-ca.crt
sudo update-ca-trust

# Opção 2: Se você PRECISA do cert em anchors/, converta-o para o
# formato confiável correspondente aos atributos de confiança existentes:
openssl x509 -in my-corp-ca.crt -addtrust serverAuth \
    -addtrust emailProtection -out my-corp-ca-trusted.crt
sudo cp my-corp-ca-trusted.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# Verificar a correção
trust list --filter=ca-anchors | grep -A 3 "My Corp CA"

Cenário: Desconfiança Explícita

/usr/share/pki/ca-trust-source/ca-bundle.trust.p11-kit
  → Contém "Legacy Corp CA" com confiança total

/etc/pki/ca-trust/source/blacklist/legacy-corp-ca.crt    ← RHEL 7/8
/etc/pki/ca-trust/source/blocklist/legacy-corp-ca.crt    ← RHEL 9+
  → Mesmo "Legacy Corp CA" como PEM simples, colocado no diretório de desconfiança

Resultado: A desconfiança prevalece por design. O certificado é excluído de tls-ca-bundle.pem e marcado como desconfiado no bundle do OpenSSL. Este é o comportamento esperado quando um admin intencionalmente desconfia de uma CA.

Cenário: Certificados Quase Idênticos (DER Diferente)

Um problema mais sutil ocorre quando dois certificados parecem iguais, mas não são idênticos byte a byte:

  • Um certificado CA foi baixado de duas fontes diferentes com quebra de linha PEM ligeiramente diferente
  • Um certificado CA foi recodificado (PEM → DER → PEM) e ganhou metadados de cabeçalho diferentes
  • Uma CA foi reemitida com o mesmo Subject DN, mas um novo par de chaves e número serial

Nesses casos, o p11-kit os trata como certificados distintos, e ambos acabam nos bundles extraídos. Isso pode causar:

  • Saída confusa de trust list com aparentes duplicatas
  • Tamanho de bundle aumentado (questão cosmética)
  • Confusão na construção de cadeia se uma cópia é desconfiada e a outra é confiável, mas elas têm conteúdo DER diferente

Como Detectar Certificados Duplicados

Método 1: Comparação de impressão digital + formato

Extraia impressões digitais de todos os certificados de origem e verifique duplicatas, incluindo qual formato cada arquivo usa:

# Verificar todos os diretórios de origem para impressões digitais SHA-256 duplicadas
# E relatar o formato PEM de cada arquivo
for dir in /usr/share/pki/ca-trust-source/anchors \
           /etc/pki/ca-trust/source/anchors; do
    for cert in "$dir"/*.crt "$dir"/*.pem 2>/dev/null; do
        [ -f "$cert" ] || continue
        fp=$(openssl x509 -in "$cert" -noout -fingerprint -sha256 2>/dev/null)
        fmt=$(head -1 "$cert" 2>/dev/null)
        [ -n "$fp" ] && echo "$fp  [$fmt]  $cert"
    done
done | sort

# Procurar mesma impressão digital aparecendo com formatos diferentes:
# Se você vê a mesma impressão digital com "BEGIN CERTIFICATE" e
# "BEGIN TRUSTED CERTIFICATE", essa é a origem do conflito de confiança.

Se a mesma impressão digital aparece com cabeçalhos PEM diferentes, você encontrou um conflito de formato de confiança que causará desconfiança.

Método 2: Usando trust list para identificar duplicatas

# Extrair todos os rótulos e procurar duplicatas
trust list --filter=ca-anchors | grep "^    label:" | sort | uniq -c | sort -rn | head -20

Se qualquer rótulo aparece mais de uma vez, investigue mais:

# Mostrar detalhes completos para uma duplicata suspeita
trust list | grep -B 2 -A 10 "label: DigiCert Global Root G2"

Método 3: Comparar o bundle extraído com arquivos de origem

# Contar certificados no bundle PEM
grep -c 'BEGIN CERTIFICATE' /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

# Contar certificados únicos por impressão digital
awk '/BEGIN CERT/,/END CERT/' /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem | \
    csplit -z -f /tmp/cert- - '/BEGIN CERTIFICATE/' '{*}' 2>/dev/null
for f in /tmp/cert-*; do
    openssl x509 -in "$f" -noout -fingerprint -sha256 2>/dev/null
done | sort -u | wc -l
rm -f /tmp/cert-*

Se a contagem de certificados excede a contagem de impressões digitais únicas, duplicatas existem no bundle extraído.

Como Identificar Diferenças Entre Duplicatas Suspeitas

Quando você tem dois arquivos de certificado que parecem ser a mesma CA, compare-os em quatro níveis:

Nível 1: Verificar o formato PEM (causa mais comum de conflitos)

# Verificar qual cabeçalho PEM cada arquivo usa
head -1 cert1.crt
head -1 cert2.crt

# "-----BEGIN CERTIFICATE-----"         → PEM simples, sem dados de confiança
# "-----BEGIN TRUSTED CERTIFICATE-----" → Formato confiável do OpenSSL, TEM dados de confiança

Se um diz BEGIN CERTIFICATE e o outro diz BEGIN TRUSTED CERTIFICATE, você encontrou o problema. Eles causarão um conflito de confiança mesmo se o certificado subjacente for idêntico.

Nível 2: Comparar conteúdo do certificado codificado em DER

# Comparar conteúdo codificado em DER (remove cabeçalhos PEM, diferenças de espaço em branco)
openssl x509 -in cert1.crt -outform DER -out /tmp/cert1.der
openssl x509 -in cert2.crt -outform DER -out /tmp/cert2.der
diff /tmp/cert1.der /tmp/cert2.der && echo "DER IDÊNTICO" || echo "DER DIFERENTE"

Nível 3: Comparar campos do certificado

# Comparar subject, issuer, serial, validade e chave
for field in subject issuer serial dates fingerprint pubkey; do
    echo "=== $field ==="
    echo "cert1: $(openssl x509 -in cert1.crt -noout -$field 2>/dev/null)"
    echo "cert2: $(openssl x509 -in cert2.crt -noout -$field 2>/dev/null)"
done

Nível 4: Comparar atributos de confiança incorporados (se formato TRUSTED CERTIFICATE)

# Mostrar atributos de confiança para cada arquivo
echo "=== atributos de confiança cert1 ==="
openssl x509 -in cert1.crt -noout -text -trustout 2>/dev/null | grep -A 5 "Trusted Uses\|Rejected Uses"
echo "=== atributos de confiança cert2 ==="
openssl x509 -in cert2.crt -noout -text -trustout 2>/dev/null | grep -A 5 "Trusted Uses\|Rejected Uses"

Descobertas comuns:

ObservaçãoExplicação ProvávelImpacto
Mesma impressão digital, mesmo formato PEMDuplicata inofensiva — p11-kit deduplicaNenhum
Mesma impressão digital, formato PEM diferente (formato confiável com usos rejeitados OU confiança vazia)Contradição de confiança — usos rejeitados ou “confiável para nada” vs confiança implícita totalCertificado marcado DESCONFIADO
Mesmo subject + serial, impressão digital diferenteCertificado recodificado ou adulteradoAmbos carregados como objetos separados
Mesmo subject, serial diferenteCertificado CA reemitido (novo par de chaves ou renovado)Ambos carregados independentemente
Mesmo subject + serial + impressão digital, saída de trust list diferenteMesmo certificado com atributos de confiança diferentes aplicadosPossível desconfiança

Limpando Duplicatas

Se o certificado já está no bundle do sistema (caso mais comum):

Um certificado em anchors/ que já existe em ca-bundle.trust.p11-kit nem sempre é inofensivo — se a cópia no bundle do sistema tem OIDs de uso rejeitado ou atributos de confiança vazios, a duplicata PEM simples causa desconfiança. Sempre verifique os atributos de confiança antes de assumir que uma duplicata é benigna.

# 1. Verificar o formato do arquivo em anchors/
head -1 /etc/pki/ca-trust/source/anchors/suspect.crt

# 2. Encontrar a impressão digital
openssl x509 -in /etc/pki/ca-trust/source/anchors/suspect.crt -noout -fingerprint -sha256

# 3. Verificar se esse certificado existe no bundle do sistema
trust list | grep -B5 -A5 "<subject do cert>"

# 4. Se o certificado já existe no bundle do sistema com atributos
#    de confiança adequados, remova a duplicata de anchors/:
sudo rm /etc/pki/ca-trust/source/anchors/suspect.crt
sudo update-ca-trust

# 5. Verificar se o certificado agora está confiável (não desconfiado)
trust list --filter=ca-anchors | grep -A 3 "<subject do cert>"

Se você precisa manter o certificado em anchors/ (CA personalizada que não está no bundle do sistema):

# Garantir que o formato do arquivo corresponda ao que o p11-kit espera.
# Para CAs personalizadas que não estão no bundle do sistema, PEM simples está correto:
openssl x509 -in suspect.crt -out /etc/pki/ca-trust/source/anchors/suspect.crt
sudo update-ca-trust

6.7 Usando trust list para Identificar Certificados Desconfiados

O comando trust list é a ferramenta principal para inspecionar o estado do repositório de confiança após update-ca-trust ter sido executado.

Uso Básico

# Listar todos os objetos de confiança (confiáveis + desconfiados)
trust list

# Listar apenas âncoras de CA confiáveis
trust list --filter=ca-anchors

# Listar apenas certificados desconfiados
trust list --filter=blacklist     # RHEL 7/8
trust list --filter=blocklist     # RHEL 9+

# Listar todos os certificados (sem filtrar por disposição de confiança)
trust list --filter=certificates

Anatomia da Saída de trust list

Cada entrada na saída de trust list se parece com isto:

pkcs11:id=%DE%28%F4%A4%FF%E5%B9%2F%A3%C5%03%D1%A3%49%A7%F9%96%2A%82%12;type=cert
    type: certificate
    label: DigiCert Global Root G2
    trust: anchor
    category: authority

pkcs11:id=%01%02%03...;type=cert
    type: certificate
    label: Legacy Compromised CA
    trust: distrusted
    category: authority
CampoSignificado
pkcs11:id=...URI PKCS#11 identificando unicamente este objeto
typeSempre certificate para certs de CA
labelNome legível por humanos (CN do subject do certificado)
trust: anchorCertificado é confiável como uma CA
trust: distrustedCertificado é explicitamente desconfiado
category: authorityCertificado é uma CA (tem Basic Constraints CA:TRUE)
category: other-entryCertificado é uma entidade final ou não classificado

Encontrando Certificados Desconfiados

# Listar todos os certificados desconfiados com seus rótulos
trust list --filter=blacklist     # RHEL 7/8
trust list --filter=blocklist     # RHEL 9+

# Contar certificados desconfiados
trust list --filter=blocklist | grep "^pkcs11:" | wc -l    # RHEL 9+

# Buscar um certificado desconfiado específico
trust list --filter=blocklist | grep -B 1 -A 4 "Symantec"  # RHEL 9+

Rastreando um Certificado Desconfiado até Sua Origem

Quando trust list --filter=blacklist (RHEL 7/8) ou trust list --filter=blocklist (RHEL 9+) mostra um certificado que você não esperava estar desconfiado, você precisa encontrar de onde a desconfiança se origina:

# Passo 1: Obter o rótulo do certificado desconfiado
trust list --filter=blacklist     # RHEL 7/8
trust list --filter=blocklist     # RHEL 9+
# Exemplo de saída:
# pkcs11:id=%AB%CD...;type=cert
#     type: certificate
#     label: Suspicious CA
#     trust: distrusted
#     category: authority

# Passo 2: Verificar diretório de desconfiança do admin
# RHEL 7/8: blacklist/  |  RHEL 9+: blocklist/
for distrust_dir in /etc/pki/ca-trust/source/blacklist \
                    /etc/pki/ca-trust/source/blocklist; do
    [ -d "$distrust_dir" ] || continue
    echo "=== $distrust_dir ==="
    ls -la "$distrust_dir"/
    for f in "$distrust_dir"/*; do
        [ -f "$f" ] || continue
        subj=$(openssl x509 -in "$f" -noout -subject 2>/dev/null)
        echo "$f: $subj"
    done
done

# Passo 3: Verificar diretório de desconfiança fornecido por pacotes
for distrust_dir in /usr/share/pki/ca-trust-source/blacklist \
                    /usr/share/pki/ca-trust-source/blocklist; do
    [ -d "$distrust_dir" ] || continue
    echo "=== $distrust_dir ==="
    ls -la "$distrust_dir"/
    for f in "$distrust_dir"/*; do
        [ -f "$f" ] || continue
        subj=$(openssl x509 -in "$f" -noout -subject 2>/dev/null)
        echo "$f: $subj"
    done
done

# Passo 4: Verificar o bundle principal do p11-kit para atributos de desconfiança inline
grep -A 5 "Suspicious CA" /usr/share/pki/ca-trust-source/ca-bundle.trust.p11-kit
# Procurar por "x-distrusted: true" ou "nss-mozilla-ca-policy: false"

Interpretação dos resultados:

Encontrado emSignificadoAção
/etc/pki/ca-trust/source/blacklist/ (RHEL 7/8) ou blocklist/ (RHEL 9+)Admin explicitamente desconfiouIntencional — verifique com a equipe se inesperado
/usr/share/pki/ca-trust-source/blacklist/ (RHEL 7/8) ou blocklist/ (RHEL 9+)Pacote RPM desconfiouMozilla/Red Hat revogou confiança — verifique avisos de segurança
ca-bundle.trust.p11-kit com atributos de desconfiançaMozilla removeu confiança upstreamNormal — CA foi desconfiada pelo programa de raiz Mozilla NSS
Não encontrado em nenhum diretório de desconfiançaProvavelmente um conflito de formato de confiança — mesmo cert existe como BEGIN CERTIFICATE e BEGIN TRUSTED CERTIFICATE / .p11-kitVerifique source/anchors/ para um PEM simples duplicado de um cert já no bundle do sistema (Seção 6.6)

Exemplo Prático: Depurando uma CA Desconfiada

Um serviço falha com certificate verify failed e você suspeita que a CA foi desconfiada:

# 1. Identificar a CA a partir do certificado que está falhando
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -issuer
# issuer=CN = Internal Corp CA, O = CorpCo

# 2. Verificar se o emissor é confiável
trust list --filter=ca-anchors | grep -A 3 "Internal Corp CA"
# Nenhuma saída significa que NÃO está nas âncoras confiáveis

# 3. Verificar se está ativamente desconfiado
trust list --filter=blacklist | grep -A 3 "Internal Corp CA"   # RHEL 7/8
trust list --filter=blocklist | grep -A 3 "Internal Corp CA"   # RHEL 9+
# Se encontrado aqui, a CA está explicitamente desconfiada

# 4. Verificar se está presente
trust list | grep -A 3 "Internal Corp CA"
# Se não encontrado em nenhum lugar, nunca foi adicionado ao repositório de confiança

# 5. Se desconfiado, encontrar o arquivo de origem (verifica caminhos RHEL 7/8 e 9+)
find /etc/pki/ca-trust/source/blacklist/ \
     /etc/pki/ca-trust/source/blocklist/ \
     /usr/share/pki/ca-trust-source/blacklist/ \
     /usr/share/pki/ca-trust-source/blocklist/ \
     -type f 2>/dev/null | while read f; do
    if openssl x509 -in "$f" -noout -subject 2>/dev/null | grep -qi "Internal Corp CA"; then
        echo "ENCONTRADO: $f"
    fi
done

# 6. Se NÃO encontrado em nenhum diretório de desconfiança, verificar conflitos de formato de confiança:
#    procurar um PEM simples em anchors/ que duplica um cert no bundle do sistema
for f in /etc/pki/ca-trust/source/anchors/*; do
    [ -f "$f" ] || continue
    if openssl x509 -in "$f" -noout -subject 2>/dev/null | grep -qi "Internal Corp CA"; then
        echo "DUPLICATA EM ANCHORS: $f"
        echo "  Formato: $(head -1 "$f")"
        echo "  Verifique se o mesmo cert existe em ca-bundle.trust.p11-kit com formato de confiança diferente"
    fi
done

# 7. Verificar também o bundle principal do p11-kit
grep -B 2 -A 10 "Internal Corp CA" \
    /usr/share/pki/ca-trust-source/ca-bundle.trust.p11-kit

Restaurando Confiança para um Certificado Desconfiado

Se você determinar que um certificado foi incorretamente desconfiado:

# Se a entrada de desconfiança está em /etc/pki/ (gerenciada pelo admin)
# RHEL 7/8:
sudo rm /etc/pki/ca-trust/source/blacklist/the-cert.crt
# RHEL 9+:
sudo rm /etc/pki/ca-trust/source/blocklist/the-cert.crt

sudo update-ca-trust

# Se a desconfiança vem do pacote ca-certificates, você precisa
# sobrescrevê-la adicionando o certificado como âncora confiável:
sudo cp the-cert.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
# Nota: isso funciona porque âncoras do admin sobrescrevem desconfiança
# de nível de pacote para certificados correspondidos por conteúdo DER.

# Verificar se o certificado agora está confiável
trust list --filter=ca-anchors | grep -A 3 "The Cert Label"

Aviso: Sobrescrever uma decisão de desconfiança da Mozilla/Red Hat só deve ser feito se você tiver uma razão de negócio específica e entender as implicações de segurança. CAs são desconfiadas por motivo (comprometimento, emissão incorreta, violações de política).


6.8 Depuração Avançada com trust e p11-kit

Inspecionando Objetos de Confiança Individuais

# Despejar os atributos PKCS#11 completos para um certificado específico
trust dump --filter="pkcs11:id=%DE%28%F4%A4..." 

# Listar todos os atributos de todos os objetos de confiança (verboso, saída grande)
trust dump

Verificando o Pipeline de Extração

Se você suspeita que update-ca-trust não está produzindo a saída esperada:

# Executar a extração manualmente com saída verbosa
p11-kit extract --format=pem-bundle \
    --filter=ca-anchors \
    --purpose=server-auth \
    /tmp/test-tls-bundle.pem

# Comparar com o bundle do sistema
diff <(sort /tmp/test-tls-bundle.pem) \
     <(sort /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem)

# Executar com log de depuração do p11-kit
P11_KIT_DEBUG=all update-ca-trust 2>&1 | head -100

Verificando Completude da Cadeia de Certificados

# Verificar um certificado de servidor contra o repositório de confiança do sistema
openssl verify -CAfile /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem server.crt

# Se a cadeia tem intermediários, inclua-os:
openssl verify -CAfile /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem \
    -untrusted intermediate.crt server.crt

# Mostrar a cadeia completa que o OpenSSL construiria:
openssl verify -show_chain -CAfile /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem server.crt

Verificação Cruzada do Bundle OpenSSL

O formato “certificado confiável” do OpenSSL (ca-bundle.trust.crt) inclui atributos de confiança/rejeição incorporados que são distintos do bundle PEM simples. Você pode inspecioná-los:

# Mostrar atributos de confiança para certificados no bundle OpenSSL
openssl x509 -in /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt \
    -noout -text -trustout 2>/dev/null | grep -A 2 "Trusted Uses\|Rejected Uses"

Verificando a Keystore Java

# Listar todas as entradas no repositório de confiança Java
keytool -list -cacerts -storepass changeit 2>/dev/null | grep "trustedCertEntry" | wc -l

# Buscar uma CA específica
keytool -list -cacerts -storepass changeit 2>/dev/null | grep -i "company"

6.9 Solução de Problemas de Confiança

Abordagem Sistemática

Sintoma: Verificação de certificado falhou

Passo 1: Identificar qual certificado está falhando e quem o emitiu

# Obter a cadeia de emissores de um servidor remoto
openssl s_client -connect server.example.com:443 -showcerts </dev/null 2>/dev/null | \
    openssl x509 -noout -issuer -subject

# Ou de um arquivo de certificado local
openssl x509 -in server.crt -noout -issuer -subject -serial

Passo 2: Verificar se a CA emissora está no repositório de confiança

trust list --filter=ca-anchors | grep -i "ISSUER_CN_HERE"

Passo 3: Verificar se a CA emissora está desconfiada

trust list --filter=blacklist | grep -i "ISSUER_CN_HERE"    # RHEL 7/8
trust list --filter=blocklist | grep -i "ISSUER_CN_HERE"    # RHEL 9+

Passo 4: Se ausente, adicione-a

sudo cp issuer-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Passo 5: Se desconfiada, encontre a origem e decida a ação

# Rastrear a origem da desconfiança (veja Seção 6.7)
# Verifica caminhos RHEL 7/8 (blacklist) e RHEL 9+ (blocklist)
find /etc/pki/ca-trust/source/blacklist/ \
     /etc/pki/ca-trust/source/blocklist/ \
     /usr/share/pki/ca-trust-source/blacklist/ \
     /usr/share/pki/ca-trust-source/blocklist/ \
     -name '*.crt' -o -name '*.pem' 2>/dev/null | while read f; do
    openssl x509 -in "$f" -noout -subject 2>/dev/null
done

Problemas Comuns do Repositório de Confiança

ProblemaCausaSolução
CA não encontrada após adicionar a anchors/Esqueceu de executar update-ca-trustExecute sudo update-ca-trust
CA desconfiada após adicionar a anchors/PEM simples conflita com formato TRUSTED CERTIFICATE ou .p11-kit existente que tem usos rejeitados ou confiança vaziaRemova a duplicata de anchors/ — o bundle do sistema já a contém (Seção 6.6)
CA ainda desconfiada após adicionar a anchors/Conteúdo DER difere da cópia desconfiadaCompare impressões digitais; garanta certificado idêntico
Aplicação Java não confia na CAKeystore Java não regeneradaExecute sudo update-ca-trust (reconstrói cacerts)
Confiança restaurada após reinícioAdmin adicionou cert a /usr/share/ (sobrescrito por atualizações de RPM)Sempre use /etc/pki/ca-trust/source/anchors/
trust list mostra entradas duplicadasMesma CA de subject de múltiplas fontes com conteúdo DER diferenteIdentifique e remova o arquivo de origem redundante
update-ca-trust falha silenciosamenteArquivo de certificado corrompido nas origensVerifique erros de sintaxe: openssl x509 -in suspect.crt -noout

Referência Rápida

┌────────────────────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA DO REPOSITÓRIO DE CONFIANÇA RHEL                             │
├────────────────────────────────────────────────────────────────────────────────┤
│                                                                                │
│  Adicionar CA:  sudo cp ca.crt /etc/pki/ca-trust/source/anchors/               │
│                 sudo update-ca-trust                                           │
│                                                                                │
│  Desconfiar:    sudo cp bad.crt /etc/pki/ca-trust/source/blacklist/            │
│                 (RHEL 7/8) ou .../source/blocklist/ (RHEL 9+)                  │
│                 sudo update-ca-trust                                           │
│                                                                                │
│  Verificar:     trust list --filter=ca-anchors | grep "Nome da CA"             │
│                 openssl verify -CAfile /etc/pki/ca-trust/extracted/            │
│                     pem/tls-ca-bundle.pem cert.crt                             │
│                                                                                │
│  Desconfiados:  trust list --filter=blacklist  (RHEL 7/8)                      │
│                 trust list --filter=blocklist  (RHEL 9+)                       │
│                                                                                │
│  Duplicatas:    trust list --filter=ca-anchors | grep "label:" |               │
│                     sort | uniq -c | sort -rn                                  │
│                                                                                │
│  Comparar:      openssl x509 -in a.crt -outform DER | sha256sum                │
│                 openssl x509 -in b.crt -outform DER | sha256sum                │
│                                                                                │
│  Depurar:       P11_KIT_DEBUG=all update-ca-trust 2>&1                         │
│                                                                                │
│  Dirs origem:   /etc/pki/ca-trust/source/{anchors,blacklist|blocklist}/        │
│                 /usr/share/pki/ca-trust-source/{anchors,blacklist|blocklist}/  │
│                                                                                │
│  Extraídos:     /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem              │
│                 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt        │
│                 /etc/pki/ca-trust/extracted/java/cacerts                       │
│                                                                                │
│  Pipeline:      update-ca-trust = update-ca-trust extract (idênticos)          │
│                                                                                │
│  Prioridade:    blacklist/blocklist > anchors                                  │
│                 /etc/pki/ > /usr/share/pki/                                    │
│                 atributos .p11-kit > padrões PEM simples                       │
│                                                                                │
│  PERIGO:        Nunca adicione um PEM simples "BEGIN CERTIFICATE" em           │
│                 anchors/ se o mesmo cert já existe no bundle do sistema        │
│                 como "BEGIN TRUSTED CERTIFICATE" ou formato .p11-kit.          │
│                 Confiança vazia (sem usos) = "confiável para nada" =           │
│                 DESCONFIADO. Usos rejeitados + PEM simples → também            │
│                 DESCONFIADO.                                                   │
└────────────────────────────────────────────────────────────────────────────────┘

🧪 Laboratório Prático

Lab 05: Gerenciamento do Repositório de Confiança

Adicione CAs personalizadas ao repositório de confiança do sistema, gerencie atributos de confiança, detecte duplicatas e depure certificados desconfiados.

  • 📁 Localização: labs/pt_BR/05-trust-store/
  • ⏱️ Tempo: 45 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 7: Assinaturas Digitais e Verificação no RHEL

Como a Confiança Funciona: Aprenda como as assinaturas digitais habilitam a validação de certificados em sistemas RHEL.

7.1 Funções Hash Criptográficas

Propriedades:

  1. Determinísticas
  2. Resistência a pré-imagem
  3. Resistência a colisões
  4. Efeito avalanche

Algoritmos populares: SHA-256, SHA-3, BLAKE2.

7.2 Construir Assinaturas

  1. Calcular hash da mensagem.
  2. Criptografar hash com chave privada → assinatura.
  3. Receptor descriptografa assinatura com chave pública e compara com seu próprio hash.

7.3 Impressões Digitais de Certificados

Uma impressão digital é simplesmente o hash do certificado codificado em DER, usado para identificá-lo uniquamente, ex.:

openssl x509 -in server.crt -noout -fingerprint -sha256

7.4 Lab: Assinar e Verificar um Arquivo

# assinar
openssl dgst -sha256 -sign rsa.key.pem -out report.sig report.pdf
# verificar
openssl dgst -sha256 -verify rsa.pub.pem -signature report.sig report.pdf

7.5 Resumo

Assinaturas vinculam dados a identidades; hashes asseguram integridade. Juntos sustentam a validação de certificados e todas as operações PKI.


7.6 Algoritmos de Assinatura no RHEL

Aprovados por Versão RHEL

AlgoritmoRHEL 7RHEL 8RHEL 9RHEL 10
SHA-256✅ Sim✅ Sim✅ Sim✅ Sim
SHA-384✅ Sim✅ Sim✅ Sim✅ Sim
SHA-512✅ Sim✅ Sim✅ Sim✅ Sim
SHA-1✅ Sim⚠️ Obsoleto❌ Bloqueado❌ Bloqueado
MD5✅ Sim⚠️ Apenas legacy❌ Bloqueado❌ Bloqueado

Crítico: RHEL 9+ bloqueia SHA-1 e MD5 por segurança!

Verificar Certificados no RHEL

# Verificar cadeia de certificado
openssl verify /etc/pki/tls/certs/server.crt

# Verificar contra CA específica
openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt server.crt

# Verificar algoritmo de assinatura
openssl x509 -in server.crt -noout -text | grep "Signature Algorithm"
# Deve ser SHA-256+ no RHEL 8+

Referência Rápida

┌─────────────────────────────────────────────────────────────┐
│ ASSINATURAS DIGITAIS NO RHEL                                │
├─────────────────────────────────────────────────────────────┤
│ Propósito:       Provar autenticidade e integridade         │
│ Como:            Hash + Chave privada = Assinatura          │
│ Verificar:       Assinatura + Chave pública = Hash original │
│                                                             │
│ Aprovados:       SHA-256, SHA-384, SHA-512                  │
│ Obsoleto:        SHA-1 (bloqueado no RHEL 9+)               │
│ Bloqueado:       MD5 (bloqueado no RHEL 9+)                 │
│                                                             │
│ Verificar cert:  openssl verify cert.crt                    │
│ Ver algoritmo:   openssl x509 -noout -text | grep Signature │
│ Impressão:       openssl x509 -noout -fingerprint -sha256   │
└─────────────────────────────────────────────────────────────┘

🧪 Laboratório Prático

Lab 03: Assinaturas Digitais

Assine arquivos, verifique assinaturas e detecte adulterações

  • 📁 Localização: labs/pt_BR/03-digital-signatures/
  • ⏱️ Tempo: 20 minutos
  • 🎯 Nível: Iniciante

Navegação do Capítulo

Capítulo 8: Versões RHEL e Evolução dos Certificados

Objetivo de Aprendizagem: Entender como o gerenciamento de certificados difere entre RHEL 7, 8, 9 e 10 para que você possa identificar rapidamente comportamentos específicos de versão ao resolver problemas.


8.1 Por Que a Versão RHEL Importa

Ao resolver problemas de certificados no RHEL, a primeira pergunta sempre deve ser: “Em qual versão RHEL estou?”

O gerenciamento de certificados evoluiu significativamente entre versões RHEL. O que funciona no RHEL 7 pode falhar no RHEL 9. Entender essas diferenças é crucial para:

  • ✅ Escolher a abordagem correta de solução de problemas
  • ✅ Identificar erros específicos de versão
  • ✅ Planejar migrações
  • ✅ Escrever scripts de automatização compatíveis

8.2 Verificação Rápida de Versão

# Método 1: Verificar /etc/redhat-release
cat /etc/redhat-release
# Exemplos de saída:
#   Red Hat Enterprise Linux Server release 7.9 (Maipo)
#   Red Hat Enterprise Linux release 8.10 (Ootpa)
#   Red Hat Enterprise Linux release 9.8 (Plow)
#   Red Hat Enterprise Linux release 10.2 (Coughlan)

# Método 2: Usar rpm
rpm -q --queryformat '%{VERSION}\n' redhat-release

# Método 3: Verificar versão OpenSSL (indireto mas útil)
openssl version
# RHEL 7: OpenSSL 1.0.2k
# RHEL 8: OpenSSL 1.1.1k
# RHEL 9: OpenSSL 3.5.5
# RHEL 10: OpenSSL 3.5.5

8.3 Visão Geral de Versões RHEL

Versão RHELData GASuporte TerminaVersão OpenSSLCaracterística Chave de Certificado
RHEL 7Junho 2014Junho 20241.0.2k-26Gerenciamento manual tradicional
RHEL 8Maio 2019Maio 20291.1.1k-14Crypto-policies introduzidas
RHEL 9Maio 2022Maio 20323.5.5-2OpenSSL 3.x, padrões mais rigorosos
RHEL 10Maio 2025Maio 20353.5.5-2Fortalecimento contínuo, preparação PQC

Fonte: Ciclo de Vida de Produtos Red Hat


8.4 Resumo de Diferenças Principais

RHEL 7 (Legado)

Características:

  • ✅ Estável, bem compreendido
  • ✅ Máxima compatibilidade
  • ⚠️ TLS 1.0/1.1 habilitado por padrão
  • ⚠️ Cifras fracas permitidas
  • ⚠️ Gerenciamento manual de certificados

Pacote: openssl-1.0.2k-26.el7_9.x86_64

Quando Você Verá:

  • Sistemas legados ainda não migrados
  • Aplicações requerendo versões TLS antigas
  • Ambientes conservadores

Comando Chave:

# Gerar chave (estilo RHEL 7)
openssl genrsa -out server.key 2048

RHEL 8 (Padrão Empresarial Atual)

Características:

  • Crypto-policies em todo o sistema (mudança de jogo!)
  • ✅ TLS 1.2+ por padrão
  • ✅ certmonger para renovação automática
  • ✅ Suites de cifra modernas
  • ⚠️ Mudanças incompatíveis do RHEL 7

Pacote: openssl-1.1.1k-14.el8_6.x86_64

Inovação Chave - Crypto-Policies:

# Ver política atual
update-crypto-policies --show
# DEFAULT, LEGACY, FUTURE, ou FIPS

# Controle de segurança em todo o sistema!
sudo update-crypto-policies --set FUTURE

Quando Você Verá:

  • Maioria dos deployments empresariais
  • Aplicações modernas
  • Ambientes FreeIPA

Comando Chave:

# Gerar chave (estilo moderno RHEL 8)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key

RHEL 9 (Padrão Moderno)

Características:

  • ✅ OpenSSL 3.5.5 com arquitetura de provedores
  • ✅ TLS 1.2+ obrigatório
  • ✅ Crypto-policies aprimoradas
  • ✅ Validação de certificado mais rigorosa
  • ⚠️ Mudanças na API OpenSSL 3.x
  • ⚠️ Algoritmos legados desabilitados

Pacote: openssl-3.5.5-2.el9_8.x86_64

Mudança Maior - Arquitetura de Provedores:

# Listar provedores crypto
openssl list -providers
# default, fips, legacy, base

# Algoritmos legados requerem provedor explícito
openssl md5 -provider legacy file.txt

Quando Você Verá:

  • Novos deployments
  • Ambientes conscientes de segurança
  • Últimas versões de aplicações

Comando Chave:

# Gerar chave EC (RHEL 9)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.key

RHEL 10 (Lançamento Atual)

Características:

  • ✅ Mesmo OpenSSL 3.5.5 do RHEL 9.8
  • ✅ Fortalecimento de segurança contínuo
  • ✅ Preparação para criptografia pós-quântica
  • ✅ Suporte aprimorado de certificado para contêineres
  • ⚠️ Padrões ainda mais rigorosos
  • ⚠️ Remoções legadas adicionais

Pacote: openssl-3.5.5-2.el10_2.x86_64

Nota: RHEL 10.0 GA foi em 20 de maio de 2025. Recursos e capacidades podem evoluir entre versões menores (10.1, 10.2, etc.). Sempre consulte a documentação oficial para seu lançamento específico RHEL 10.x.

Foco Chave:

  • Base de criptografia resistente a quântica
  • Práticas de segurança modernas
  • Cargas de trabalho nativas de contêiner e nuvem

Quando Você Verá:

  • Deployments completamente novos
  • Requisitos de segurança de ponta
  • Iniciativas de preparação para o futuro

8.5 Diferenças Críticas de Versão

Suporte de Versão TLS

Versão TLSRHEL 7RHEL 8RHEL 9RHEL 10
TLS 1.0✅ Sim⚠️ Apenas LEGACY❌ Não❌ Não
TLS 1.1✅ Sim⚠️ Apenas LEGACY❌ Não❌ Não
TLS 1.2✅ Sim✅ Sim✅ Sim✅ Sim
TLS 1.3❌ Não✅ Sim✅ Sim (preferido)✅ Sim (preferido)

Disponibilidade de Ferramentas de Certificados

FerramentaRHEL 7RHEL 8RHEL 9RHEL 10
openssl1.0.2k1.1.1k3.5.53.5.5
certutil (NSS)✅ Sim✅ Sim✅ Sim✅ Sim
update-ca-trust✅ Sim✅ Aprimorado✅ Aprimorado✅ Aprimorado
certmonger✅ Sim✅ Aprimorado✅ Aprimorado✅ Aprimorado
crypto-policies❌ Não✅ Sim✅ Aprimorado✅ Aprimorado
authconfig✅ Sim❌ Não (usar authselect)❌ Não❌ Não

Mudanças Chave em Cifra/Algoritmo

Algoritmo/CaracterísticaRHEL 7RHEL 8RHEL 9RHEL 10
3DES✅ Sim⚠️ LEGACY❌ Não❌ Não
RC4✅ Sim❌ Não❌ Não❌ Não
Assinaturas MD5✅ Sim⚠️ LEGACY❌ Não❌ Não
Assinaturas SHA-1✅ Sim⚠️ Obsoleto❌ Não❌ Não
RSA < 2048 bits✅ Sim❌ Não❌ Não❌ Não
Chaves DSA✅ Sim⚠️ LEGACY❌ Não❌ Não

8.6 Problemas Comuns Específicos de Versão

Problemas RHEL 7

# Problema: Suites de cifra antigas aceitas
# Impacto: Vulnerabilidades de segurança
# Solução: Configuração manual de cifras Apache/NGINX

Problemas RHEL 8

# Problema: Aplicação falha após migração do RHEL 7
# Razão: TLS 1.0/1.1 desabilitado por padrão
# Solução Rápida: Usar temporariamente política LEGACY (não recomendado a longo prazo)
sudo update-crypto-policies --set LEGACY

# Melhor Solução: Atualizar aplicação para suportar TLS 1.2+

Problemas RHEL 9

# Problema: Comandos OpenSSL falham com erros de provedor
# Razão: Arquitetura de provedores OpenSSL 3.x
# Solução: Especificar provedor explicitamente
openssl md5 -provider legacy file.txt

# Problema: Certificados SHA-1 rejeitados
# Razão: Validação mais rigorosa
# Solução: Reemitir certificados com SHA-256+

Problemas RHEL 10

# Problema: Padrões ainda mais rigorosos que RHEL 9
# Impacto: Certificados legados podem falhar validação
# Solução: Garantir que todos os certificados usem algoritmos modernos
#          Verificar documentação específica RHEL 10.x para sua versão menor

8.7 Impacto de Migração

RHEL 7 → RHEL 8

Impacto em Certificados: MODERADO

  • TLS 1.0/1.1 desabilitado
  • Cifras fracas removidas
  • Integração certmonger requerida para automatização

Ação Requerida:

  1. Auditar versões TLS em uso
  2. Atualizar configurações de cifra
  3. Testar aplicações com TLS 1.2+
  4. Considerar crypto-policies

RHEL 8 → RHEL 9

Impacto em Certificados: ALTO

  • Mudanças na API OpenSSL 3.x
  • Remoção de algoritmos legados
  • Validação de certificado mais rigorosa
  • Mudanças na arquitetura de provedores

Ação Requerida:

  1. Testar todas as operações de certificados
  2. Atualizar scripts personalizados usando OpenSSL
  3. Validar integridade da cadeia de certificados
  4. Verificar uso de SHA-1

RHEL 9 → RHEL 10

Impacto em Certificados: BAIXO-MODERADO

  • Mesma base OpenSSL (3.5.5)
  • Fortalecimento incremental
  • Refinamentos de política

Ação Requerida:

  1. Revisar documentação RHEL 10.x
  2. Testar compatibilidade de crypto-policy
  3. Validar uso de algoritmos modernos

8.8 Escolher a Abordagem Certa

Para Solução de Problemas

# Sempre começar com verificação de versão
cat /etc/redhat-release

# Depois verificar versão OpenSSL
openssl version

# Para RHEL 8+: Verificar crypto-policy
update-crypto-policies --show 2>/dev/null || echo "Pré-RHEL 8"

Árvore de Decisão de Referência Rápida

É RHEL 7?
├─ SIM → Verificar problemas de TLS/cifra legados
│        Configuração manual provavelmente necessária
│        Considerar planejamento de migração
│
└─ NÃO → É RHEL 8?
    ├─ SIM → Verificar crypto-policies primeiro!
    │        Usar certmonger para automatização
    │        Considerar atualização para RHEL 9
    │
    └─ NÃO → É RHEL 9 ou 10?
        └─ SIM → Verificar problemas de provedor OpenSSL 3.x
                 Verificar algoritmos modernos em uso
                 Aproveitar ferramentas aprimoradas

8.9 Conclusões Chave

  1. Sempre verificar versão RHEL primeiro ao resolver problemas
  2. RHEL 8 introduziu crypto-policies - mudança de jogo para gerenciamento de certificados
  3. RHEL 9 usa OpenSSL 3.x - mudanças significativas em API e comportamento
  4. RHEL 10 continua base RHEL 9 - melhorias incrementais
  5. Algoritmos legados removidos progressivamente entre versões
  6. Testes de migração são críticos - comportamento de certificados muda significativamente

8.10 O Que Vem a Seguir?

Agora que você entende as diferenças de versões RHEL, mergulharemos mais fundo em:

  • Capítulo 9: Gerenciamento de Certificados no RHEL 7 (detalhado)
  • Capítulo 10: RHEL 8 e Crypto-Policies (detalhado)
  • Capítulo 11: Segurança Moderna no RHEL 9 (detalhado)
  • Capítulo 12: Recursos Atuais do RHEL 10 (detalhado)

Cartão de Referência Rápida

┌────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA VERSÕES RHEL                             │
├─────────────┬───────────┬──────────────┬───────────────────┤
│ RHEL 7      │ 1.0.2k    │ Manual       │ Amigável legacy   │
│ RHEL 8      │ 1.1.1k    │ Crypto-pols  │ Padrão empresa    │
│ RHEL 9      │ 3.5.5     │ OpenSSL 3.x  │ Moderno seguro    │
│ RHEL 10     │ 3.5.5     │ Fortalecido  │ Preparado futuro  │
└─────────────┴───────────┴──────────────┴───────────────────┘

Verificar versão:    cat /etc/redhat-release
Verificar OpenSSL:   openssl version
Verificar política:  update-crypto-policies --show  (RHEL 8+)

Navegação do Capítulo

Capítulo 9: Gerenciamento de Certificados no RHEL 7

Legado mas Importante: RHEL 7 alcançou fim de manutenção em junho 2024, mas muitas empresas ainda executam. Aprenda como gerenciamento de certificados funciona no RHEL 7.


9.1 Visão Geral RHEL 7

Lançamento: 10 de junho de 2014 Suporte Manutenção Terminou: 30 de junho de 2024 Extended Life Cycle Support: Disponível até 2028

Características Chave:

  • Versão OpenSSL: 1.0.2k-26 (pacote: openssl-1.0.2k-26.el7_9.x86_64)
  • TLS Padrão: TLS 1.0, 1.1, 1.2 todos habilitados
  • Repositório de Confiança: /etc/pki/ca-trust/extracted/
  • Abordagem Gerenciamento: Primariamente manual
  • Crypto-Policies: Não disponíveis (recurso RHEL 8+)

Nota: Se você ainda está no RHEL 7, planeje migração para RHEL 8 ou 9. Atualizações segurança são limitadas.


9.2 Especificações OpenSSL 1.0.2k

Verificação Versão

# Verificar versão OpenSSL no RHEL 7
openssl version
# OpenSSL 1.0.2k-fips  12 Jan 2017

# Verificar pacote
rpm -q openssl
# openssl-1.0.2k-26.el7_9.x86_64

Recursos Chave e Limitações

Recursos:

  • ✅ Suporte TLS 1.0, 1.1, 1.2
  • ✅ Estável e bem testado
  • ✅ Compatibilidade ampla
  • ✅ Tipos chave RSA, ECC, DSA

Limitações:

  • ❌ Sem suporte TLS 1.3
  • ❌ Sintaxe comando antiga (genrsa vs genpkey)
  • ❌ Cifras padrão mais fracas
  • ❌ Suites cifra modernas limitadas

Sintaxe Comando (Estilo RHEL 7)

#============================================#
# GERAR CHAVE RSA (RHEL 7)
#============================================#

# Estilo antigo (comum no RHEL 7)
openssl genrsa -out server.key 2048

# Com proteção passphrase
openssl genrsa -aes256 -out server.key 2048

# Remover passphrase da chave
openssl rsa -in server.key -out server-nopass.key


#============================================#
# GERAR CSR (RHEL 7)
#============================================#

# CSR básico
openssl req -new -key server.key -out server.csr

# Com subject especificado
openssl req -new -key server.key -out server.csr \
  -subj "/C=US/ST=State/L=City/O=Company/CN=server.example.com"

# ⚠️ Nota: SANs são mais difíceis de adicionar com OpenSSL RHEL 7
# Necessita arquivo config para SANs


#============================================#
# VER CERTIFICADO
#============================================#

# Detalhes completos
openssl x509 -in server.crt -noout -text

# Apenas expiração
openssl x509 -in server.crt -noout -dates

# Apenas subject
openssl x509 -in server.crt -noout -subject

9.3 Gerenciamento Repositório de Confiança no RHEL 7

Adicionando CAs Customizadas

#============================================#
# ADICIONAR CA CUSTOMIZADA (RHEL 7)
#============================================#

# Passo 1: Copiar certificado CA para diretório anchors
sudo cp corporate-ca.crt /etc/pki/ca-trust/source/anchors/

# Passo 2: Atualizar repositório de confiança
sudo update-ca-trust extract

# Passo 3: Verificar
trust list | grep -i "corporate"

# Verificar aplicações usam
openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt test-cert.crt

Localizações Repositório de Confiança (RHEL 7)

/etc/pki/ca-trust/
├── source/
│   └── anchors/                   ← Adicionar CAs customizadas aqui
│
└── extracted/
    ├── pem/
    │   └── tls-ca-bundle.pem      ← OpenSSL, Python, Ruby
    ├── openssl/
    │   └── ca-bundle.trust.crt    ← OpenSSL específico
    └── java/
        └── cacerts                ← Aplicações Java

9.4 Configuração Serviço (Abordagem RHEL 7)

Apache HTTPS no RHEL 7

#============================================#
# SETUP APACHE SSL/TLS (RHEL 7)
#============================================#

# Instalar Apache com SSL
sudo yum install httpd mod_ssl -y

# Gerar certificado e chave
sudo openssl genrsa -out /etc/pki/tls/private/server.key 2048
sudo openssl req -new -key /etc/pki/tls/private/server.key \
  -out /tmp/server.csr \
  -subj "/CN=$(hostname -f)"

# Obter certificado da CA (ou autoassinado para teste)
sudo openssl x509 -req -days 365 -in /tmp/server.csr \
  -signkey /etc/pki/tls/private/server.key \
  -out /etc/pki/tls/certs/server.crt

# Configurar Apache (/etc/httpd/conf.d/ssl.conf)
sudo vi /etc/httpd/conf.d/ssl.conf
# Definir:
#   SSLCertificateFile /etc/pki/tls/certs/server.crt
#   SSLCertificateKeyFile /etc/pki/tls/private/server.key
#
#   # Recomendado: Desabilitar versões TLS fracas
#   SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
#
#   # Recomendado: Apenas cifras fortes
#   SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!RC4

# Iniciar Apache
sudo systemctl enable httpd
sudo systemctl start httpd

# Testar
curl -vk https://localhost/

NGINX no RHEL 7

#============================================#
# SETUP NGINX SSL/TLS (RHEL 7)
#============================================#

# Instalar NGINX (de EPEL)
sudo yum install epel-release -y
sudo yum install nginx -y

# Gerar certificado
sudo openssl genrsa -out /etc/pki/tls/private/nginx.key 2048
sudo openssl req -new -x509 -days 365 \
  -key /etc/pki/tls/private/nginx.key \
  -out /etc/pki/tls/certs/nginx.crt \
  -subj "/CN=$(hostname -f)"

# Configurar NGINX (/etc/nginx/nginx.conf)
# Adicionar ao bloco server:
#   listen 443 ssl;
#   ssl_certificate /etc/pki/tls/certs/nginx.crt;
#   ssl_certificate_key /etc/pki/tls/private/nginx.key;
#
#   # Recomendado
#   ssl_protocols TLSv1.2;
#   ssl_ciphers HIGH:!aNULL:!MD5;

# Iniciar NGINX
sudo systemctl enable nginx
sudo systemctl start nginx

9.5 Renovação Manual Certificado (RHEL 7)

Sem crypto-policies, sem ferramentas automáticas - tudo é manual!

Processo Renovação

#============================================#
# PROCESSO RENOVAÇÃO MANUAL (RHEL 7)
#============================================#

# Passo 1: Verificar expiração (definir lembrete calendário)
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates

# Passo 2: Gerar novo CSR (reusar chave existente)
openssl req -new -key /etc/pki/tls/private/server.key \
  -out /tmp/server-renewal.csr \
  -subj "/CN=server.example.com"

# Passo 3: Submeter CSR para CA

# Passo 4: Receber novo certificado da CA

# Passo 5: Backup certificado antigo
sudo cp /etc/pki/tls/certs/server.crt \
     /etc/pki/tls/certs/server.crt.$(date +%Y%m%d).old

# Passo 6: Instalar novo certificado
sudo cp new-server.crt /etc/pki/tls/certs/server.crt
sudo chmod 644 /etc/pki/tls/certs/server.crt

# Passo 7: Recarregar serviço
sudo systemctl reload httpd

# Passo 8: Testar
curl -v https://localhost/
openssl s_client -connect localhost:443

Rastreamento Renovações Certificado

#============================================#
# CRIAR RASTREAMENTO RENOVAÇÃO (RHEL 7)
#============================================#

# Job cron para verificar expiração
cat > /etc/cron.weekly/check-cert-expiration << 'EOF'
#!/bin/bash
# Verificar certificados expirando em 60 dias

for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue

  if ! openssl x509 -in "$cert" -noout -checkend $((86400*60)); then
    echo "⚠️ $cert expira dentro de 60 dias!"
    echo "$cert" | mail -s "Certificado Expirando Em Breve" admin@example.com
  fi
done
EOF

chmod +x /etc/cron.weekly/check-cert-expiration

9.6 Problemas Comuns Certificado RHEL 7

Problema 1: TLS 1.0/1.1 Depreciados

Problema: Clientes modernos rejeitam TLS 1.0/1.1

Sintomas:

curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

Correção:

# Atualizar Apache para desabilitar versões TLS antigas
# /etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

# Reiniciar Apache
sudo systemctl restart httpd

Problema 2: Cifras Fracas

Problema: Scans PCI/Segurança marcam cifras fracas

Correção:

# Apache: Usar apenas cifras fortes
# /etc/httpd/conf.d/ssl.conf
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!RC4:!EXPORT
SSLHonorCipherOrder on

# Testar
openssl s_client -connect localhost:443 -cipher '3DES'
# Deveria falhar se 3DES está desabilitado

Problema 3: SANs Faltando

Problema: Navegadores modernos requerem Subject Alternative Names

Desafio RHEL 7: SANs são mais difíceis de adicionar com OpenSSL 1.0.2

Solução: Usar arquivo config

# Criar config OpenSSL
cat > /tmp/san.cnf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
CN = server.example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.example.com
DNS.2 = www.example.com
IP.1 = 10.0.0.100
EOF

# Gerar CSR com SANs
openssl req -new -key server.key -out server.csr -config /tmp/san.cnf

# Verificar SANs no CSR
openssl req -in server.csr -noout -text | grep -A3 "Subject Alternative Name"

9.7 certmonger no RHEL 7

Disponível: Sim (versão básica)

#============================================#
# CERTMONGER NO RHEL 7
#============================================#

# Instalar
sudo yum install certmonger -y
sudo systemctl enable certmonger
sudo systemctl start certmonger

# Solicitar certificado do FreeIPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -K host/$(hostname -f)@REALM

# Listar certificados rastreados
sudo getcert list

# Verificar status certificado específico
sudo getcert list -f /etc/pki/tls/certs/web.crt

# Monitorar logs certmonger
sudo tail -f /var/log/messages | grep certmonger

Limitações RHEL 7:

  • Sem suporte ACME (Let’s Encrypt requer certbot manual)
  • Saída status menos detalhada
  • Menos opções comando post-save

9.8 Considerações Migração

Quando Migrar do RHEL 7

Você deveria migrar se:

  • ✅ Suporte terminou (junho 2024) e você necessita atualizações
  • ✅ Necessita suporte TLS 1.3
  • ✅ Quer crypto-policies para gerenciamento mais fácil
  • ✅ Requer recursos segurança modernos
  • ✅ Conformidade requer SO suportado

Tarefas Certificado Pré-Migração

#============================================#
# AUDITORIA CERTIFICADO PRÉ-MIGRAÇÃO RHEL 7
#============================================#

# 1. Listar todos certificados
find /etc/pki/tls/ -name "*.crt" -o -name "*.key"

# 2. Verificar expirações
for cert in /etc/pki/tls/certs/*.crt; do
  echo "=== $cert ==="
  openssl x509 -in "$cert" -noout -subject -dates
  echo ""
done

# 3. Verificar algoritmos assinatura (SHA-1 não funcionará no RHEL 8+)
for cert in /etc/pki/tls/certs/*.crt; do
  SIG=$(openssl x509 -in "$cert" -noout -text | grep "Signature Algorithm" | head -2)
  echo "$cert: $SIG"
done | grep -i sha1
# Se algum encontrado, reemitir antes migração!

# 4. Documentar CAs customizadas
ls -l /etc/pki/ca-trust/source/anchors/

# 5. Exportar certificados e chaves
tar czf rhel7-certificates-backup-$(date +%Y%m%d).tar.gz \
  /etc/pki/tls/certs/*.crt \
  /etc/pki/tls/private/*.key \
  /etc/pki/ca-trust/source/anchors/*

9.9 Fluxos de Trabalho Comuns RHEL 7

Fluxo de Trabalho 1: Configuração Manual Apache HTTPS

# Workflow completo do zero

# 1. Instalar Apache com SSL
sudo yum install httpd mod_ssl -y

# 2. Gerar chave privada
sudo openssl genrsa -out /etc/pki/tls/private/$(hostname -s).key 2048

# 3. Definir permissões chave
sudo chmod 600 /etc/pki/tls/private/$(hostname -s).key

# 4. Criar CSR
sudo openssl req -new \
  -key /etc/pki/tls/private/$(hostname -s).key \
  -out /tmp/$(hostname -s).csr \
  -subj "/C=US/O=Company/CN=$(hostname -f)"

# 5. Submeter CSR para CA, aguardar certificado

# 6. Instalar certificado
sudo cp $(hostname -s).crt /etc/pki/tls/certs/

# 7. Configurar Apache
sudo vi /etc/httpd/conf.d/ssl.conf
# Editar:
#   SSLCertificateFile /etc/pki/tls/certs/$(hostname -s).crt
#   SSLCertificateKeyFile /etc/pki/tls/private/$(hostname -s).key
#   SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
#   SSLCipherSuite HIGH:!aNULL:!MD5:!3DES

# 8. Testar configuração
sudo apachectl configtest

# 9. Abrir firewall
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# 10. Iniciar Apache
sudo systemctl enable httpd
sudo systemctl start httpd

# 11. Testar
curl -vk https://$(hostname -f)/

Fluxo de Trabalho 2: Integração FreeIPA

#============================================#
# WORKFLOW CERTIFICADO FREEIPA (RHEL 7)
#============================================#

# Pré-requisitos: Sistema deve estar registrado IPA
ipa-client-install

# Instalar certmonger
sudo yum install certmonger -y
sudo systemctl enable certmonger
sudo systemctl start certmonger

# Solicitar certificado para Apache
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/$(hostname -s).crt \
  -k /etc/pki/tls/private/$(hostname -s).key \
  -K host/$(hostname -f)@REALM.EXAMPLE.COM \
  -D $(hostname -f)

# Verificar status
sudo getcert list

# Aguardar status MONITORING (certificado emitido)

# Configurar Apache para usar cert
# /etc/httpd/conf.d/ssl.conf

# Recarregar Apache quando cert renova
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/$(hostname -s).crt \
  -k /etc/pki/tls/private/$(hostname -s).key \
  -K host/$(hostname -f)@REALM \
  -C "systemctl reload httpd"

9.10 Solução de Problemas Certificados RHEL 7

Comandos Diagnóstico

#============================================#
# DIAGNÓSTICO CERTIFICADO RHEL 7
#============================================#

# Verificar versão OpenSSL
openssl version

# Testar HTTPS localmente
openssl s_client -connect localhost:443

# Verificar configuração SSL Apache
sudo apachectl -t -D DUMP_VHOSTS | grep 443

# Ver erros SSL Apache
sudo tail -f /var/log/httpd/ssl_error_log

# Verificar negações SELinux
sudo grep AVC /var/log/audit/audit.log | grep cert

# Verificar permissões arquivo
ls -lZ /etc/pki/tls/certs/*.crt
ls -lZ /etc/pki/tls/private/*.key

# Verificar par certificado/chave
openssl x509 -noout -modulus -in /etc/pki/tls/certs/server.crt | openssl md5
openssl rsa -noout -modulus -in /etc/pki/tls/private/server.key | openssl md5
# Hashes MD5 deveriam coincidir

Erros Comuns RHEL 7

ErroCausaSolução
“certificate verify failed”CA faltando em repositório de confiançaAdicionar CA a /etc/pki/ca-trust/source/anchors/
“permission denied” na chavePermissões erradaschmod 600 em arquivo .key
“certificate has expired”Cert expiradoRenovar certificado manualmente
“no shared cipher”Desajuste cipher cliente/servidorAtualizar SSLCipherSuite
“wrong version number”Desajuste versão TLSAtualizar SSLProtocol

9.11 Fortalecimento Segurança no RHEL 7

Configuração Recomendada

#============================================#
# FORTALECIMENTO APACHE SSL/TLS (RHEL 7)
#============================================#

# /etc/httpd/conf.d/ssl.conf

# Desabilitar protocolos antigos
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

# Apenas cifras fortes
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!3DES:!DES

# Honrar preferência cipher servidor
SSLHonorCipherOrder on

# Habilitar HSTS (HTTP Strict Transport Security)
Header always set Strict-Transport-Security "max-age=31536000"

# OCSP Stapling (não disponível no OpenSSL 1.0.2 RHEL 7 por padrão)
# Disponível em alguns backports

# Perfect Forward Secrecy
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256

9.12 Caminho Migração para RHEL 8+

Passos Migração Específicos Certificado

#============================================#
# PREPARAR CERTIFICADOS PARA MIGRAÇÃO
#============================================#

# 1. Verificar todos certificados usam SHA-256+ (sem SHA-1 nem MD5)
for cert in /etc/pki/tls/certs/*.crt; do
  openssl x509 -in "$cert" -noout -text | grep "Signature Algorithm"
done | grep -i sha1 && echo "⚠️ Certificados SHA-1 encontrados! Reemitir antes migração!"

# 2. Verificar tamanhos chave (2048+ bits)
for cert in /etc/pki/tls/certs/*.crt; do
  SIZE=$(openssl x509 -in "$cert" -noout -text | grep "Public-Key" | grep -oP '\d+')
  if [ "$SIZE" -lt 2048 ]; then
    echo "⚠️ $cert: Chave muito pequena ($SIZE bits)"
  fi
done

# 3. Backup de tudo
tar czf rhel7-certs-$(hostname)-$(date +%Y%m%d).tar.gz \
  /etc/pki/tls/ \
  /etc/pki/ca-trust/source/anchors/ \
  /etc/httpd/conf.d/ssl.conf \
  /etc/nginx/nginx.conf

# 4. Documentar inventário certificado
./generate-cert-inventory.sh > cert-inventory-pre-migration.csv

# 5. Testar compatibilidade TLS 1.2
# Garantir que todos serviços funcionam apenas com TLS 1.2

9.13 Quando RHEL 7 Faz Sentido

Ainda Usando RHEL 7? Considere:

Razões para Ficar (Temporariamente):

  • Contrato Extended Life Cycle Support ativo
  • Aplicações legadas críticas requerendo TLS 1.0/1.1
  • Migração planejada para futuro próximo
  • Testando RHEL 8/9 em paralelo

Razões para Migrar:

  • ✅ Manutenção estendida terminou junho 2024
  • ✅ Sem crypto-policies (mais difícil gerenciar)
  • ✅ Sem TLS 1.3
  • ✅ Atualizações segurança limitadas
  • ✅ Aplicações modernas abandonando suporte TLS 1.0/1.1

9.14 Conclusões Chave

  1. RHEL 7 é manual - Sem crypto-policies, configuração cuidadosa necessária
  2. OpenSSL 1.0.2k - Sintaxe antiga, sem TLS 1.3
  3. TLS 1.0/1.1 habilitados por padrão - Desabilitá-los manualmente
  4. SHA-1 ainda funciona - Mas não após migração para RHEL 8+
  5. certmonger disponível - Mas básico comparado a RHEL 8+
  6. Planejar migração - Suporte RHEL 7 está terminando
  7. Documentar tudo - Torna migração mais fácil

Referência Rápida

┌─────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CERTIFICADO RHEL 7                    │
├─────────────────────────────────────────────────────────┤
│ OpenSSL:     1.0.2k-26                                  │
│ TLS:         1.0, 1.1, 1.2 (sem 1.3)                    │
│ Política:    Configuração manual (sem crypto-policies)  │
│                                                         │
│ Gerar:       openssl genrsa -out key.pem 2048           │
│ CSR:         openssl req -new -key key.pem -out req.csr │
│ Ver:         openssl x509 -in cert.crt -noout -text     │
│ Testar:      openssl s_client -connect host:443         │
│                                                         │
│ Fortalecer:  SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1     │
│              SSLCipherSuite HIGH:!aNULL:!MD5:!3DES      │
└─────────────────────────────────────────────────────────┘

Navegação do Capítulo

Capítulo 10: RHEL 8 e Crypto-Policies

Mudança Radical: RHEL 8 introduziu crypto-policies, revolucionando como certificados e criptografia são gerenciados system-wide. Este é o recurso mais importante para entender no RHEL 8.


10.1 O Que Mudou no RHEL 8?

Lançamento: 7 de maio de 2019 Suporte Até: 31 de maio de 2029 Versão Atual: RHEL 8.10 (em 2024)

Mudanças Principais Relacionadas a Certificados:

RecursoRHEL 7RHEL 8
OpenSSL1.0.2k1.1.1k-14
TLS 1.3❌ Não✅ Sim
Crypto-Policies❌ NãoNOVO!
TLS 1.0/1.1✅ Habilitado❌ Desabilitado (DEFAULT)
certmongerBásicoAprimorado
Segurança PadrãoMistaMais Forte

Pacote: openssl-1.1.1k-14.el8_6.x86_64


10.2 Entendendo Crypto-Policies

A Ideia Revolucionária

Problema RHEL 7:

❌ Configurar Apache:     SSLProtocol, SSLCipherSuite
❌ Configurar NGINX:      ssl_protocols, ssl_ciphers
❌ Configurar Postfix:    smtpd_tls_protocols
❌ Configurar OpenLDAP:   olcTLSProtocolMin
❌ Configurar cada aplicação diferentemente!

Solução RHEL 8:

✅ Definir UMA política system-wide
✅ Todas aplicações automaticamente cumprem!

Como Funciona

┌────────────────────────────────────────┐
│  update-crypto-policies --set DEFAULT  │  ← Comando único
└──────────────────┬─────────────────────┘
                   │
      ┌────────────┴────────────┐
      │ Sistema Crypto-Policies │
      └────────────┬────────────┘
                   │
    ┌──────────────┼──────────────┐
    ▼              ▼              ▼
 OpenSSL        GnuTLS         NSS
 Postfix        Apache         NGINX
 OpenSSH        Kerberos       BIND
 (todas apps!)  (automático!)  (consistente!)

10.3 Crypto-Policies Disponíveis

As Quatro Políticas Principais

# Verificar política atual
update-crypto-policies --show

# Políticas disponíveis no RHEL 8:
PolíticaVersões TLSRSA MínSHA-13DESCaso de Uso
DEFAULT1.2, 1.32048❌ Não❌ NãoPadrão (recomendado)
LEGACY1.0+, todos1024⚠️ Sim⚠️ SimCompatibilidade sistemas antigos
FUTURE1.2, 1.33072❌ Não❌ NãoSegurança mais rigorosa
FIPS1.2, 1.32048❌ Não❌ NãoConformidade federal

Detalhes Política

Política DEFAULT:

Versões TLS: 1.2, 1.3
RSA/DH Mínimo: 2048 bits
ECC Mínimo: secp256r1 (P-256)
Cifras: AES-GCM, ChaCha20-Poly1305, AES-CBC
Assinaturas: SHA-256, SHA-384, SHA-512
Bloqueados: MD5, assinaturas SHA-1, 3DES, RC4, DSS

Política LEGACY:

Versões TLS: 1.0, 1.1, 1.2, 1.3
RSA/DH Mínimo: 1024 bits
Cifras: Inclui 3DES, cifras fracas
Assinaturas: Permite SHA-1
Uso: Apenas para compatibilidade sistemas antigos (temporário!)

Política FUTURE:

Versões TLS: 1.2, 1.3 (cifras mais rigorosas)
RSA/DH Mínimo: 3072 bits
ECC Mínimo: secp384r1 (P-384)
Assinaturas: SHA-384, SHA-512 preferidas
Bloqueados: Tudo em DEFAULT, e mais

Política FIPS:

Versões TLS: 1.2, 1.3
Algoritmos: Apenas aprovados FIPS 140-2
Requer: Modo FIPS habilitado
Mais Rigoroso: Requisitos conformidade federal

10.4 Mudando Crypto-Policies

Mudanças Política Básicas

#============================================#
# VER POLÍTICA ATUAL
#============================================#

update-crypto-policies --show
# DEFAULT


#============================================#
# DEFINIR POLÍTICA
#============================================#

# Definir para FUTURE (mais rigorosa)
sudo update-crypto-policies --set FUTURE

# Definir para LEGACY (menos segura, para compatibilidade)
sudo update-crypto-policies --set LEGACY

# Definir para FIPS (requer modo FIPS habilitado)
sudo fips-mode-setup --enable
sudo reboot
sudo update-crypto-policies --set FIPS

# Retornar para DEFAULT
sudo update-crypto-policies --set DEFAULT


#============================================#
# APLICAR POLÍTICA (reiniciar serviços)
#============================================#

# Crypto-policies atualizam arquivos config, mas serviços devem reiniciar
sudo systemctl restart httpd nginx postfix

# Ou reiniciar (garante que tudo pega nova política)
sudo reboot

O Que Acontece Quando Você Muda Política

# Exemplo: Mudando para política FUTURE

# Antes:
update-crypto-policies --show
# DEFAULT

# Após:
sudo update-crypto-policies --set FUTURE

# Mudanças acontecem em:
ls -l /etc/crypto-policies/back-ends/
# opensslcnf.config      ← Config OpenSSL atualizada
# gnutls.config          ← Config GnuTLS atualizada
# nss.config             ← Config NSS atualizada
# bind.config            ← Config BIND atualizada
# ... e mais

# Ver política OpenSSL aplicada:
cat /etc/crypto-policies/back-ends/opensslcnf.config

10.5 Impacto Política em Certificados

Impacto Política DEFAULT

#============================================#
# O QUE POLÍTICA DEFAULT PERMITE/BLOQUEIA
#============================================#

# ✅ PERMITIDO:
- TLS 1.2, 1.3
- RSA 2048+ bits
- AES-128-GCM, AES-256-GCM
- ChaCha20-Poly1305
- Assinaturas SHA-256, SHA-384, SHA-512

# ❌ BLOQUEADO:
- TLS 1.0, 1.1
- RSA < 2048 bits
- 3DES, RC4, DES
- Assinaturas MD5, SHA-1
- Chaves DSA
- Cifras export

Testando Contra Política Atual

#============================================#
# TESTAR SE SEU CERTIFICADO FUNCIONA
#============================================#

# Testar TLS 1.2
openssl s_client -connect server.example.com:443 -tls1_2

# Testar TLS 1.3
openssl s_client -connect server.example.com:443 -tls1_3

# Testar cipher específico
openssl s_client -connect server.example.com:443 \
  -cipher 'ECDHE-RSA-AES256-GCM-SHA384'

# Ver quais cifras estão disponíveis sob política atual
openssl ciphers -v | head -20

10.6 Recursos OpenSSL 1.1.1 (RHEL 8)

Novos Recursos

#============================================#
# SUPORTE TLS 1.3 (Novo no RHEL 8!)
#============================================#

# Testar TLS 1.3
openssl s_client -connect server.example.com:443 -tls1_3

# Benefícios TLS 1.3:
# - Handshake mais rápido
# - Forward secrecy obrigatório
# - Recursos desatualizados removidos


#============================================#
# GERAÇÃO CHAVE MODERNA
#============================================#

# Estilo antigo (ainda funciona)
openssl genrsa -out server.key 2048

# Novo estilo (preferido no RHEL 8)
openssl genpkey -algorithm RSA -out server.key \
  -pkeyopt rsa_keygen_bits:2048

# Chaves EC (elliptic curve)
openssl genpkey -algorithm EC -out ec.key \
  -pkeyopt ec_paramgen_curve:P-256


#============================================#
# GERAÇÃO CSR MELHORADA
#============================================#

# CSR com SANs (muito mais fácil que RHEL 7!)
openssl req -new -key server.key -out server.csr \
  -subj "/CN=server.example.com" \
  -addext "subjectAltName=DNS:server.example.com,DNS:www.example.com,IP:10.0.0.100"

# Verificar SANs
openssl req -in server.csr -noout -text | grep -A2 "Subject Alternative Name"

10.7 Aprimoramentos certmonger no RHEL 8

Recursos Melhorados

#============================================#
# CERTMONGER NO RHEL 8
#============================================#

# Melhor integração IPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -D web.example.com \
  -K host/web.example.com@REALM \
  -C "systemctl reload httpd"  # Comando post-save (melhorado!)

# Saída status aprimorada
sudo getcert list -v

# Melhor relatório erro
sudo getcert list -f /etc/pki/tls/certs/web.crt
# Mostra mensagens erro detalhadas se renovação falha

Melhorias certmonger RHEL 8:

  • ✅ Melhores mensagens erro
  • ✅ Suporte comando post-save
  • ✅ Integração IPA melhorada
  • ✅ Renovação mais confiável

10.8 Cenários Comuns RHEL 8

Cenário 1: Migrado do RHEL 7, App TLS 1.0 Quebra

Problema:

# Aplicação funcionava no RHEL 7
# Após migração para RHEL 8: falhas conexão

Diagnóstico:

# Verificar crypto-policy
update-crypto-policies --show
# DEFAULT  ← TLS 1.0/1.1 desabilitado!

# Verificar logs aplicação
journalctl -xe | grep -i tls
# "wrong version number" ou "no shared cipher"

Correção Rápida (Temporária):

# Usar política LEGACY para permitir TLS 1.0/1.1
sudo update-crypto-policies --set LEGACY
sudo systemctl restart <serviço>

Correção Apropriada:

# Atualizar aplicação para suportar TLS 1.2+
# Ou configurar aplicação especificamente (opt-out de política)

Cenário 2: Necessita Suportar Clientes Antigos

Problema: Windows Server 2008, clientes Java 7 não conseguem conectar

Solução:

# Opção 1: Política LEGACY (não recomendado longo prazo)
sudo update-crypto-policies --set LEGACY

# Opção 2: Módulo política customizado
# Criar /etc/crypto-policies/policies/modules/COMPAT-OLD-CLIENTS.pmod
sudo update-crypto-policies --set DEFAULT:COMPAT-OLD-CLIENTS

# Opção 3: Opt-out serviço específico
# Configurar aquele serviço para permitir TLS 1.0/1.1

Cenário 3: Testando Antes de Produção

#============================================#
# TESTAR IMPACTO CRYPTO-POLICY
#============================================#

# Política atual
CURRENT=$(update-crypto-policies --show)

# Testar com política FUTURE
sudo update-crypto-policies --set FUTURE
sudo systemctl restart httpd

# Executar testes
curl https://localhost/
# Suite teste aplicação

# Se problemas:
sudo update-crypto-policies --set $CURRENT  # Reverter
sudo systemctl restart httpd

10.9 Overrides Por Aplicação

Quando Sobrescrever

Às vezes você necessita UMA aplicação optar por fora da política sistema:

Exemplo: App legado necessita TLS 1.0, mas você quer DEFAULT para todo resto

#============================================#
# OVERRIDE APACHE (Opt-Out)
#============================================#

# /etc/httpd/conf.d/ssl.conf
# Adicionar isto para re-habilitar TLS 1.0 apenas para Apache:
SSLProtocol all

# Ou usar Include para carregar crypto-policy
Include /etc/crypto-policies/back-ends/httpd.config
# Então sobrescrever configurações específicas após

# ⚠️ Nota: Isto opta FORA de crypto-policies para Apache
# Você agora gerencia TLS Apache manualmente novamente

Melhor: Usar módulos política (ver Capítulo 23 para detalhes)


10.10 Solução de Problemas de Crypto-Policy

Problemas Comuns

Problema 1: “no shared cipher”

# Diagnóstico
update-crypto-policies --show
# DEFAULT

# Testar quais cifras estão disponíveis
openssl ciphers -v

# Verificar requisição cliente
openssl s_client -connect localhost:443 -cipher 'ALL'

# Solução: Temporariamente usar LEGACY para identificar problema
sudo update-crypto-policies --set LEGACY
# Se funciona → problema compatibilidade cipher
# Correção apropriada: Atualizar cliente ou criar política customizada

Problema 2: Serviço falha após mudança política

# Sintoma
sudo systemctl status httpd
# Falhou ao iniciar

# Verificar logs
sudo journalctl -xe -u httpd | grep -i tls

# Reverter política
sudo update-crypto-policies --set DEFAULT
sudo systemctl restart httpd

10.11 Melhores Práticas para RHEL 8

Recomendação: Usar Política DEFAULT

# Para maioria ambientes:
sudo update-crypto-policies --set DEFAULT

# Razões:
✅ Segurança/compatibilidade balanceadas
✅ Testada pela Red Hat
✅ Cumpre padrões modernos
✅ Bloqueia algoritmos fracos conhecidos
✅ Funciona com maioria clientes

Quando Usar Outras Políticas

Usar LEGACY quando:

  • Temporariamente suportando clientes muito antigos
  • Período migração do RHEL 7
  • Testando compatibilidade
  • Mas: Planejar voltar para DEFAULT ASAP!

Usar FUTURE quando:

  • Requisitos alta segurança
  • Todos clientes são modernos
  • Quer configurações mais rigorosas
  • Planejando para frente

Usar FIPS quando:

  • Conformidade federal requerida
  • Contratos governo
  • Indústrias regulamentadas
  • Certificações segurança necessárias

10.12 Conclusões Chave (RHEL 8)

  1. Crypto-policies são O recurso - Aprenda bem
  2. Política DEFAULT é boa - Não mude sem razão
  3. TLS 1.3 agora disponível - Mais rápido e mais seguro
  4. OpenSSL 1.1.1 - Recursos modernos, melhor sintaxe
  5. certmonger aprimorado - Melhor automatização
  6. Migração do RHEL 7 - Testar completamente
  7. Planejar para RHEL 9 - OpenSSL 3.x chegando

Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CRYPTO-POLICIES RHEL 8                     │
├──────────────────────────────────────────────────────────────┤
│ OpenSSL:      1.1.1k-14                                      │
│ TLS:          1.2, 1.3 (política DEFAULT)                    │
│ Recurso:      Crypto-policies system-wide                    │
│                                                              │
│ Ver política: update-crypto-policies --show                  │
│ Def política: sudo update-crypto-policies --set <POLÍTICA>   │
│ Políticas:    DEFAULT, LEGACY, FUTURE, FIPS                  │
│                                                              │
│ Arq config:   /etc/crypto-policies/back-ends/                │
│ Reiniciar:    systemctl restart <serviços>                   │
│                                                              │
│ Gerar chave:  openssl genpkey -algorithm RSA -out key.pem    │
│ CSR com SANs: openssl req -new -addext "subjectAltName=..."  │
└──────────────────────────────────────────────────────────────┘

Navegação do Capítulo

Capítulo 11: Segurança Moderna no RHEL 9

Padrão Moderno: RHEL 9 representa o estado da arte atual em gerenciamento de certificados Linux com OpenSSL 3.x, crypto-policies aprimoradas, e padrões segurança mais rigorosos.


11.1 Visão Geral RHEL 9

Lançamento: 17 de maio de 2022 Suporte Até: 31 de maio de 2032 Versão Atual: RHEL 9.8

Mudanças Principais do RHEL 8:

RecursoRHEL 8RHEL 9
OpenSSL1.1.1k3.5.5
ArquiteturaTradicionalBaseada em Provider
TLS 1.0/1.1Política LEGACYCompletamente removido
Crypto-PoliciesBásicaSubpolíticas
ValidaçãoPadrãoMais Rigorosa
SHA-1DepreciadoBloqueado
certmongerAprimoradoFluxos nativos de IPA e rastreamento

Pacote: openssl-3.5.5-2.el9_8.x86_64


11.2 OpenSSL 3.5.5 - Mudanças Principais

Arquitetura Provider (Novo!)

O Que Mudou: OpenSSL 3.x introduziu sistema “provider” para diferentes implementações crypto.

#============================================#
# LISTAR PROVIDERS (RHEL 9)
#============================================#

openssl list -providers

# Saída:
# Providers:
#   default
#     name: OpenSSL Default Provider
#     version: 3.5.5
#     status: active
#
#   fips
#     name: OpenSSL FIPS Provider
#     version: 3.5.5
#     status: inactive (a menos que modo FIPS habilitado)
#
#   legacy
#     name: OpenSSL Legacy Provider
#     version: 3.5.5
#     status: inactive
#
#   base
#     name: OpenSSL Base Provider
#     version: 3.5.5
#     status: active

Algoritmos Legados Requerem Provider Explícito

Mudança Disruptiva: MD5, Blowfish, CAST5 necessitam -provider legacy

#============================================#
# USANDO ALGORITMOS LEGADOS (RHEL 9)
#============================================#

# Isto FALHA no RHEL 9:
openssl md5 file.txt
# Erro: unsupported

# Isto FUNCIONA (provider explícito):
openssl md5 -provider legacy file.txt

# Por quê: Algoritmos legados desabilitados por padrão para segurança

Geração Chave Moderna (RHEL 9)

#============================================#
# GERAR CHAVES (RHEL 9)
#============================================#

# RSA 2048 (padrão)
openssl genpkey -algorithm RSA -out server.key \
  -pkeyopt rsa_keygen_bits:2048

# RSA 4096 (mais forte)
openssl genpkey -algorithm RSA -out server.key \
  -pkeyopt rsa_keygen_bits:4096

# EC P-256 (elliptic curve, recomendado)
openssl genpkey -algorithm EC -out ec.key \
  -pkeyopt ec_paramgen_curve:P-256

# EC P-384 (mais forte)
openssl genpkey -algorithm EC -out ec.key \
  -pkeyopt ec_paramgen_curve:P-384


#============================================#
# GERAR CSR COM SANS (RHEL 9)
#============================================#

openssl req -new -key server.key -out server.csr \
  -subj "/C=US/ST=State/O=Company/CN=server.example.com" \
  -addext "subjectAltName=DNS:server.example.com,DNS:www.example.com,IP:10.0.0.100" \
  -addext "keyUsage=digitalSignature,keyEncipherment" \
  -addext "extendedKeyUsage=serverAuth,clientAuth"

# Verificar
openssl req -in server.csr -noout -text | grep -A5 "Subject Alternative Name"

11.3 Crypto-Policies Aprimoradas (RHEL 9)

Subpolíticas (Novo Recurso!)

RHEL 9 introduz modificadores política:

#============================================#
# SUBPOLÍTICAS CRYPTO-POLICY (RHEL 9)
#============================================#

# Política base com módulo NO-SHA1
sudo update-crypto-policies --set DEFAULT:NO-SHA1

# Múltiplos módulos
sudo update-crypto-policies --set DEFAULT:NO-SHA1:GOST

# Subpolíticas comuns:
# - NO-SHA1: Desabilitar completamente SHA-1 (mesmo em assinaturas)
# - NO-ENFORCE-EMS: Desabilitar Extended Master Secret
# - GOST: Habilitar algoritmos GOST
# - NO-CAMELLIA: Desabilitar cifra Camellia

# Ver módulos disponíveis
ls /usr/share/crypto-policies/policies/modules/

Módulos Crypto-Policy Customizados (RHEL 9)

#============================================#
# CRIAR MÓDULO POLÍTICA CUSTOMIZADO
#============================================#

# Criar módulo customizado
sudo vi /etc/crypto-policies/policies/modules/CUSTOM.pmod

# Conteúdo exemplo:
min_rsa_size = 3072
min_dh_size = 3072
min_dsa_size = 3072

# Aplicar
sudo update-crypto-policies --set DEFAULT:CUSTOM

# Testar
openssl ciphers -v | head

11.4 Validação Certificado Mais Rigorosa

O Que É Mais Rigoroso no RHEL 9?

#============================================#
# EXEMPLOS VALIDAÇÃO MAIS RIGOROSA
#============================================#

# 1. Assinaturas SHA-1 completamente rejeitadas
openssl verify sha1-signed-cert.crt
# Erro: CA md too weak

# 2. Autoassinado sem trust CA apropriado rejeitado
curl https://self-signed.example.com/
# Erro: certificate verify failed

# 3. Cadeia certificado deve estar completa
# Intermediário faltando → conexão falha

# 4. Hostname deve coincidir (CN ou SAN)
openssl s_client -connect server.example.com:443 -servername different.example.com
# Erro verificação: hostname mismatch

# 5. Chaves < 2048 bits rejeitadas
# (mesmo em política LEGACY, < 1024 rejeitado)

Impacto em Aplicações

Aplicações compiladas contra OpenSSL 3.x:

  • Podem necessitar mudanças código se usando APIs depreciadas
  • Tratamento erro pode ser diferente
  • Código crypto customizado necessita teste

Administradores sistema:

  • ✅ Maioria mudanças transparentes
  • ✅ Comandos maioria iguais
  • ⚠️ Validação mais rigorosa captura mais problemas (isto é bom!)

11.5 Automação no RHEL 9: certmonger, certbot e IdM ACME

Use o cliente certo para a CA certa

#============================================#
# OPÇÕES DE AUTOMAÇÃO NO RHEL 9
#============================================#

# Fluxo nativo do certmonger para FreeIPA / IdM
sudo dnf install certmonger -y
sudo systemctl enable --now certmonger
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.crt \
  -k /etc/pki/tls/private/internal.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f) \
  -C "systemctl reload httpd"

# Fluxo público do Let's Encrypt
# Use certbot, não uma definição falsa de CA Let's Encrypt no certmonger.
sudo certbot certonly --apache -d web.example.com

# Fluxo IdM ACME (opcional)
# Isto aponta para o diretório ACME do seu servidor IPA, não para o Let's Encrypt.
sudo certbot certonly \
  --server https://ipa.example.com/acme/directory \
  -d host.example.com

Importante: IdM ACME e Let’s Encrypt são CAs diferentes. certmonger continua sendo a ferramenta nativa do RHEL para IPA, CA local e fluxos de renovação com rastreamento.


11.6 Aprimoramentos Repositório de Confiança

Gerenciamento Trust Avançado

#============================================#
# GERENCIAMENTO TRUST RHEL 9
#============================================#

# Adicionar CA (mesmo que RHEL 7/8)
sudo cp corporate-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# NOVO: Trust específica por propósito
trust anchor /path/to/ca.crt --purpose server-auth

# Listar trust com detalhes
trust list --filter=ca-anchors

# Exportar CA específica
trust extract --format=pem-bundle --filter=ca-anchors \
  --purpose server-auth /tmp/server-cas.pem

# Remover trust específica
trust anchor --remove "pkcs11:id=%CERT_ID%"

11.7 Problemas Comuns RHEL 9 e Soluções

Problema 1: Mudanças API OpenSSL 3.x

Problema: Aplicação customizada falha com erros OpenSSL

Sintomas:

Error: EVP_PKEY_RSA no longer supported
Error: Provider not available

Solução:

# Verificar se aplicação está usando APIs depreciadas
# Aplicação necessita recompilação contra OpenSSL 3.x

# Temporário: Definir variável ambiente compat (se disponível)
export OPENSSL_CONF=/etc/pki/tls/openssl-compat.cnf

# Longo prazo: Atualizar aplicação

Problema 2: Certificados SHA-1 Rejeitados

Problema: Certificados legados com assinaturas SHA-1 falham

Sintomas:

openssl verify cert.crt
# error 3: CA md too weak

Solução:

# Reemitir certificado com SHA-256+
# Sem workaround - SHA-1 é bloqueado para segurança

# Verificar assinatura certificado
openssl x509 -in cert.crt -noout -text | grep "Signature Algorithm"
# Deve mostrar: sha256WithRSAEncryption ou melhor

Problema 3: Algoritmo Legado Não Disponível

Problema: Aplicação necessita MD5/RC4/etc.

Sintomas:

openssl md5 file.txt
# Erro: unsupported

Solução:

# Usar provider legado explicitamente
openssl md5 -provider legacy file.txt

# Para aplicações: Atualizar para usar SHA-256+
# Ou configurar para carregar provider legado

11.8 Modo FIPS no RHEL 9

Suporte FIPS Melhorado

#============================================#
# MODO FIPS (RHEL 9)
#============================================#

# Habilitar modo FIPS
sudo fips-mode-setup --enable
sudo reboot

# Verificar status FIPS
fips-mode-setup --check
# FIPS mode is enabled.

# Verificar provider FIPS carregado
openssl list -providers | grep -A3 fips
#   fips
#     name: OpenSSL FIPS Provider
#     version: 3.5.5
#     status: active

# Gerar certificado conforme FIPS
openssl req -new -x509 -days 365 -newkey rsa:2048 \
  -keyout fips.key -out fips.crt \
  -subj "/CN=$(hostname)" -provider fips

FIPS RHEL 9:

  • Usa provider FIPS OpenSSL 3.x
  • Módulos validados FIPS 140-2
  • Transição para FIPS 140-3 em progresso

11.9 Migração do RHEL 8

Impacto Certificado

Impacto Moderado:

  • Mudanças API OpenSSL (afeta apps customizadas)
  • Validação mais rigorosa (captura mais problemas)
  • Algoritmos legados removidos
  • SHA-1 completamente bloqueado

Verificações Pré-Migração

#============================================#
# PRÉ-MIGRAÇÃO CERTIFICADO RHEL 8 → 9
#============================================#

# 1. Verificar por certificados SHA-1 (falharão no RHEL 9)
for cert in /etc/pki/tls/certs/*.crt; do
  SIG=$(openssl x509 -in "$cert" -noout -text | grep "Signature Algorithm" | head -2)
  echo "$cert: $SIG"
done | grep -i sha1
# ⚠️ Reemitir quaisquer certs SHA-1 antes migração!

# 2. Verificar aplicações customizadas usando OpenSSL
rpm -qa | grep -E "custom|local"
# Testar estas aplicações em ambiente RHEL 9

# 3. Verificar compatibilidade crypto-policy
update-crypto-policies --show

# 4. Testar operações certificado
openssl s_client -connect localhost:443

# 5. Backup de tudo
tar czf rhel8-certs-backup-$(date +%Y%m%d).tar.gz \
  /etc/pki/tls/ \
  /etc/pki/ca-trust/source/anchors/

11.10 Melhores Práticas para RHEL 9

Configuração Recomendada

#============================================#
# SETUP RECOMENDADO (RHEL 9)
#============================================#

# 1. Usar crypto-policy DEFAULT (a menos que necessidade específica)
sudo update-crypto-policies --set DEFAULT

# 2. Usar certmonger para automação nativa
sudo dnf install certmonger
sudo systemctl enable --now certmonger

# 3. Para sites públicos: usar certbot com Let's Encrypt
sudo certbot certonly --apache -d web.example.com

# 4. Para interno: usar FreeIPA com certmonger
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.crt \
  -k /etc/pki/tls/private/internal.key \
  -K host/$(hostname -f)@REALM

# 5. Gerar chaves EC (menores, mais rápidas)
openssl genpkey -algorithm EC -out ec.key \
  -pkeyopt ec_paramgen_curve:P-256

# 6. Sempre usar SANs
openssl req -new -addext "subjectAltName=DNS:..."

11.11 Novos Recursos Que Você Deveria Usar

Recurso 1: Fluxos mais fortes de certmonger + IPA

# Automação nativa do RHEL para certificados internos
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.crt \
  -k /etc/pki/tls/private/internal.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f) \
  -C "systemctl reload httpd"

# Melhor saída de status no RHEL 9
sudo getcert list -v

Recurso 2: Relatório Status Aprimorado

# Status mais detalhado
sudo getcert list -v

# Melhores mensagens erro
sudo getcert list -f /etc/pki/tls/certs/web.crt
# Mostra razão erro exata se renovação falha

Recurso 3: Subpolíticas Crypto-Policy

# Ajuste fino política DEFAULT
sudo update-crypto-policies --set DEFAULT:NO-SHA1

# Múltiplos modificadores
sudo update-crypto-policies --set FUTURE:AD-SUPPORT

11.12 Mudanças Disruptivas do RHEL 8

Mudanças API

Se você tem aplicações customizadas:

// RHEL 8 (OpenSSL 1.1.1) - DEPRECIADO no RHEL 9:
RSA *rsa = RSA_new();

// RHEL 9 (OpenSSL 3.x) - NOVA API:
EVP_PKEY *pkey = EVP_PKEY_new();

Impacto: Aplicações compiladas customizadas podem necessitar atualizações

Mudanças Comando

# Maioria comandos funcionam iguais, mas alguns casos extremos:

# RHEL 8: Isto funciona
openssl md5 file.txt

# RHEL 9: Requer provider
openssl md5 -provider legacy file.txt

# Solução: Usar SHA-256 ao invés
openssl sha256 file.txt

11.13 Cenários Comuns RHEL 9

Cenário 1: Configuração Fresh Apache HTTPS RHEL 9

#============================================#
# SETUP COMPLETO APACHE HTTPS (RHEL 9)
#============================================#

# 1. Instalar Apache com mod_ssl
sudo dnf install httpd mod_ssl -y

# 2. Usar certmonger + FreeIPA / IdM
sudo dnf install certmonger -y
sudo systemctl enable --now certmonger

# 3. Solicitar certificado
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f) \
  -C "systemctl reload httpd"

# 4. Aguardar certificado (verificar status)
sudo getcert list

# 5. Configurar Apache para usar certificado
# /etc/httpd/conf.d/ssl.conf já aponta para:
#   SSLCertificateFile /etc/pki/tls/certs/localhost.crt
# Atualizar para:
#   SSLCertificateFile /etc/pki/tls/certs/web.crt
#   SSLCertificateKeyFile /etc/pki/tls/private/web.key

# 6. Crypto-policy lida com configurações TLS automaticamente!
# Sem necessidade definir SSLProtocol ou SSLCipherSuite

# 7. Abrir firewall
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# 8. Iniciar Apache
sudo systemctl enable httpd
sudo systemctl start httpd

# 9. Testar
curl -v https://$(hostname -f)/

# 10. Renovação automática acontece bem antes da expiração!

Resultado: HTTPS interno totalmente automatizado com FreeIPA e certmonger!


11.14 Solução de Problemas Certificados RHEL 9

Comandos Diagnóstico

#============================================#
# DIAGNÓSTICO CERTIFICADO RHEL 9
#============================================#

# Verificar versão OpenSSL
openssl version
# OpenSSL 3.5.5

# Verificar providers
openssl list -providers

# Verificar crypto-policy
update-crypto-policies --show

# Testar conexão com TLS 1.3
openssl s_client -connect server:443 -tls1_3

# Verificar algoritmo assinatura certificado
openssl x509 -in cert.crt -noout -text | grep "Signature Algorithm"
# Deve ser SHA-256+ no RHEL 9

# Testar com provider legado (se necessário)
openssl md5 -provider legacy file.txt

# Verificar rastreamento certmonger
sudo getcert list

# Ver logs certmonger
sudo journalctl -u certmonger -f

Erros Comuns RHEL 9

ErroCausaSolução
“CA md too weak”Assinatura SHA-1Reemitir com SHA-256+
“Provider not available”Algoritmo legado usadoAdicionar -provider legacy ou atualizar para algoritmo moderno
“unsupported” em comando opensslAlgoritmo desabilitadoUsar alternativa moderna ou provider legado
“no shared cipher” (app migrada)Cliente usa cifras antigasAtualizar cliente ou usar política LEGACY temporariamente
“certificate verify failed”Validação mais rigorosaVerificar cadeia cert, SANs, expiração

11.15 Quando Usar RHEL 9

Ideal Para:

Novas implantações - Começar com segurança moderna ✅ Ambientes focados segurança - Padrões mais rigorosos ✅ Aplicações modernas - Beneficiar de TLS 1.3 ✅ Suporte longo prazo - 10 anos manutenção ✅ Requisitos conformidade - Padrões segurança modernos

Timing Migração:

Do RHEL 7:

  • ✅ Sim! Manutenção RHEL 7 terminou junho 2024
  • Planejar cuidadosamente - grande salto (testar completamente)

Do RHEL 8:

  • Moderado - OpenSSL 3.x é mudança principal
  • Testar aplicações customizadas primeiro
  • Certificados SHA-1 devem ser reemitidos

11.16 Conclusões Chave

  1. Arquitetura provider OpenSSL 3.5.5 - Entender providers
  2. Validação mais rigorosa - Captura problemas segurança (bom!)
  3. SHA-1 completamente bloqueado - Reemitir certificados antigos
  4. Subpolíticas crypto-policy - Ajustar fino segurança
  5. certmonger continua valioso para IPA e fluxos de renovação com rastreamento
  6. Suporte TLS 1.3 obrigatório - Mais rápido, mais seguro
  7. Planejar teste - Apps customizadas podem necessitar atualizações

Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CERTIFICADO RHEL 9                         │
├──────────────────────────────────────────────────────────────┤
│ OpenSSL:        3.5.5 (arquitetura provider)                 │
│ TLS:            1.2, 1.3 (1.0/1.1 removidos completamente)   │
│ Recurso:        Subpolíticas, validação mais rigorosa        │
│                                                              │
│ Providers:      openssl list -providers                      │
│ Política:       update-crypto-policies --show                │
│ Subpolítica:    update-crypto-policies --set DEFAULT:NO-SHA1 │
│                                                              │
│ Gerar chave:    openssl genpkey -algorithm RSA -out key.pem  │
│ Chave EC:       openssl genpkey -algorithm EC -out ec.pem    │
│                 -pkeyopt ec_paramgen_curve:P-256             │
│                                                              │
│ ACME público:   certbot certonly --apache -d example.com     │
│ certmonger:     ipa-getcert request ...                      │
│ Algo legado:    openssl md5 -provider legacy file.txt        │
└──────────────────────────────────────────────────────────────┘

⚠️ SHA-1 está BLOQUEADO - reemitir certificados antigos!
✅ Usar certmonger para IPA e automação com rastreamento
✅ Política DEFAULT funciona para maioria casos

Navegação do Capítulo

Capítulo 12: Recursos Atuais do RHEL 10

Vanguarda: O RHEL 10 GA foi lançado em 20 de maio de 2025; o RHEL 10.2 é a versão menor atual. Aprenda sobre os recursos mais recentes e prepare-se para o futuro do gerenciamento de certificados no Red Hat Enterprise Linux.


12.1 Visão Geral RHEL 10

Lançamento GA: 20 de maio de 2025 Versão Atual: RHEL 10.2 Suporte Até: 31 de maio de 2035 Status: ✅ Lançamento Produção

Características Chave:

  • Versão OpenSSL: 3.5.5-2 (pacote: openssl-3.5.5-2.el10_2.x86_64)
  • Mesma base que: RHEL 9.8 (OpenSSL 3.5.5)
  • Foco: Fortalecimento contínuo, preparação pós-quântica, cloud-native
  • Filosofia: Melhoria incremental sobre RHEL 9

Importante: Recursos RHEL 10 podem evoluir através das versões menores (10.1, 10.2, etc.). Sempre consulte documentação oficial Red Hat para seu lançamento RHEL 10.x específico.


12.2 O Que Há de Novo vs. RHEL 9?

Diferenças Chave

RecursoRHEL 9RHEL 10
OpenSSL3.5.53.5.5 (mesma base)
Crypto-PoliciesSubpolíticasSubpolíticas aprimoradas
Versões TLS1.2, 1.31.3 preferido, 1.2 suportado
FIPSMódulos 140-2Transição 140-3
Padrões SegurançaRigorosoMais Rigoroso
Suporte ContainerBomAprimorado
Pós-QuânticoFundaçãoPreparação ativa

Pacote: openssl-3.5.5-2.el10_2.x86_64

Não É Mudança Revolucionária

Diferente RHEL 7→8 (crypto-policies) ou RHEL 8→9 (OpenSSL 3.x), RHEL 10 é melhoria incremental.

Pense nisso como:

  • RHEL 7 → 8: 🚀 Revolucionário (crypto-policies)
  • RHEL 8 → 9: 🔄 Principal (OpenSSL 3.x)
  • RHEL 9 → 10: ⬆️ Incremental (refinamentos)

12.3 Gerenciamento de Certificados no RHEL 10

Mesma Fundação que RHEL 9

#============================================#
# BÁSICOS CERTIFICADO RHEL 10
#============================================#

# Mesma versão OpenSSL que RHEL 9.8
openssl version
# OpenSSL 3.5.5 27 Jan 2026

# Mesmo sistema crypto-policies
update-crypto-policies --show

# Mesmo certmonger
getcert list

# Mesma estrutura diretório
ls -la /etc/pki/tls/

Conclusão: Se você conhece RHEL 9, você conhece certificados RHEL 10!


12.4 Recursos Segurança Aprimorados

Padrões Mais Rigorosos

#============================================#
# APRIMORAMENTOS SEGURANÇA RHEL 10
#============================================#

# 1. Política DEFAULT é mais rigorosa
# - Preferências cipher mais fortes
# - Algoritmos fracos adicionais removidos
# - Validação aprimorada

# 2. Política LEGACY mais restrita
# - Menos algoritmos legados permitidos
# - Mínimos mais fortes mesmo em LEGACY

# 3. Gerenciamento certificado container melhorado
# - Melhor integração com Podman
# - Montagem cert simplificada
# - Gerenciamento secret aprimorado

Preparação Criptografia Pós-Quântica

Fundação para Futuro:

# RHEL 10 prepara para algoritmos pós-quânticos
# (Ainda não padrão, mas infraestrutura pronta)

# Capacidade futura (quando padrões finalizarem):
# - ML-KEM (Module-Lattice Key Encapsulation)
# - ML-DSA (Module-Lattice Digital Signatures)
# - Criptografia híbrida clássica/quântica

# Status atual: Monitorando padrões NIST
# Esperado: Lançamentos menores RHEL 10.x adicionarão suporte PQC

Nota: Criptografia pós-quântica ainda está evoluindo. RHEL 10 fornece fundação, implementação real virá quando padrões forem finalizados.


12.5 Recursos Específicos RHEL 10

Recurso 1: Módulos Crypto-Policy Aprimorados

#============================================#
# MELHORIAS CRYPTO-POLICY RHEL 10
#============================================#

# Controle mais granular
sudo update-crypto-policies --set DEFAULT:NO-SHA1

# Melhor validação
update-crypto-policies --check

# Mensagens erro melhoradas quando políticas conflitam

Recurso 2: Suporte Certificado Container Melhorado

#============================================#
# CONTAINERS COM CERTIFICADOS (RHEL 10)
#============================================#

# Montagem certificado mais fácil no Podman
podman run -d \
  -v /etc/pki/tls/certs/web.crt:/certs/web.crt:ro \
  -v /etc/pki/tls/private/web.key:/certs/web.key:ro \
  -p 443:443 \
  nginx

# Gerenciamento secret aprimorado
podman secret create web-cert /etc/pki/tls/certs/web.crt
podman secret create web-key /etc/pki/tls/private/web.key

# Usar secrets em container
podman run -d --secret web-cert --secret web-key nginx

Recurso 3: Modo FIPS Aprimorado

#============================================#
# FIPS NO RHEL 10
#============================================#

# Modo FIPS com provider FIPS OpenSSL 3.x
sudo fips-mode-setup --enable
sudo reboot

# Verificar status FIPS
fips-mode-setup --check

# RHEL 10: Transição para FIPS 140-3
# Atual: Ainda módulos validados FIPS 140-2
# Futuro: Conformidade FIPS 140-3 quando certificação completar

12.6 Migração do RHEL 9

Deveria Atualizar?

Considerações Atualização:

Razões para Atualizar:

  • ✅ Quer 10+ anos suporte (até 2035)
  • ✅ Necessita últimos aprimoramentos segurança
  • ✅ Preparação futura (preparação pós-quântica)
  • ✅ Suporte container aprimorado
  • ✅ Últimos recursos e melhorias

Razões para Aguardar:

  • ⏸️ RHEL 9 suportado até 2032
  • ⏸️ Sem recursos urgentes relacionados certificado
  • ⏸️ Deixar outros testarem RHEL 10 em produção primeiro
  • ⏸️ Quer aguardar RHEL 10.3 ou 10.4

Impacto Certificado: BAIXO

  • Mesma base OpenSSL (3.5.5)
  • Mesmas ferramentas e comandos
  • Mudanças disruptivas mínimas
  • Maioria transparente

Processo Migração

#============================================#
# MIGRAÇÃO CERTIFICADO RHEL 9 → RHEL 10
#============================================#

# 1. Pré-migração: Verificar certificados
for cert in /etc/pki/tls/certs/*.crt; do
  openssl x509 -in "$cert" -noout -text | grep "Signature Algorithm"
done
# Todos deveriam mostrar SHA-256+ (sem SHA-1 e MD5)

# 2. Backup
tar czf rhel9-certs-backup-$(date +%Y%m%d).tar.gz \
  /etc/pki/tls/ \
  /etc/pki/ca-trust/source/anchors/

# 3. Executar atualização RHEL
sudo leapp upgrade

# 4. Verificar crypto-policy
update-crypto-policies --show

# 5. Reiniciar serviços
sudo systemctl restart httpd nginx postfix

# 6. Testar certificados
curl -v https://localhost/
openssl s_client -connect localhost:443

# 7. Verificar certmonger
sudo getcert list

12.7 Melhores Práticas para RHEL 10

Configuração Recomendado

#============================================#
# CONFIGURAÇÃO RECOMENDADA RHEL 10
#============================================#

# 1. Usar crypto-policy DEFAULT (já ótima)
sudo update-crypto-policies --set DEFAULT

# 2. Preferir TLS 1.3
# (Automaticamente preferido pela política DEFAULT)

# 3. Usar chaves EC para novos certificados
openssl genpkey -algorithm EC -out ec.key \
  -pkeyopt ec_paramgen_curve:P-256

# 4. Automatizar com a ferramenta certa
# Certificado público do Let's Encrypt: usar certbot
sudo certbot certonly --apache -d web.example.com

# Certificado interno do FreeIPA / IdM: usar certmonger
# sudo ipa-getcert request \
#   -f /etc/pki/tls/certs/web.crt \
#   -k /etc/pki/tls/private/web.key \
#   -K HTTP/web.example.com@REALM \
#   -D web.example.com \
#   -C "systemctl reload httpd"

# 5. Monitorar certificados
# Usar monitoramento integrado ou ferramentas externas

# 6. Planejar para PQC futuro
# Acompanhar lançamentos menores RHEL 10.x

12.8 Olhando Para Frente: Prontidão Pós-Quântica

O Que é Criptografia Pós-Quântica?

Problema: Computadores quânticos futuros poderiam quebrar criptografia atual (RSA, ECC) Solução: Novos algoritmos resistentes quânticos

Padrões NIST (Finalizados 2024):

  • ML-KEM-768 (Key Encapsulation)
  • ML-DSA-65 (Digital Signatures)
  • SLH-DSA (Stateless signatures)

Papel RHEL 10:

  • Fornece fundação para PQC
  • Arquitetura OpenSSL 3.x suporta novos algoritmos
  • Lançamentos futuros RHEL 10.x adicionarão suporte PQC

Criptografia Híbrida (Futuro)

# Capacidade futura no RHEL 10.x:
# Usar crypto clássica E resistente quântica

# Exemplo (conceitual - ainda não no RHEL 10.2):
openssl genpkey -algorithm hybrid-rsa-mlkem768 -out hybrid.key

# Fornece:
# - Segurança contra ataques clássicos (RSA)
# - Segurança contra ataques quânticos (ML-KEM)

Nota: Suporte PQC vem em versões menores futuras RHEL 10.x quando padrões forem finalizados e testados.


12.9 O Que Permanece Igual

Sem Mudanças Disruptivas Principais

#============================================#
# COMANDOS FAMILIARES AINDA FUNCIONAM
#============================================#

# Gerar chave (mesmo que RHEL 9)
openssl genpkey -algorithm RSA -out server.key \
  -pkeyopt rsa_keygen_bits:2048

# Gerar CSR (mesmo que RHEL 9)
openssl req -new -key server.key -out server.csr \
  -subj "/CN=server.example.com" \
  -addext "subjectAltName=DNS:server.example.com"

# Ver certificado (mesmo)
openssl x509 -in cert.crt -noout -text

# Testar conexão (mesmo)
openssl s_client -connect server:443

# Gerenciamento trust (mesmo)
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# certmonger (mesmo)
sudo getcert list

# crypto-policies (mesmo)
update-crypto-policies --show

Se você conhece RHEL 9, está pronto para RHEL 10!


12.10 Quando Adotar RHEL 10

Recomendações Timeline Adoção

Adotantes Iniciais (2025-2026):

  • Ambientes teste
  • Cargas trabalho não-críticas
  • Querem recursos mais recentes
  • Pesquisa segurança

Adoção generalizada (2026-2027):

  • Novas implantações
  • Infraestrutura renovada
  • Após lançamento RHEL 10.3/10.4
  • Quando apps principais certificados

Conservador (2027-2028):

  • Sistemas produção críticos
  • Cargas trabalho estáveis
  • Após teste comunidade extensivo
  • Quando migração do RHEL 9 necessária

Recomendação Atual (Final 2025):

  • Novos projetos: Considere RHEL 10
  • ⏸️ RHEL 9 existente: Sem urgência atualizar
  • RHEL 8 ou anterior: Avaliar RHEL 9 ou 10
  • RHEL 7: Atualização requerida (suporte terminou)

12.11 Monitorando Evolução RHEL 10

Manter-se Atualizado

# Verificar versão menor RHEL 10
cat /etc/redhat-release
# Red Hat Enterprise Linux release 10.2 (Coughlan)

# Verificar por atualizações
sudo dnf check-update

# Monitorar anúncios Red Hat
# - https://access.redhat.com/articles/3078
# - Notas lançamento RHEL 10
# - Avisos segurança Red Hat

# Subscrever newsletters Red Hat
# Seguir notas lançamento para 10.3, 10.4, etc.

Recursos a Observar

Esperado em lançamentos menores RHEL 10.x:

  • Suporte criptografia pós-quântica
  • Aprimoramentos crypto-policy adicionais
  • Integração container adicional
  • Ferramentas automatização aprimoradas
  • Módulos FIPS 140-3 adicionais

12.12 Configuração Prática de Certificado RHEL 10

Exemplo Completo: Configuração HTTPS Moderna

#!/bin/bash
# Configuração HTTPS moderna completa no RHEL 10

echo "=== Configuração HTTPS moderna RHEL 10 ==="

# 1. Instalar pacotes
sudo dnf install -y httpd mod_ssl epel-release certbot python3-certbot-apache

# 2. Habilitar serviços
sudo systemctl enable --now httpd

# 3. Solicitar certificado Let's Encrypt com certbot
sudo certbot --apache -d $(hostname -f)

# 4. Verificar o certificado
sudo certbot certificates

# 5. Atualizar configuração Apache
# certbot normalmente atualiza o Apache automaticamente; ajuste manualmente apenas se necessário
sudo sed -i "s|SSLCertificateFile.*|SSLCertificateFile /etc/letsencrypt/live/$(hostname -f)/fullchain.pem|" \
  /etc/httpd/conf.d/ssl.conf
sudo sed -i "s|SSLCertificateKeyFile.*|SSLCertificateKeyFile /etc/letsencrypt/live/$(hostname -f)/privkey.pem|" \
  /etc/httpd/conf.d/ssl.conf

# 6. Crypto-policy já ótima (DEFAULT)
update-crypto-policies --show

# 7. Abrir firewall
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# 8. Recarregar Apache
sudo systemctl reload httpd

# 9. Testar
curl -v https://$(hostname -f)/

echo "✅ Configuração HTTPS moderna RHEL 10 concluída!"
echo "   - TLS 1.3 suportado"
echo "   - Certificado Let's Encrypt"
echo "   - Renovação automática habilitada"
echo "   - Segurança ótima (política DEFAULT)"

12.13 Estratégias Preparação Futura

Preparando para Evolução RHEL 10.x

#============================================#
# GERENCIAMENTO CERTIFICADO PREPARADO FUTURO
#============================================#

# 1. Usar algoritmos modernos (pronto para transição PQC)
# Preferir EC sobre RSA
openssl genpkey -algorithm EC -out ec.key -pkeyopt ec_paramgen_curve:P-256

# 2. Manter certificados vida-curta (90 dias ou menos)
# Mais fácil rotacionar quando algoritmos mudam

# 3. Automatizar tudo
# Usar certbot para ACME público e certmonger para fluxos IPA/internos

# 4. Monitorar anúncios Red Hat
# Subscrever notificações segurança e lançamento

# 5. Testar PQC quando disponível
# Ser testador inicial novos recursos no RHEL 10.x

# 6. Documentar seu setup
# Torna transições futuras mais fáceis

12.14 Problemas Conhecidos e Workarounds

Problema 1: Mesmo que RHEL 9 (OpenSSL 3.x)

Maioria problemas RHEL 9 aplicam ao RHEL 10:

  • Algoritmos legados necessitam -provider legacy
  • SHA-1 bloqueado
  • Apps customizadas podem necessitar atualizações OpenSSL 3.x

Referência: Ver Capítulo 11 para problemas OpenSSL 3.x

Problema 2: Validação Ainda Mais Rigorosa

RHEL 10 pode capturar problemas que RHEL 9 permitiu:

# Exemplo: Certificado marginal que funcionou no RHEL 9
# pode falhar no RHEL 10

# Solução: Sempre usar melhores práticas
# - Assinaturas SHA-256+
# - Chaves 2048+ bits (4096 recomendado)
# - SANs apropriados
# - Cadeias trust válidas

12.15 Quando Escolher RHEL 10

Matriz Decisão

CenárioRHEL 9RHEL 10Recomendação
Nova implantação 2025+✅ Bom✅ MelhorRHEL 10
RHEL 9 existente✅ Manter⏸️ AguardarFicar em 9 por ora
Migrando do RHEL 8✅ Sim✅ ConsidereAmbos (9 é mais seguro)
Migrando do RHEL 7✅ Sim⚠️ Grande saltoIr para 9 primeiro
Horizonte 10+ anos⏸️ Suporte 2032✅ Suporte 2035RHEL 10
Segurança vanguarda✅ Boa✅ MelhorRHEL 10
Produção crítica✅ Provado⏸️ Mais novoRHEL 9 (mais seguro)

12.16 Conclusões Chave

  1. RHEL 10 = RHEL 9 + melhorias incrementais
  2. Mesma base OpenSSL 3.5.5 - Sem mudanças API principais
  3. Padrões segurança mais rigorosos - Bom para segurança
  4. Preparação pós-quântica - Infraestrutura pronta futuro
  5. Sem mudanças certificado urgentes - Transição é suave
  6. Conhecimento RHEL 9 transfere - Mesmas ferramentas e comandos
  7. Observar por lançamentos menores - 10.3, 10.4 podem adicionar recursos

12.17 Solução de Problemas RHEL 10

Abordagem Diagnóstico

#============================================#
# SOLUÇÃO DE PROBLEMAS CERTIFICADO RHEL 10
#============================================#

# Usar a metodologia de solução de problemas (Capítulo 27) e os padrões do RHEL 9 (Capítulo 11)

# 1. Verificar versão RHEL 10
cat /etc/redhat-release
# Red Hat Enterprise Linux release 10.2 (Coughlan)

# 2. Verificar OpenSSL
openssl version
# OpenSSL 3.5.5

# 3. Verificar crypto-policy
update-crypto-policies --show

# 4. Testar certificado
openssl x509 -in cert.crt -noout -text

# 5. Testar conexão
openssl s_client -connect server:443 -tls1_3

# 6. Verificar providers (se problemas)
openssl list -providers

# 7. Verificar logs
sudo journalctl -xe | grep -i cert

Sem novas técnicas de solução de problemas necessárias - mesmo que RHEL 9!


12.18 Caminho Migração Recomendado

Do RHEL 9 para RHEL 10

#============================================#
# MIGRAÇÃO RHEL 9→10 SEGURA CERTIFICADO
#============================================#

# Fase 1: Preparação
# - Backup todos certificados
# - Documentar configuração atual
# - Testar em ambiente lab

# Fase 2: Migração
# - Usar processo atualização RHEL padrão
# - Certificados deveriam transferir sem problemas

# Fase 3: Verificação
# - Verificar crypto-policy inalterada
# - Testar todas operações certificado
# - Confirmar rastreamento certmonger mantido
# - Testar serviços usando certificados

# Fase 4: Otimização
# - Considerar chaves EC para novos certificados
# - Revisar e atualizar crypto-policy se necessário
# - Monitorar por aprimoramentos RHEL 10.x

12.19 Documentação e Recursos

Recursos Oficiais

## Recursos Certificado RHEL 10

### Documentação Oficial
- Notas Lançamento RHEL 10 (verificar para sua versão 10.x específica)
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/10

### Atualizações Segurança
- https://access.redhat.com/security/
- Subscrever anúncios segurança RHEL

### Crypto-Policies
- https://access.redhat.com/articles/3642912
- Verificar por atualizações específicas RHEL 10

### Suporte
- Portal Cliente Red Hat
- Casos Suporte Red Hat
- Fóruns comunidade RHEL

12.20 Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CERTIFICADO RHEL 10                        │
├──────────────────────────────────────────────────────────────┤
│ OpenSSL:       3.5.5-2 (mesmo que RHEL 9.8)                  │
│ TLS:           1.3 preferido, 1.2 suportado                  │
│ Lançado:       20 de maio de 2025 (RHEL 10.0 GA)             │
│ Status:        Pronto produção                               │
│                                                              │
│ Mudança Chave: Melhorias segurança incrementais              │
│ Migração:      Baixo impacto do RHEL 9                       │
│ Comandos:      Mesmos que RHEL 9                             │
│ Ferramentas:   Mesmas que RHEL 9                             │
│                                                              │
│ Futuro:        Preparação crypto pós-quântica                │
│                Observar por recursos em 10.3, 10.4+          │
│                                                              │
│ Verificar:     cat /etc/redhat-release                       │
│                openssl version                               │
│                update-crypto-policies --show                 │
└──────────────────────────────────────────────────────────────┘

✅ Se você conhece certificados RHEL 9, você conhece RHEL 10!
⚠️ Sempre verificar docs oficiais para sua versão menor 10.x específica

Navegação do Capítulo

Capítulo 13: Compatibilidade Entre Versões

Desafio Mundo Real: Seu ambiente provavelmente tem sistemas RHEL 7, 8 e 9 todos conversando entre si. Como você faz certificados funcionarem em todas versões?


13.1 A Realidade do Ambiente Misto

Maioria empresas não atualizam tudo de uma vez. Você encontrará:

Ambiente Produção (Típico):
├── Servidor App Legado (RHEL 7)
├── Servidor Banco Dados (RHEL 8)
├── Camada Web (RHEL 9)
├── Nó Gerenciamento (RHEL 10)
└── Clientes: Windows, Mac, Linux, Mobile

Desafio: Estes sistemas têm diferentes:

  • Suporte versão TLS
  • Suites cifra
  • Regras validação certificado
  • Versões OpenSSL
  • Crypto-policies (ou falta delas)

13.2 Problemas Comuns de Compatibilidade

Problema 1: Desajustes Versão TLS

Cenário: Servidor RHEL 9 (apenas TLS 1.2+) ← Cliente RHEL 7 (TLS 1.0/1.1 padrão)

# Cliente RHEL 7 tentando conectar servidor RHEL 9
curl https://rhel9-server.example.com/
# Erro: SSL routines:ssl3_get_record:wrong version number

# Por quê: RHEL 7 tenta TLS 1.0 primeiro, RHEL 9 rejeita

Solução:

# Opção 1: Atualizar cliente RHEL 7 para usar TLS 1.2
# Editar /etc/httpd/conf.d/ssl.conf (se cliente Apache)
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

# Opção 2: Política LEGACY temporária no RHEL 9 (NÃO recomendado)
# sudo update-crypto-policies --set LEGACY  # No servidor RHEL 9

# Opção 3: Melhor - Atualizar sistemas RHEL 7!

Problema 2: Desajustes Suite Cifra

Cenário: Servidor moderno não suporta cifras cliente antigo

# Cliente RHEL 7 → Servidor RHEL 9
openssl s_client -connect rhel9-server:443 -cipher '3DES'
# Erro: no shared cipher

Por quê: 3DES é bloqueado em política DEFAULT RHEL 8+

Solução:

# Verificar quais cifras estão disponíveis
openssl ciphers -v 'HIGH:!aNULL:!MD5' | head

# Testar cipher específico no cliente
openssl s_client -connect server:443 -cipher 'AES256-GCM-SHA384'

# No servidor RHEL 9, se você DEVE suportar clientes antigos:
sudo update-crypto-policies --set LEGACY  # Temporário!

Problema 3: Diferenças Validação Certificado

Cenário: Certificado assinado SHA-1

Certificado com assinatura SHA-1:
├── ✅ Funciona no RHEL 7
├── ❌ Rejeitado por RHEL 8 DEFAULT
├── ❌ Rejeitado por RHEL 9
└── ❌ Rejeitado por RHEL 10

Solução:

# Reemitir certificado com SHA-256 ou melhor
openssl req -new -key server.key -out server.csr -sha256

# Verificar algoritmo assinatura
openssl x509 -in cert.crt -noout -text | grep "Signature Algorithm"
# Deveria mostrar: sha256WithRSAEncryption (ou melhor)

13.3 Matriz Compatibilidade

Compatibilidade Cliente → Servidor

Cliente ↓ Servidor →Servidor RHEL 7Servidor RHEL 8 (DEFAULT)Servidor RHEL 9 (DEFAULT)Servidor RHEL 10
Cliente RHEL 7✅ Completo⚠️ Problema TLS 1.0/1.1⚠️ Problema TLS 1.0/1.1⚠️ Problema TLS 1.0/1.1
Cliente RHEL 8✅ Completo✅ Completo✅ Completo✅ Completo
Cliente RHEL 9⚠️ Aviso cipher fraco✅ Completo✅ Completo✅ Completo
Cliente RHEL 10⚠️ Aviso cipher fraco✅ Completo✅ Completo✅ Completo
Windows 10✅ Completo✅ Completo✅ Completo✅ Completo
Windows Server 2012✅ Completo⚠️ Pode precisar TLS 1.0/1.1⚠️ Pode precisar TLS 1.0/1.1⚠️ Pode precisar TLS 1.0/1.1
Java 7 antigo✅ Completo❌ Sem TLS 1.2❌ Sem TLS 1.2❌ Sem TLS 1.2

Legenda:

  • ✅ Funciona sem mudanças
  • ⚠️ Funciona com mudanças configuração
  • ❌ Incompatível sem atualizações principais

13.4 Requisitos de Certificado para Máxima Compatibilidade

O Perfil Certificado “Universal”

Para funcionar em todas versões RHEL (7-10) e clientes externos:

# Requisitos Certificado:
✅ Chave RSA: 2048 bits mínimo (4096 para preparação futura)
✅ Assinatura: SHA-256 ou melhor (não SHA-1!)
✅ Subject Alternative Names (SANs) requeridos
✅ Validade: ≤ 365 dias (requisito navegador)
✅ Key Usage: Extensões apropriadas definidas

❌ Evitar: Assinaturas SHA-1
❌ Evitar: RSA < 2048 bits
❌ Evitar: SANs faltando
❌ Evitar: Certificados apenas-CN

Gerar Certificado Compatível

#============================================#
# PASSO 1: Gerar Chave (funciona em todas versões RHEL)
#============================================#

# RSA 2048 (mínimo, compatível)
openssl genpkey -algorithm RSA -out universal.key -pkeyopt rsa_keygen_bits:2048

# Ou RSA 4096 (melhor, ainda compatível)
openssl genpkey -algorithm RSA -out universal.key -pkeyopt rsa_keygen_bits:4096


#============================================#
# PASSO 2: Criar CSR com SANs
#============================================#

openssl req -new -key universal.key -out universal.csr \
  -subj "/C=US/ST=State/L=City/O=Company/CN=server.example.com" \
  -addext "subjectAltName=DNS:server.example.com,DNS:www.example.com,IP:10.0.0.100" \
  -addext "keyUsage=digitalSignature,keyEncipherment" \
  -addext "extendedKeyUsage=serverAuth,clientAuth"


#============================================#
# PASSO 3: Verificar CSR
#============================================#

openssl req -in universal.csr -noout -text | grep -A2 "Subject Alternative Name"
# Deveria mostrar seus SANs

openssl req -in universal.csr -noout -text | grep "Public-Key"
# Deveria mostrar: Public-Key: (2048 bit) ou maior

13.5 Testando Compatibilidade Entre Versões

Script Suite Teste

#!/bin/bash
# test-cert-compatibility.sh
# Testa se certificado funciona de várias versões RHEL

SERVER_HOST="server.example.com"
SERVER_PORT="443"
CERT_FILE="/etc/pki/tls/certs/server.crt"

echo "=== Suite Teste Compatibilidade Certificado ==="
echo ""

#============================================#
# TESTE 1: Propriedades Certificado
#============================================#

echo "1. Propriedades Certificado:"
echo "   Algoritmo Assinatura:"
openssl x509 -in "$CERT_FILE" -noout -text | grep "Signature Algorithm" | head -1

echo "   Tamanho Chave:"
openssl x509 -in "$CERT_FILE" -noout -text | grep "Public-Key"

echo "   SANs:"
openssl x509 -in "$CERT_FILE" -noout -ext subjectAltName 2>/dev/null || echo "   Nenhum SAN encontrado!"

echo ""


#============================================#
# TESTE 2: Suporte Versão TLS
#============================================#

echo "2. Suporte Versão TLS:"

for version in tls1 tls1_1 tls1_2 tls1_3; do
  if openssl s_client -connect "$SERVER_HOST:$SERVER_PORT" -"$version" </dev/null 2>&1 | grep -q "Cipher"; then
    echo "   ${version//_/.}: ✅ Suportado"
  else
    echo "   ${version//_/.}: ❌ Não suportado"
  fi
done

echo ""


#============================================#
# TESTE 3: Compatibilidade Suite Cifra
#============================================#

echo "3. Testes Cipher Comuns:"

# Cipher moderno (RHEL 8+)
if openssl s_client -connect "$SERVER_HOST:$SERVER_PORT" -cipher 'ECDHE-RSA-AES256-GCM-SHA384' </dev/null 2>&1 | grep -q "Cipher"; then
  echo "   Cipher moderno (ECDHE-RSA-AES256-GCM-SHA384): ✅"
else
  echo "   Cipher moderno: ❌"
fi

# Cipher legado (RHEL 7)
if openssl s_client -connect "$SERVER_HOST:$SERVER_PORT" -cipher 'AES256-SHA' </dev/null 2>&1 | grep -q "Cipher"; then
  echo "   Cipher legado (AES256-SHA): ✅ (pode indicar política LEGACY)"
else
  echo "   Cipher legado: ❌ (bom para segurança)"
fi


#============================================#
# TESTE 4: Validação Certificado
#============================================#

echo ""
echo "4. Validação Certificado:"

if openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt "$CERT_FILE" | grep -q "OK"; then
  echo "   Cadeia trust: ✅ Válida"
else
  echo "   Cadeia trust: ❌ Inválida"
fi

echo ""
echo "=== Teste Completo ==="

Uso:

chmod +x test-cert-compatibility.sh
sudo ./test-cert-compatibility.sh

13.6 Lidando com Cenários Compatibilidade Específicos

Cenário 1: Cliente RHEL 7 → Servidor RHEL 9

Problema: Conexão falha com erro versão TLS

Correção Lado Cliente (RHEL 7):

# Para curl
curl --tlsv1.2 https://rhel9-server/

# Para wget
wget --secure-protocol=TLSv1_2 https://rhel9-server/

# Para aplicações usando OpenSSL, definir variável ambiente
export OPENSSL_CONF=/etc/pki/tls/openssl-tls12.cnf

# Criar config customizada
cat > /etc/pki/tls/openssl-tls12.cnf << 'EOF'
openssl_conf = default_conf

[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=1
EOF

Correção Lado Servidor (RHEL 9) - NÃO RECOMENDADO:

# Apenas se absolutamente necessário e temporariamente!
sudo update-crypto-policies --set LEGACY
sudo systemctl restart httpd  # Ou seu serviço

Cenário 2: Trust CA Mista

Problema: CA corporativa confiável em alguns sistemas mas não outros

Solução: Repositório de confiança consistente em todas versões

#============================================#
# SCRIPT IMPLANTAÇÃO (executar em todas versões RHEL)
#============================================#

#!/bin/bash
# deploy-corporate-ca.sh

CA_CERT_URL="http://pki.example.com/ca-chain.crt"
CA_CERT_FILE="/etc/pki/ca-trust/source/anchors/corporate-ca-chain.crt"

# Baixar certificado CA
curl -o "$CA_CERT_FILE" "$CA_CERT_URL"

# Atualizar repositório de confiança (funciona em todas versões RHEL)
update-ca-trust extract

# Verificar
if trust list | grep -q "Corporate Root CA"; then
  echo "✅ CA Corporativa instalada com sucesso"
else
  echo "❌ Instalação CA Corporativa falhou"
  exit 1
fi

Cenário 3: Aplicação Usando Biblioteca TLS Antiga

Problema: Aplicação Java 7 não consegue conectar a servidores modernos

Verificar Suporte TLS Java:

# Verificar versão Java
java -version

# Testar suporte TLS
java -Djavax.net.debug=ssl:handshake -jar app.jar 2>&1 | grep "TLS"

Opções:

# Opção 1: Atualizar Java (melhor)
sudo dnf install java-11-openjdk

# Opção 2: Habilitar TLS 1.2 no Java 7 (se atualização impossível)
# Adicionar ao startup Java:
-Dhttps.protocols=TLSv1.2

# Opção 3: Usar script wrapper
#!/bin/bash
export JAVA_OPTS="-Dhttps.protocols=TLSv1.2 -Djavax.net.ssl.trustStore=/etc/pki/java/cacerts"
java $JAVA_OPTS -jar /path/to/app.jar

13.7 Compatibilidade Crypto-Policy

Entendendo Impacto Política Entre Versões

#============================================#
# RHEL 7 (Sem crypto-policies)
#============================================#

# Configuração manual em cada app
# Apache: /etc/httpd/conf.d/ssl.conf
# NGINX: /etc/nginx/nginx.conf
# Postfix: /etc/postfix/main.cf


#============================================#
# RHEL 8/9/10 (crypto-policies)
#============================================#

# Controle system-wide
update-crypto-policies --set DEFAULT

# Para suportar clientes RHEL 7, pode necessitar:
update-crypto-policies --set LEGACY  # Temporariamente!

Equivalentes Política para Ambientes Mistos

Se você necessita manter compatibilidade:

Opção A: Usar LEGACY em sistemas modernos (não recomendado longo prazo)

# Em servidores RHEL 8/9/10
sudo update-crypto-policies --set LEGACY

Opção B: Configurar RHEL 7 para coincidir DEFAULT (recomendado)

# No RHEL 7, configurar manualmente para coincidir DEFAULT RHEL 8+
# Exemplo Apache:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!CAMELLIA
SSLHonorCipherOrder on

13.8 Caminho Migração: Atualização Gradual

Fase 1: Preparar RHEL 7 (Pré-Migração)

# 1. Reemitir todos certificados com SHA-256+
# 2. Testar compatibilidade TLS 1.2
# 3. Atualizar configurações cipher
# 4. Documentar inventário certificado atual

Fase 2: Implantar RHEL 8 (Transição)

# 1. Começar com política LEGACY
sudo update-crypto-policies --set LEGACY

# 2. Implantar serviços
# 3. Testar completamente
# 4. Gradualmente mudar para DEFAULT
sudo update-crypto-policies --set DEFAULT

Fase 3: Atualizar para RHEL 9 (Modernização)

# 1. Todos clientes deveriam ser RHEL 8+ ou TLS 1.2 capazes
# 2. Usar política DEFAULT
# 3. Monitorar por problemas compatibilidade
# 4. Considerar política FUTURE após estabilização

13.9 Solução de Problemas Entre Versões

Comandos Diagnóstico

#============================================#
# NO CLIENTE
#============================================#

# Testar versão TLS específica
openssl s_client -connect server:443 -tls1_2

# Testar com saída verbose
curl -v --tlsv1.2 https://server/

# Verificar OpenSSL cliente
openssl version
openssl ciphers -v


#============================================#
# NO SERVIDOR
#============================================#

# Verificar crypto-policy (RHEL 8+)
update-crypto-policies --show

# Verificar config OpenSSL
openssl version
cat /etc/crypto-policies/back-ends/opensslcnf.config

# Testar certificado servidor
openssl s_client -connect localhost:443 -servername $(hostname)

# Verificar logs serviço
sudo journalctl -xe | grep -i tls
sudo tail -f /var/log/httpd/ssl_error_log

Mensagens Erro Comuns

ErroCausaSolução
“wrong version number”Desajuste versão TLSAtualizar cliente para TLS 1.2+
“no shared cipher”Incompatibilidade cipherVerificar crypto-policy ou config cipher
“certificate verify failed”Problema trust ou validaçãoVerificar trust CA, validade certificado
“sslv3 alert handshake failure”Incompatibilidade protocoloAtualizar versões TLS
“unsafe legacy renegotiation”OpenSSL antigo no clienteAtualizar OpenSSL cliente

13.10 Melhores Práticas para Ambientes Mistos

1. Padronizar Emissão Certificado

# Padrão Certificado (exemplo)
Algorithm: RSA
Key Size: 2048 bits mínimo (4096 preferido)
Signature: SHA-256 ou melhor
Validity: 365 dias máximo
SANs: Sempre incluir
Extensions: Key usage apropriado definido

2. Manter Repositórios de Confiança Consistentes

# Script implantação para todos sistemas
for host in rhel7-hosts rhel8-hosts rhel9-hosts; do
  ssh "$host" 'sudo cp /path/to/ca.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust'
done

3. Testar Antes de Implantar

# Matriz teste
Cliente RHEL 7 → Servidor RHEL 7 ✓
Cliente RHEL 7 → Servidor RHEL 8 ✓
Cliente RHEL 7 → Servidor RHEL 9 ✓
Cliente RHEL 8 → Servidor RHEL 7 ✓
Cliente RHEL 8 → Servidor RHEL 9 ✓
Cliente RHEL 9 → Servidor RHEL 8 ✓

4. Documentar Seu Ambiente

## Matriz Compatibilidade Certificado

### Servidores:
- App Server 1: RHEL 7.9, TLS 1.0-1.2, RSA 2048
- Banco Dados: RHEL 8.10, política DEFAULT, RSA 2048
- Camada Web: RHEL 9.8, política DEFAULT, RSA 4096

### Limitações Conhecidas:
- Sistemas RHEL 7 requerem TLS 1.0/1.1 para app legado X
- Banco dados requer cipher específico: AES256-GCM-SHA384

### Plano Atualização:
- T1 2025: Migrar App Server 1 para RHEL 8
- T2 2025: Atualizar todos certificados para RSA 4096

13.11 Conclusões Chave

  1. Ambientes mistos são normais - Planejar para compatibilidade
  2. TLS 1.2+ é o mínimo para sistemas modernos
  3. Assinaturas SHA-256+ requeridas para RHEL 8+
  4. Crypto-policies mudaram tudo (RHEL 8+)
  5. Testar em todas versões antes de implantar
  6. Documentar tudo - especialmente exceções
  7. Caminho atualização é gradual - não apressar, testar completamente

Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ CHECKLIST COMPATIBILIDADE ENTRE VERSÕES                      │
├──────────────────────────────────────────────────────────────┤
│ ✅ RSA 2048+ bits                                            │
│ ✅ Assinatura SHA-256+                                       │
│ ✅ SANs incluídos                                            │
│ ✅ Suporte TLS 1.2+                                          │
│ ✅ Cifras modernas                                           │
│ ✅ Trust CA consistente                                      │
│ ✅ Testado em todas versões                                  │
└──────────────────────────────────────────────────────────────┘

Comando teste:
openssl s_client -connect server:443 -tls1_2 -servername server

Verificar política (RHEL 8+):
update-crypto-policies --show

Navegação do Capítulo

Capítulo 14: Apache httpd no RHEL

Mais Comum: Apache (httpd) é o servidor web mais amplamente implantado no RHEL. Domine a configuração HTTPS do Apache em todas as versões RHEL.


14.1 Visão Geral Apache no RHEL

Nome do Pacote: httpd Módulo SSL/TLS: mod_ssl Localização Config: /etc/httpd/conf.d/ssl.conf Caminho Certificados: /etc/pki/tls/certs/ Caminho Chaves: /etc/pki/tls/private/

Comparação de Versões

Versão RHELVersão ApacheOpenSSLAbordagem Config
RHEL 72.4.61.0.2kConfiguração SSL manual
RHEL 82.4.37+1.1.1kManual + crypto-policies
RHEL 92.4.53+3.5.5Crypto-policies preferido
RHEL 102.4.62+3.5.5Crypto-policies ótimo

14.2 Instalação

RHEL 7

#============================================#
# INSTALAR APACHE COM SSL (RHEL 7)
#============================================#

sudo yum install httpd mod_ssl -y
sudo systemctl enable httpd
sudo systemctl start httpd

# Abrir firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Verificar
systemctl status httpd

RHEL 8/9/10

#============================================#
# INSTALAR APACHE COM SSL (RHEL 8/9/10)
#============================================#

sudo dnf install httpd mod_ssl -y
sudo systemctl enable httpd
sudo systemctl start httpd

# Abrir firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Verificar
systemctl status httpd
ss -tlnp | grep :443  # Verificar se escutando na 443

14.3 Configuração Básica SSL

Configuração SSL Padrão

# Arquivo principal de configuração SSL
/etc/httpd/conf.d/ssl.conf

# Diretivas chave:
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

Exemplo Completo de Virtual Host

#============================================#
# /etc/httpd/conf.d/ssl.conf
# Ou /etc/httpd/conf.d/mysite-ssl.conf
#============================================#

<VirtualHost *:443>
    ServerName www.example.com
    ServerAlias example.com
    DocumentRoot /var/www/html

    # Habilitar SSL/TLS
    SSLEngine on

    # Arquivos de certificado
    SSLCertificateFile      /etc/pki/tls/certs/www.example.com.crt
    SSLCertificateKeyFile   /etc/pki/tls/private/www.example.com.key
    SSLCertificateChainFile /etc/pki/tls/certs/chain.crt

    # Protocolos TLS (RHEL 7 - config manual)
    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1

    # Suite de cifra (RHEL 7 - manual)
    SSLCipherSuite          HIGH:!aNULL:!MD5:!3DES:!RC4
    SSLHonorCipherOrder     on

    # HSTS (recomendado)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    # Logging
    ErrorLog  /var/log/httpd/ssl_error_log
    CustomLog /var/log/httpd/ssl_access_log combined
</VirtualHost>

14.4 Configuração Específica por Versão

RHEL 7: Configuração SSL Manual

#============================================#
# APACHE SSL - MELHORES PRÁTICAS RHEL 7
#============================================#

<VirtualHost *:443>
    ServerName www.example.com
    SSLEngine on

    # Certificados
    SSLCertificateFile      /etc/pki/tls/certs/www.crt
    SSLCertificateKeyFile   /etc/pki/tls/private/www.key
    SSLCertificateChainFile /etc/pki/tls/certs/chain.crt

    # REQUERIDO: Desabilitar versões TLS antigas manualmente
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

    # REQUERIDO: Apenas cifras fortes
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
    SSLHonorCipherOrder on

    # Headers segurança
    Header always set Strict-Transport-Security "max-age=31536000"
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff
</VirtualHost>

RHEL 8/9/10: Crypto-Policies Integradas

#============================================#
# APACHE SSL - RHEL 8/9/10 COM CRYPTO-POLICIES
#============================================#

<VirtualHost *:443>
    ServerName www.example.com
    SSLEngine on

    # Certificados
    SSLCertificateFile      /etc/pki/tls/certs/www.crt
    SSLCertificateKeyFile   /etc/pki/tls/private/www.key
    SSLCertificateChainFile /etc/pki/tls/certs/chain.crt

    # NÃO PRECISA definir SSLProtocol ou SSLCipherSuite!
    # Crypto-policies lida com isso automaticamente
    # (a menos que você tenha requisitos específicos)

    # Headers segurança (ainda manual)
    Header always set Strict-Transport-Security "max-age=31536000"
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff
</VirtualHost>

Diferença Chave: No RHEL 8+, crypto-policies configuram automaticamente versões TLS e cifras!

Verificando Integração Crypto-Policy

#============================================#
# VERIFICAR CRYPTO-POLICY (RHEL 8/9/10)
#============================================#

# Verificar política atual
update-crypto-policies --show

# Ver política específica Apache
cat /etc/crypto-policies/back-ends/httpd.config

# Apache automaticamente inclui isto
grep -r "crypto-policies" /etc/httpd/

14.5 Geração de Certificado para Apache

Fluxo de Trabalho Completo

#============================================#
# GERAR CERTIFICADO PARA APACHE (TODAS VERSÕES)
#============================================#

# Passo 1: Gerar chave privada
sudo openssl genpkey -algorithm RSA \
  -out /etc/pki/tls/private/www.example.com.key \
  -pkeyopt rsa_keygen_bits:2048

# Passo 2: Definir permissões
sudo chmod 600 /etc/pki/tls/private/www.example.com.key
sudo chown root:root /etc/pki/tls/private/www.example.com.key

# Passo 3: Gerar CSR com SANs
sudo openssl req -new \
  -key /etc/pki/tls/private/www.example.com.key \
  -out /tmp/www.example.com.csr \
  -subj "/C=US/ST=State/L=City/O=Company/CN=www.example.com" \
  -addext "subjectAltName=DNS:www.example.com,DNS:example.com"

# Passo 4: Submeter CSR para CA, receber certificado

# Passo 5: Instalar certificado
sudo cp www.example.com.crt /etc/pki/tls/certs/
sudo chmod 644 /etc/pki/tls/certs/www.example.com.crt

# Passo 6: Se usando certificados intermediários, instalar cadeia
sudo cp chain.crt /etc/pki/tls/certs/www.example.com-chain.crt

# Passo 7: Atualizar config Apache (ver seção 13.3)

# Passo 8: Testar configuração
sudo apachectl configtest

# Passo 9: Recarregar Apache
sudo systemctl reload httpd

# Passo 10: Testar HTTPS
curl -v https://www.example.com/
openssl s_client -connect www.example.com:443 -servername www.example.com

14.6 Integração certmonger (Automatização!)

Usando certmonger com Apache

#============================================#
# AUTOMATIZAR CERTIFICADOS APACHE COM CERTMONGER
#============================================#

# Instalar certmonger
sudo dnf install certmonger
sudo systemctl enable --now certmonger

# Opção 1: FreeIPA (CA Interna)
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/www.example.com.crt \
  -k /etc/pki/tls/private/www.example.com.key \
  -D www.example.com \
  -K host/www.example.com@REALM \
  -C "systemctl reload httpd"  # Auto-recarregar Apache após renovação!

# Opção 2: Let's Encrypt (RHEL 9+)
sudo getcert request \
  -c lets-encrypt \
  -f /etc/pki/tls/certs/www.example.com.crt \
  -k /etc/pki/tls/private/www.example.com.key \
  -D www.example.com \
  -C "systemctl reload httpd"

# Verificar status
sudo getcert list

# Aguardar status MONITORING
# Certificado automaticamente renova ~30 dias antes expiração!

Benefícios:

  • ✅ Renovação automática
  • ✅ Sem downtime (reload, não restart)
  • ✅ Rastreia expiração
  • ✅ Alertas email em falha

14.7 Let’s Encrypt com certbot

⚠️ IMPORTANTE: EPEL Requerido

certbot NÃO está disponível nos repositórios oficiais RHEL. Requer EPEL (Extra Packages for Enterprise Linux), um repositório mantido pela comunidade.

Para ambientes RHEL produção, considere:

  • FreeIPA com certmonger (recomendado para RHEL)
  • Gerenciamento certificado manual
  • CA comercial com certmonger
#============================================#
# CONFIGURAÇÃO CERTBOT (REQUER EPEL!)
#============================================#

# Passo 1: Habilitar EPEL (TODAS versões RHEL)
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E %rhel).noarch.rpm

# Ou no RHEL 8/9/10:
sudo dnf install epel-release

# Passo 2: Instalar certbot
sudo dnf install certbot python3-certbot-apache

# Passo 3: Obter certificado (automatizado!)
sudo certbot --apache -d www.example.com -d example.com

# Passo 4: Certbot automaticamente:
#  - Gera certificado
#  - Configura Apache
#  - Configura timer renovação
#  - Habilita redirect HTTPS

# Passo 5: Testar renovação automática
sudo certbot renew --dry-run

# Verificar timer renovação
systemctl list-timers | grep certbot

Prós:

  • ✅ Totalmente automatizado
  • ✅ Certificados gratuitos
  • ✅ Config Apache lidada automaticamente

Contras:

  • ❌ Requer EPEL (não oficialmente suportado por Red Hat)
  • ❌ Dependência externa (Let’s Encrypt)
  • ⚠️ Domínio deve ser publicamente acessível

14.8 Solução de Problemas Apache HTTPS

Lista de Verificação Problemas Comuns

#============================================#
# CHECKLIST SOLUÇÃO DE PROBLEMAS SSL APACHE
#============================================#

# 1. Verificar se mod_ssl está carregado
sudo httpd -M | grep ssl_module
# Deveria mostrar: ssl_module (shared)

# 2. Verificar sintaxe configuração
sudo apachectl configtest
# Deveria mostrar: Syntax OK

# 3. Verificar se arquivos certificado existem
ls -l /etc/pki/tls/certs/www.crt
ls -l /etc/pki/tls/private/www.key

# 4. Verificar permissões
ls -l /etc/pki/tls/private/www.key
# Deveria ser: -rw------- (600)

# 5. Verificar contexto SELinux
ls -Z /etc/pki/tls/certs/www.crt
ls -Z /etc/pki/tls/private/www.key
# Deveria mostrar: cert_t

# 6. Testar coincidência par certificado/chave
CERT_MOD=$(openssl x509 -noout -modulus -in /etc/pki/tls/certs/www.crt | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in /etc/pki/tls/private/www.key | openssl md5)
[ "$CERT_MOD" = "$KEY_MOD" ] && echo "✅ Coincide" || echo "❌ Não coincide!"

# 7. Verificar se porta 443 está escutando
ss -tlnp | grep :443

# 8. Verificar firewall
sudo firewall-cmd --list-services | grep https

# 9. Testar localmente
curl -vk https://localhost/

# 10. Verificar logs
sudo tail -f /var/log/httpd/ssl_error_log

Erros Comuns e Soluções

Mensagem ErroCausaSolução
“SSLCertificateFile: file does not exist”Caminho erradoCorrigir caminho em ssl.conf
“Permission denied” em arquivo chavePermissões erradaschmod 600 na chave
“certificate verify failed”Problema cadeiaInstalar certs intermediários
“SSLCertificateKeyFile: file does not exist”Chave faltandoGerar ou restaurar chave
“Private key does not match certificate”Desajuste cert/chaveRegenerar CSR com chave correta
“SSL Library Error”mod_ssl não carregadoInstalar pacote mod_ssl
“ca md too weak” (RHEL 9+)Assinatura SHA-1Reemitir com SHA-256+
“name mismatch”Hostname não coincide CN/SANCorrigir SANs certificado

14.9 Solução de Problemas Específico por Versão

Específico RHEL 7

#============================================#
# PROBLEMAS APACHE RHEL 7
#============================================#

# Problema: Navegadores modernos rejeitam TLS 1.0/1.1
# Solução: Desabilitar TLS antigo em ssl.conf
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

# Problema: Cifras fracas marcadas por scan
# Solução: Usar cifras fortes
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5
SSLHonorCipherOrder on

# Problema: Sem SANs no certificado
# Solução: Reemitir com SANs (ver 13.5)

# Testar
openssl s_client -connect localhost:443 -tls1_2

Específico RHEL 8/9/10

#============================================#
# PROBLEMAS APACHE RHEL 8/9/10
#============================================#

# Problema: Serviço falha após mudança crypto-policy
# Diagnóstico:
update-crypto-policies --show
sudo journalctl -xe -u httpd | grep -i tls

# Solução 1: Verificar se política está correta
sudo update-crypto-policies --set DEFAULT

# Solução 2: Verificar se você manualmente sobrescreve política
grep -E "SSLProtocol|SSLCipherSuite" /etc/httpd/conf.d/*.conf
# Se encontrado, remover (deixar crypto-policy lidar com isso)

# Problema: Erro "no shared cipher"
# Diagnóstico: Cliente muito antigo ou política muito restritiva
# Solução temporária:
sudo update-crypto-policies --set LEGACY
sudo systemctl restart httpd

# Solução apropriada: Atualizar cliente ou criar módulo política customizado

14.10 Melhores Práticas de Segurança

Configuração SSL Apache Fortalecida

#============================================#
# CONFIG SSL FORTALECIDA (TODAS VERSÕES)
#============================================#

<VirtualHost *:443>
    ServerName secure.example.com

    SSLEngine on
    SSLCertificateFile      /etc/pki/tls/certs/secure.crt
    SSLCertificateKeyFile   /etc/pki/tls/private/secure.key

    # RHEL 7: Config TLS manual
    # SSLProtocol TLSv1.2 TLSv1.3
    # SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256
    # SSLHonorCipherOrder on

    # RHEL 8/9/10: Crypto-policies lidam com acima automaticamente

    # HSTS (forçar HTTPS por 1 ano)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    # Prevenir clickjacking
    Header always set X-Frame-Options "DENY"

    # Prevenir MIME-type sniffing
    Header always set X-Content-Type-Options "nosniff"

    # Desabilitar assinatura servidor
    ServerSignature Off
    ServerTokens Prod

    # OCSP Stapling (RHEL 8/9/10)
    SSLUseStapling on
    SSLStaplingCache "shmcb:/var/run/ocsp(128000)"

    # Auth certificado cliente (opcional)
    # SSLVerifyClient require
    # SSLVerifyDepth 3
    # SSLCACertificateFile /etc/pki/tls/certs/client-ca.crt
</VirtualHost>

# Fora VirtualHost (configurações SSL globais)
SSLStaplingCache "shmcb:/var/run/ocsp(128000)"

14.11 Redirect HTTP para HTTPS

Forçar HTTPS

#============================================#
# REDIRECT HTTP → HTTPS
#============================================#

# Método 1: VirtualHost Separado
<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... config SSL ...
</VirtualHost>

# Método 2: mod_rewrite
<VirtualHost *:80>
    ServerName www.example.com

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

14.12 Testando Apache HTTPS

Teste Abrangente

#============================================#
# SUITE TESTE APACHE HTTPS
#============================================#

# Teste 1: Sintaxe configuração
sudo apachectl configtest

# Teste 2: Módulo SSL carregado
sudo httpd -M | grep ssl

# Teste 3: Porta escutando
ss -tlnp | grep :443

# Teste 4: Conexão local
curl -vk https://localhost/

# Teste 5: Hostname real
curl -v https://www.example.com/

# Teste 6: Validação certificado
openssl s_client -connect www.example.com:443 -servername www.example.com

# Teste 7: TLS 1.2
openssl s_client -connect www.example.com:443 -tls1_2

# Teste 8: TLS 1.3 (RHEL 8+)
openssl s_client -connect www.example.com:443 -tls1_3

# Teste 9: Verificar detalhes certificado do servidor
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>&1 | \
  openssl x509 -noout -text | head -30

# Teste 10: Teste online (externo)
# Usar: https://www.ssllabs.com/ssltest/

14.13 Otimização de Desempenho

Ajuste Desempenho SSL/TLS

#============================================#
# AJUSTE DESEMPENHO
#============================================#

<VirtualHost *:443>
    # ... config básica ...

    # Cache de sessão (melhora desempenho)
    SSLSessionCache         "shmcb:/var/cache/httpd/ssl_scache(512000)"
    SSLSessionCacheTimeout  300

    # OCSP Stapling (reduz lookup lado cliente)
    SSLUseStapling on
    SSLStaplingCache "shmcb:/var/run/ocsp(128000)"

    # Keep-Alive (reusar conexões)
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5

    # HTTP/2 (RHEL 8/9/10)
    Protocols h2 h2c http/1.1
</VirtualHost>

14.14 Monitorando Apache HTTPS

O Que Monitorar

#============================================#
# MONITORAMENTO APACHE HTTPS
#============================================#

# Expiração certificado
openssl s_client -connect localhost:443 -servername $(hostname -f) 2>/dev/null | \
  openssl x509 -noout -dates

# Status serviço
systemctl status httpd

# Contagem conexões
ss -tn | grep :443 | wc -l

# Monitoramento log erro
sudo tail -f /var/log/httpd/ssl_error_log

# Status certmonger (se usado)
sudo getcert list -f /etc/pki/tls/certs/www.crt

# Análise log acesso
sudo tail -f /var/log/httpd/ssl_access_log | grep -E "HTTP/[12]"

14.15 Guia Rápido de Solução de Problemas

Apache HTTPS Não Funcionando?

├─ Apache não inicia?
│  ├─ Verificar: apachectl configtest
│  ├─ Verificar: journalctl -xe -u httpd
│  └─ Corrigir: Erros configuração
│
├─ Não consegue conectar à porta 443?
│  ├─ Verificar: ss -tlnp | grep :443
│  ├─ Verificar: firewall-cmd --list-services
│  └─ Corrigir: Abrir firewall, iniciar httpd
│
├─ Avisos certificado no navegador?
│  ├─ Verificar: Expiração certificado
│  ├─ Verificar: Coincidência hostname (CN/SANs)
│  ├─ Verificar: Cadeia confiança
│  └─ Corrigir: Renovar cert, corrigir SANs, instalar CA
│
├─ Erro "No shared cipher"?
│  ├─ Verificar: update-crypto-policies --show
│  ├─ Verificar: Versão TLS cliente
│  └─ Corrigir: Atualizar política ou cliente
│
└─ Erros permissão?
   ├─ Verificar: ls -lZ /etc/pki/tls/private/*.key
   ├─ Verificar: Negações SELinux
   └─ Corrigir: chmod 600, restorecon

14.16 Conclusões Chave

  1. Apache + mod_ssl é o servidor web padrão RHEL
  2. RHEL 7: Configuração TLS manual requerida
  3. RHEL 8/9/10: Crypto-policies simplificam configuração
  4. Integração certmonger habilita automatização
  5. certbot requer EPEL (não oficialmente suportado)
  6. Sempre usar SANs em certificados
  7. Testar completamente antes de implantação em produção

Cartão de Referência Rápida

┌─────────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA APACHE HTTPD HTTPS                                │
├─────────────────────────────────────────────────────────────────────┤
│ Instalar:       dnf install httpd mod_ssl                           │
│ Config:         /etc/httpd/conf.d/ssl.conf                          │
│ Certs:          /etc/pki/tls/certs/                                 │
│ Chaves:         /etc/pki/tls/private/ (modo 600!)                   │
│                                                                     │
│ Testar config:  apachectl configtest                                │
│ Recarregar:     systemctl reload httpd                              │
│ Logs:           /var/log/httpd/ssl_error_log                        │
│                                                                     │
│ certmonger:     ipa-getcert request ... -C "systemctl reload httpd" │
│ certbot:        certbot --apache (requer EPEL!)                     │
│                                                                     │
│ Testar:         curl -v https://localhost/                          │
│                 openssl s_client -connect host:443                  │
└─────────────────────────────────────────────────────────────────────┘

⚠️ RHEL 8/9/10: Deixar crypto-policies lidar com config TLS/cifra
⚠️ certbot requer EPEL (não oficialmente suportado)

🧪 Laboratório Prático

Lab 06: Configuração HTTPS do Apache

Configure Apache com SSL/TLS em diferentes versões RHEL

  • 📁 Localização: labs/pt_BR/06-apache-https/
  • ⏱️ Tempo: 30-40 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 15: NGINX no RHEL

Alto Desempenho: NGINX é um servidor web e proxy reverso de alto desempenho popular. Aprenda como configurar NGINX com certificados TLS no RHEL.


15.1 Visão Geral NGINX no RHEL

Nome do Pacote: nginx Localização Config: /etc/nginx/nginx.conf Caminho Certificados: /etc/pki/tls/certs/ ou /etc/nginx/certs/ Caminho Chaves: /etc/pki/tls/private/ ou /etc/nginx/certs/

Fontes de Instalação por Versão RHEL

Versão RHELFonte NGINXComo Instalar
RHEL 7EPEL (comunidade)Habilitar EPEL, então yum install nginx
RHEL 8AppStream (oficial)dnf module install nginx:1.20
RHEL 9AppStream (oficial)dnf install nginx
RHEL 10AppStream (oficial)dnf install nginx

Nota: RHEL 7 requer EPEL para NGINX. RHEL 8+ inclui NGINX em repos oficiais.


15.2 Instalação

RHEL 7

#============================================#
# INSTALAR NGINX (RHEL 7 - REQUER EPEL)
#============================================#

# Passo 1: Habilitar EPEL
sudo yum install epel-release -y

# Passo 2: Instalar NGINX
sudo yum install nginx -y

# Passo 3: Habilitar e iniciar
sudo systemctl enable nginx
sudo systemctl start nginx

# Passo 4: Abrir firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Verificar
systemctl status nginx
curl http://localhost/

RHEL 8

#============================================#
# INSTALAR NGINX (RHEL 8 - DO APPSTREAM)
#============================================#

# Listar módulos NGINX disponíveis
dnf module list nginx

# Instalar versão específica
sudo dnf module install nginx:1.20 -y

# Ou instalar padrão
sudo dnf install nginx -y

# Habilitar e iniciar
sudo systemctl enable nginx
sudo systemctl start nginx

# Abrir firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

RHEL 9/10

#============================================#
# INSTALAR NGINX (RHEL 9/10)
#============================================#

sudo dnf install nginx -y

sudo systemctl enable nginx
sudo systemctl start nginx

# Abrir firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Verificar
systemctl status nginx
ss -tlnp | grep :443

15.3 Configuração Básica HTTPS

Configuração TLS Mínimo

#============================================#
# /etc/nginx/nginx.conf ou /etc/nginx/conf.d/default.conf
#============================================#

server {
    listen 80;
    server_name www.example.com;

    # Redirecionar HTTP para HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    # Arquivos de certificado
    ssl_certificate     /etc/pki/tls/certs/www.example.com.crt;
    ssl_certificate_key /etc/pki/tls/private/www.example.com.key;

    # Protocolos TLS
    ssl_protocols TLSv1.2 TLSv1.3;

    # Cifras
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Diretório raiz
    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Configuração Produção Fortalecida

#============================================#
# CONFIG HTTPS NGINX NÍVEL PRODUÇÃO
#============================================#

server {
    listen 443 ssl http2;
    server_name api.example.com;

    # Certificados
    ssl_certificate     /etc/pki/tls/certs/api.example.com.crt;
    ssl_certificate_key /etc/pki/tls/private/api.example.com.key;

    # Versões TLS
    ssl_protocols TLSv1.2 TLSv1.3;

    # Cifras fortes
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    # Parâmetros DH (opcional, para perfect forward secrecy)
    ssl_dhparam /etc/nginx/dhparam.pem;

    # Otimização sessão SSL
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/pki/tls/certs/chain.crt;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # Headers segurança
    add_header X-Frame-Options DENY always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;

    # Logging
    access_log /var/log/nginx/api_access.log;
    error_log /var/log/nginx/api_error.log;

    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

15.4 Configuração de Certificado

Gerar Certificados para NGINX

#============================================#
# GERAÇÃO CERTIFICADO PARA NGINX
#============================================#

# Passo 1: Criar diretório certs (opcional)
sudo mkdir -p /etc/nginx/certs
sudo chmod 755 /etc/nginx/certs

# Passo 2: Gerar chave privada
sudo openssl genpkey -algorithm RSA \
  -out /etc/pki/tls/private/api.example.com.key \
  -pkeyopt rsa_keygen_bits:2048

# Passo 3: Definir permissões
sudo chmod 600 /etc/pki/tls/private/api.example.com.key
sudo chown root:nginx /etc/pki/tls/private/api.example.com.key

# Passo 4: Gerar CSR
sudo openssl req -new \
  -key /etc/pki/tls/private/api.example.com.key \
  -out /tmp/api.example.com.csr \
  -subj "/CN=api.example.com" \
  -addext "subjectAltName=DNS:api.example.com,DNS:www.api.example.com"

# Passo 5: Submeter para CA, receber certificado

# Passo 6: Instalar certificado
sudo cp api.example.com.crt /etc/pki/tls/certs/
sudo chmod 644 /etc/pki/tls/certs/api.example.com.crt

15.5 Integração certmonger

Renovação Automatizada com certmonger

#============================================#
# CERTMONGER + NGINX
#============================================#

# Instalar certmonger
sudo dnf install certmonger
sudo systemctl enable --now certmonger

# Solicitar certificado do FreeIPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/nginx.example.com.crt \
  -k /etc/pki/tls/private/nginx.example.com.key \
  -D nginx.example.com \
  -K host/nginx.example.com@REALM \
  -C "systemctl reload nginx"  # Auto-recarregar na renovação!

# Ou do Let's Encrypt (RHEL 9+)
sudo getcert request \
  -c lets-encrypt \
  -f /etc/pki/tls/certs/nginx.example.com.crt \
  -k /etc/pki/tls/private/nginx.example.com.key \
  -D nginx.example.com \
  -C "systemctl reload nginx"

# Monitorar status
sudo getcert list

15.6 Let’s Encrypt com certbot

⚠️ IMPORTANTE: EPEL Requerido

certbot NÃO está disponível nos repositórios oficiais RHEL. Requer EPEL, um repositório mantido pela comunidade.

Instalação: Todas as versões RHEL requerem EPEL, mas o comando de habilitação varia conforme a versão. Consulte o Capítulo 24 para o fluxo completo do certbot.

RHEL 7

# Passo 1: Habilitar EPEL
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y

# Passo 2: Instalar certbot com plugin NGINX
sudo yum install certbot python2-certbot-nginx -y

RHEL 8

# Passo 1: Habilitar EPEL
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
# Ou, com assinatura ativa:
# sudo dnf install epel-release -y

# Passo 2: Instalar certbot com plugin NGINX
sudo dnf install certbot python3-certbot-nginx -y

RHEL 9/10

# Passo 1: Habilitar EPEL
sudo dnf install epel-release -y

# Passo 2: Instalar certbot com plugin NGINX
sudo dnf install certbot python3-certbot-nginx -y

Obter e configurar o certificado (todas as versões)

# Passo 3: Obter e instalar certificado (automatizado!)
sudo certbot --nginx -d www.example.com -d example.com

# Certbot vai:
#  ✅ Gerar certificado do Let's Encrypt
#  ✅ Atualizar configuração NGINX automaticamente
#  ✅ Configurar redirect HTTP para HTTPS
#  ✅ Configurar auto-renovação

# Passo 4: Verificar timer auto-renovação
systemctl list-timers | grep certbot

# Passo 5: Testar renovação (dry run)
sudo certbot renew --dry-run

# Certificado renova automaticamente a cada 60 dias!

Lembrar: EPEL é suportado pela comunidade, não Red Hat. Para produção empresarial, considere FreeIPA + certmonger.


15.7 Proxy Reverso com TLS

NGINX como Proxy Terminação TLS

#============================================#
# NGINX PROXY REVERSO COM TLS
#============================================#

upstream backend_servers {
    server 10.0.1.10:8080;
    server 10.0.1.11:8080;
    server 10.0.1.12:8080;
}

server {
    listen 443 ssl http2;
    server_name proxy.example.com;

    # Terminação TLS aqui
    ssl_certificate     /etc/pki/tls/certs/proxy.crt;
    ssl_certificate_key /etc/pki/tls/private/proxy.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # Proxy para backends (HTTP)
    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

15.8 Solução de Problemas NGINX HTTPS

Comandos de Diagnóstico

#============================================#
# SOLUÇÃO DE PROBLEMAS NGINX HTTPS
#============================================#

# Testar sintaxe configuração
sudo nginx -t

# Mostrar configuração completa (com includes)
sudo nginx -T

# Verificar caminhos certificado SSL
sudo nginx -T | grep ssl_certificate

# Verificar arquivo certificado
sudo openssl x509 -in /etc/pki/tls/certs/nginx.crt -noout -text

# Verificar arquivo chave
sudo openssl rsa -in /etc/pki/tls/private/nginx.key -check

# Verificar coincidência par cert/chave
CERT=$(openssl x509 -noout -modulus -in /etc/pki/tls/certs/nginx.crt | openssl md5)
KEY=$(openssl rsa -noout -modulus -in /etc/pki/tls/private/nginx.key | openssl md5)
[ "$CERT" = "$KEY" ] && echo "✅ Coincide" || echo "❌ Desajuste!"

# Verificar se NGINX está escutando na 443
ss -tlnp | grep :443

# Verificar contexto SELinux
ls -Z /etc/pki/tls/certs/nginx.crt
ls -Z /etc/pki/tls/private/nginx.key

# Testar HTTPS localmente
curl -vk https://localhost/

# Verificar logs
sudo tail -f /var/log/nginx/error.log

Erros HTTPS Comuns do NGINX

ErroCausaSolução
“SSL: error:0200100D…”Permissão negada na chavechmod 600 no arquivo chave
“no ssl configured for the server”Faltando ssl em listenAdicionar listen 443 ssl;
“cannot load certificate”Arquivo não encontrado ou inválidoVerificar caminho e formato cert
“PEM_read_bio:no start line”Formato erradoGarantir que cert está em formato PEM
“key values mismatch”Cert/chave não coincidemRegenerar com chave correta
“nginx: [emerg] bind() failed”Porta já em usoVerificar ss -tlnp | grep :443

15.9 Configuração Específica por Versão

RHEL 7: Configuração TLS Manual

#============================================#
# NGINX RHEL 7 - CONFIG SSL MANUAL
#============================================#

server {
    listen 443 ssl;
    server_name www.example.com;

    ssl_certificate     /etc/pki/tls/certs/www.crt;
    ssl_certificate_key /etc/pki/tls/private/www.key;

    # REQUERIDO: Desabilitar manualmente TLS fraco
    ssl_protocols TLSv1.2;  # Sem TLS 1.0/1.1!

    # REQUERIDO: Definir manualmente cifras fortes
    ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5';
    ssl_prefer_server_ciphers on;

    # Headers segurança
    add_header Strict-Transport-Security "max-age=31536000" always;

    root /usr/share/nginx/html;
}

RHEL 8/9/10: Consciente de Crypto-Policies

#============================================#
# NGINX RHEL 8/9/10 - COM CRYPTO-POLICIES
#============================================#

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate     /etc/pki/tls/certs/www.crt;
    ssl_certificate_key /etc/pki/tls/private/www.key;

    # Config TLS mínima - crypto-policies lidam com resto!
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Ou confiar completamente em crypto-policies:
    # (remover ssl_protocols e ssl_ciphers)
    # NGINX usará crypto-policy do sistema

    # Otimização sessão
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/pki/tls/certs/chain.crt;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    root /usr/share/nginx/html;
}

15.10 Otimização de Desempenho

Ajuste Desempenho SSL/TLS

#============================================#
# OTIMIZAÇÃO DESEMPENHO SSL NGINX
#============================================#

http {
    # Cache sessão SSL (reduz overhead handshake)
    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # Tamanhos buffer
    ssl_buffer_size 4k;  # Menor = menor latência, maior = melhor throughput

    server {
        listen 443 ssl http2;
        server_name fast.example.com;

        ssl_certificate     /etc/pki/tls/certs/fast.crt;
        ssl_certificate_key /etc/pki/tls/private/fast.key;

        # Usar HTTP/2 para multiplexing
        # (já habilitado na diretiva listen)

        # Habilitar OCSP Stapling (reduz tempo lookup cliente)
        ssl_stapling on;
        ssl_stapling_verify on;

        # Keep-alive
        keepalive_timeout 70;
        keepalive_requests 100;

        location / {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
}

15.11 Múltiplos Certificados (SNI)

Server Name Indication (SNI)

#============================================#
# MÚLTIPLOS DOMÍNIOS COM CERTIFICADOS DIFERENTES
#============================================#

# Site 1
server {
    listen 443 ssl http2;
    server_name site1.example.com;

    ssl_certificate     /etc/pki/tls/certs/site1.crt;
    ssl_certificate_key /etc/pki/tls/private/site1.key;

    root /var/www/site1;
}

# Site 2
server {
    listen 443 ssl http2;
    server_name site2.example.com;

    ssl_certificate     /etc/pki/tls/certs/site2.crt;
    ssl_certificate_key /etc/pki/tls/private/site2.key;

    root /var/www/site2;
}

# Site 3 (wildcard)
server {
    listen 443 ssl http2;
    server_name *.apps.example.com;

    ssl_certificate     /etc/pki/tls/certs/wildcard.apps.crt;
    ssl_certificate_key /etc/pki/tls/private/wildcard.apps.key;

    root /var/www/apps;
}

15.12 Autenticação Certificado Cliente

Mutual TLS (mTLS) com NGINX

#============================================#
# NGINX COM AUTH CERTIFICADO CLIENTE
#============================================#

server {
    listen 443 ssl http2;
    server_name secure.example.com;

    # Certificados servidor
    ssl_certificate     /etc/pki/tls/certs/secure.crt;
    ssl_certificate_key /etc/pki/tls/private/secure.key;

    # Verificação certificado cliente
    ssl_client_certificate /etc/pki/tls/certs/client-ca.crt;
    ssl_verify_client on;  # ou 'optional'
    ssl_verify_depth 3;

    # Passar info cert cliente para backend
    location / {
        proxy_pass http://backend;
        proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
        proxy_set_header X-SSL-Client-DN $ssl_client_s_dn;
        proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
    }
}

15.13 Testando NGINX HTTPS

Suite de Teste Abrangente

#============================================#
# TESTE NGINX HTTPS
#============================================#

# Teste 1: Sintaxe configuração
sudo nginx -t
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# Teste 2: Mostrar configuração efetiva
sudo nginx -T | grep -A10 "server_name www.example.com"

# Teste 3: Porta escutando
ss -tlnp | grep nginx

# Teste 4: HTTPS local
curl -vk https://localhost/

# Teste 5: Baseado em hostname
curl -v https://www.example.com/

# Teste 6: Verificar certificado do servidor
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>&1 | \
  openssl x509 -noout -subject -dates

# Teste 7: TLS 1.2
openssl s_client -connect www.example.com:443 -tls1_2

# Teste 8: TLS 1.3 (RHEL 8+)
openssl s_client -connect www.example.com:443 -tls1_3

# Teste 9: Suporte HTTP/2
curl -I --http2 https://www.example.com/

# Teste 10: Headers segurança
curl -I https://www.example.com/ | grep -i "strict-transport"

15.14 Problemas e Soluções Comuns

Problema 1: “Permission denied” na Chave Privada

# Sintoma
sudo nginx -t
# nginx: [emerg] SSL_CTX_use_PrivateKey_file() failed (SSL: error:0200100D:system library:fopen:Permission denied)

# Verificar permissões
ls -l /etc/pki/tls/private/nginx.key

# Corrigir
sudo chmod 600 /etc/pki/tls/private/nginx.key
sudo chown root:nginx /etc/pki/tls/private/nginx.key

# Se problema SELinux:
sudo restorecon -v /etc/pki/tls/private/nginx.key

Problema 2: Cadeia Certificado Não Enviada

# Testar do cliente
openssl s_client -connect www.example.com:443 -showcerts

# Se mostra apenas cert servidor (não intermediários):
# Criar bundle certificado
cat server.crt intermediate.crt > /etc/pki/tls/certs/bundle.crt

# Atualizar config NGINX
ssl_certificate /etc/pki/tls/certs/bundle.crt;

# Recarregar
sudo systemctl reload nginx

Problema 3: OCSP Stapling Não Funcionando

# Testar OCSP stapling
openssl s_client -connect www.example.com:443 -status -tlsextdebug 2>&1 | grep -A17 "OCSP"

# Causas comuns:
# 1. Sem resolver configurado
# Corrigir: Adicionar a nginx.conf:
resolver 8.8.8.8 8.8.4.4 valid=300s;

# 2. Cadeia certificado confiável faltando
# Corrigir:
ssl_trusted_certificate /etc/pki/tls/certs/chain.crt;

# 3. Firewall bloqueia requisições OCSP
# Corrigir: Permitir HTTPS saída

15.15 Melhores Práticas de Segurança

Lista de Verificação

✅ Usar apenas TLS 1.2+ (desabilitar 1.0/1.1)
✅ Cifras fortes com forward secrecy (ECDHE)
✅ Habilitar HSTS com max-age longo
✅ Habilitar OCSP Stapling
✅ Usar HTTP/2
✅ Permissões arquivo apropriadas (600 para chaves)
✅ Contextos SELinux corretos
✅ Validade certificado ≤ 90 dias com auto-renovação
✅ Incluir SANs abrangentes
✅ Headers segurança habilitados

15.16 Conclusões Chave

  1. NGINX disponível no AppStream (RHEL 8+) ou EPEL (RHEL 7)
  2. Crypto-policies simplificam config no RHEL 8/9/10
  3. certmonger integra bem com reload automático
  4. certbot requer EPEL em todas versões RHEL
  5. SNI habilita múltiplos certs no mesmo IP
  6. mTLS possível para autenticação cliente
  7. Testar completamente - sintaxe, conectividade, segurança

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA NGINX HTTPS                                │
├──────────────────────────────────────────────────────────────┤
│ Instalar:     dnf install nginx (RHEL 8/9/10)                │
│               yum install epel-release nginx (RHEL 7)        │
│                                                              │
│ Config:       /etc/nginx/nginx.conf                          │
│               /etc/nginx/conf.d/*.conf                       │
│                                                              │
│ SSL Básico:   listen 443 ssl http2;                          │
│               ssl_certificate /path/to/cert.crt;             │
│               ssl_certificate_key /path/to/key.key;          │
│                                                              │
│ Testar:       nginx -t                                       │
│ Recarregar:   systemctl reload nginx                         │
│ Logs:         /var/log/nginx/error.log                       │
│                                                              │
│ certbot:      certbot --nginx (requer EPEL!)                 │
│ certmonger:   ipa-getcert ... -C "systemctl reload nginx"    │
└──────────────────────────────────────────────────────────────┘

⚠️ certbot requer EPEL em todas versões RHEL
✅ Usar certmonger para ambientes empresariais

🧪 Laboratório Prático

Lab 07: Configuração HTTPS do NGINX

Configure NGINX com SSL/TLS e melhores práticas de segurança

  • 📁 Localização: labs/pt_BR/07-nginx-https/
  • ⏱️ Tempo: 30-35 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 16: TLS no Servidor de E-mail Postfix

Segurança de Email: Aprenda como configurar criptografia TLS para servidores de email Postfix no RHEL, protegendo comunicações de email com certificados.


16.1 Visão Geral Postfix no RHEL

Nome do Pacote: postfix Localização Config: /etc/postfix/main.cf Caminho Certificados: /etc/pki/tls/certs/ Caminho Chaves: /etc/pki/tls/private/ Portas: 25 (SMTP), 465 (SMTPS), 587 (Submission com STARTTLS)

Por Que TLS para Email?

  • Criptografar email em trânsito (prevenir escuta clandestina)
  • Autenticar servidores de email (prevenir personificação)
  • Cumprir requisitos de conformidade (HIPAA, PCI-DSS)
  • Prevenir spam/phishing (SPF, DKIM, DMARC funcionam melhor com TLS)

16.2 Instalação

Todas Versões RHEL

#============================================#
# INSTALAR POSTFIX
#============================================#

# Instalar Postfix
sudo dnf install postfix -y

# Parar e desabilitar Sendmail (se presente)
sudo systemctl stop sendmail 2>/dev/null
sudo systemctl disable sendmail 2>/dev/null

# Habilitar Postfix
sudo systemctl enable postfix
sudo systemctl start postfix

# Abrir firewall
sudo firewall-cmd --permanent --add-service=smtp
sudo firewall-cmd --permanent --add-service=smtps
sudo firewall-cmd --permanent --add-service=smtp-submission
sudo firewall-cmd --reload

# Verificar
systemctl status postfix
ss -tlnp | grep -E ':(25|465|587)'

16.3 Configuração TLS Lado Servidor

Receber Email com TLS (SMTPD)

#============================================#
# /etc/postfix/main.cf - TLS SERVIDOR (RECEBENDO)
#============================================#

# Arquivos de certificado
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.example.com.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.example.com.key
smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# Nível de segurança TLS
smtpd_tls_security_level = may  # ou 'encrypt' para requerer TLS

# Logging
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes

# Cache de sessão (desempenho)
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# Autenticação - apenas sobre TLS
smtpd_tls_auth_only = yes

# RHEL 7: Especificar protocolos manualmente
# smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
# smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# RHEL 8/9/10: Crypto-policies lidam com protocolos automaticamente
# (não precisa especificar smtpd_tls_protocols)

Níveis de Segurança Explicados:

NívelComportamentoCaso de Uso
noneTLS desabilitadoNão recomendado
mayTLS opcional (oportunista)Padrão (compatível)
encryptTLS requeridoAmbientes alta segurança
daneValidação baseada em DNSSECConfigurações avançadas

16.4 Configuração TLS Lado Cliente

Enviar Email com TLS (SMTP)

#============================================#
# /etc/postfix/main.cf - TLS CLIENTE (ENVIANDO)
#============================================#

# Arquivos certificado (opcional para cliente)
smtp_tls_cert_file = /etc/pki/tls/certs/mail.example.com.crt
smtp_tls_key_file = /etc/pki/tls/private/mail.example.com.key
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# Nível segurança TLS para saída
smtp_tls_security_level = may  # ou 'encrypt' para requerer

# Logging
smtp_tls_loglevel = 1

# Cache sessão
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# RHEL 7: Especificar protocolos
# smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
# smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# RHEL 8/9/10: Crypto-policies lidam com isso

16.5 Configuração Postfix TLS Completo

Exemplo Configuração Completa

#============================================#
# CONFIGURAÇÃO POSTFIX TLS COMPLETA
#============================================#

# 1. Gerar certificado e chave
sudo openssl genpkey -algorithm RSA \
  -out /etc/pki/tls/private/mail.example.com.key \
  -pkeyopt rsa_keygen_bits:2048

sudo chmod 600 /etc/pki/tls/private/mail.example.com.key

# 2. Gerar CSR
sudo openssl req -new \
  -key /etc/pki/tls/private/mail.example.com.key \
  -out /tmp/mail.example.com.csr \
  -subj "/CN=mail.example.com" \
  -addext "subjectAltName=DNS:mail.example.com,DNS:smtp.example.com"

# 3. Obter certificado da CA, instalá-lo
sudo cp mail.example.com.crt /etc/pki/tls/certs/
sudo chmod 644 /etc/pki/tls/certs/mail.example.com.crt

# 4. Editar /etc/postfix/main.cf
sudo vi /etc/postfix/main.cf

# Adicionar configuração TLS (ver seções 16.3 e 16.4)

# 5. Testar configuração
sudo postfix check

# 6. Recarregar Postfix
sudo systemctl reload postfix

# 7. Testar SMTP TLS
openssl s_client -starttls smtp -connect mail.example.com:25

16.6 Configuração SMTPS (Porta 465)

Habilitar Serviço SMTPS

#============================================#
# /etc/postfix/master.cf - HABILITAR SMTPS
#============================================#

# Descomentar ou adicionar serviço SMTPS (porta 465)
smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

# Recarregar
sudo systemctl reload postfix

# Verificar
ss -tlnp | grep :465

Testar SMTPS

# Conectar a SMTPS (TLS imediato, sem STARTTLS)
openssl s_client -connect mail.example.com:465

# Deveria mostrar handshake TLS imediatamente

16.7 Porta Submission (587) com STARTTLS

Habilitar Serviço Submission

#============================================#
# /etc/postfix/master.cf - HABILITAR SUBMISSION
#============================================#

# Descomentar ou adicionar serviço submission (porta 587)
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

# Recarregar
sudo systemctl reload postfix

# Verificar
ss -tlnp | grep :587

Testar Porta Submission

# Testar STARTTLS na porta 587
openssl s_client -starttls smtp -connect mail.example.com:587

# Deveria mostrar:
# STARTTLS
# 220 2.0.0 Ready to start TLS

16.8 Integração certmonger

Gerenciamento Automatizado Certificados para Postfix

#============================================#
# CERTMONGER + POSTFIX
#============================================#

# Instalar certmonger
sudo dnf install certmonger
sudo systemctl enable --now certmonger

# Solicitar certificado do FreeIPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/mail.example.com.crt \
  -k /etc/pki/tls/private/mail.example.com.key \
  -D mail.example.com \
  -K host/mail.example.com@REALM \
  -C "postfix reload"  # Auto-recarregar Postfix após renovação

# Verificar status
sudo getcert list

# Postfix automaticamente usa certificado renovado!

16.9 Autenticação Certificado Cliente

Requerer Certificados Cliente (mTLS para SMTP)

#============================================#
# /etc/postfix/main.cf - AUTH CERT CLIENTE
#============================================#

# Certificados servidor (como antes)
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.key

# Verificação certificado cliente
smtpd_tls_CAfile = /etc/pki/tls/certs/client-ca.crt
smtpd_tls_ask_ccert = yes
smtpd_tls_req_ccert = yes  # Requerer cert cliente

# Mapear certificado para usuário
smtpd_recipient_restrictions =
  permit_tls_clientcerts,
  reject

# Recarregar
sudo postfix reload

Testar com certificado cliente:

openssl s_client -starttls smtp \
  -connect mail.example.com:25 \
  -cert client.crt \
  -key client.key \
  -CAfile ca.crt

16.10 Solução de Problemas Postfix TLS

Comandos de Diagnóstico

#============================================#
# SOLUÇÃO DE PROBLEMAS TLS POSTFIX
#============================================#

# Verificar configuração Postfix
sudo postconf | grep -i tls

# Testar sintaxe configuração
sudo postfix check

# Ver configurações TLS específicas
sudo postconf smtpd_tls_cert_file smtpd_tls_key_file

# Verificar se arquivos certificado existem
ls -l /etc/pki/tls/certs/mail.crt
ls -l /etc/pki/tls/private/mail.key

# Verificar coincidência par cert/chave
CERT_MOD=$(openssl x509 -noout -modulus -in /etc/pki/tls/certs/mail.crt | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in /etc/pki/tls/private/mail.key | openssl md5)
[ "$CERT_MOD" = "$KEY_MOD" ] && echo "✅ Coincide" || echo "❌ Desajuste!"

# Testar SMTP STARTTLS
openssl s_client -starttls smtp -connect mail.example.com:25

# Testar SMTPS (porta 465)
openssl s_client -connect mail.example.com:465

# Verificar logs
sudo tail -f /var/log/maillog | grep -i tls

# Verificar fila Postfix
mailq

# Logging verbose (para solução de problemas)
sudo postconf smtpd_tls_loglevel=2
sudo postfix reload
# Verificar /var/log/maillog para info TLS detalhada

Problemas TLS Comuns do Postfix

ErroCausaSolução
“SSL_accept error”Problema certificado/chaveVerificar coincidência par cert/chave
“No shared cipher”Incompatibilidade cipherVerificar crypto-policy ou cliente
“certificate verify failed”Cadeia confiança quebradaInstalar certs intermediários
“Permission denied” na chavePermissões erradaschmod 600 no arquivo chave
“TLS is required but not available”TLS não habilitadoDefinir smtpd_tls_security_level = may
“STARTTLS failed”Problema TLS clienteVerificar suporte TLS cliente

16.11 Considerações Específicas por Versão

RHEL 7

#============================================#
# POSTFIX TLS - ESPECÍFICO RHEL 7
#============================================#

# /etc/postfix/main.cf

# DEVE especificar manualmente protocolos TLS
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# DEVE especificar manualmente cifras
smtpd_tls_mandatory_ciphers = high
smtpd_tls_ciphers = high

smtp_tls_mandatory_ciphers = high
smtp_tls_ciphers = high

# Excluir cifras fracas
smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, KRB5-DES, CBC3-SHA

RHEL 8/9/10

#============================================#
# POSTFIX TLS - RHEL 8/9/10 COM CRYPTO-POLICIES
#============================================#

# /etc/postfix/main.cf

# Arquivos certificado
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.key
smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# Configurações TLS (crypto-policies lidam com protocolos/cifras!)
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 1

# TLS Cliente
smtp_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtp_tls_key_file = /etc/pki/tls/private/mail.key
smtp_tls_security_level = may
smtp_tls_loglevel = 1

# Isso é tudo! Muito mais simples que RHEL 7
# crypto-policies configuram automaticamente versões TLS e cifras

Diferença Chave: RHEL 8+ confia em crypto-policies, tornando configuração muito mais simples!


16.12 Testando Postfix TLS

Suite de Teste Abrangente

#============================================#
# TESTE POSTFIX TLS
#============================================#

# Teste 1: STARTTLS na porta 25
openssl s_client -starttls smtp -connect mail.example.com:25

# Procurar por:
# - "250-STARTTLS" nas capacidades servidor
# - Handshake TLS bem-sucedido
# - Detalhes certificado

# Teste 2: SMTPS na porta 465 (TLS direto)
openssl s_client -connect mail.example.com:465

# Teste 3: Porta submission 587 com STARTTLS
openssl s_client -starttls smtp -connect mail.example.com:587

# Teste 4: Verificar certificado do servidor
echo "QUIT" | openssl s_client -starttls smtp -connect mail.example.com:25 2>&1 | \
  openssl x509 -noout -subject -dates

# Teste 5: Enviar email teste
echo "Test email" | mail -s "TLS Test" test@example.com

# Teste 6: Verificar TLS em logs
sudo tail -f /var/log/maillog | grep TLS

# Teste 7: Verificar se TLS está sendo usado
sudo postconf | grep -i tls | grep -i level

16.13 Melhores Práticas de Segurança

Configuração Postfix TLS Fortalecida

#============================================#
# CONFIG POSTFIX TLS FORTALECIDA
#============================================#

# /etc/postfix/main.cf

# TLS Servidor (receber email)
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.key
smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# REQUERER TLS para autenticação
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes

# TLS Cliente (enviar email)
smtp_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtp_tls_key_file = /etc/pki/tls/private/mail.key
smtp_tls_security_level = may

# RHEL 7: Desabilitar manualmente protocolos fracos
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# Obrigatório para conexões autenticadas
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# Configurações cifra (RHEL 7)
smtpd_tls_mandatory_ciphers = high
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, KRB5-DES, CBC3-SHA

# Caching sessão
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# Logging aprimorado (temporário para solução de problemas)
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1

# Desempenho
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

16.14 Dovecot IMAP/POP3 com TLS

Configuração Dovecot

Enquanto este capítulo foca em Postfix (SMTP), Dovecot frequentemente roda junto para IMAP/POP3:

#============================================#
# DOVECOT TLS (/etc/dovecot/conf.d/10-ssl.conf)
#============================================#

# Habilitar SSL
ssl = required

# Arquivos certificado
ssl_cert = </etc/pki/tls/certs/mail.example.com.crt
ssl_key = </etc/pki/tls/private/mail.example.com.key

# CA para verificação cert cliente (opcional)
#ssl_ca = </etc/pki/tls/certs/ca-bundle.crt

# RHEL 8/9/10: crypto-policies lidam com isso

# Protocolos TLS (RHEL 7)
#ssl_min_protocol = TLSv1.2

# Preferências suite cifra
#ssl_cipher_list = HIGH:!aNULL:!MD5

# Recarregar
sudo systemctl reload dovecot

Testar IMAPS:

openssl s_client -connect mail.example.com:993

# Testar POP3S
openssl s_client -connect mail.example.com:995

16.15 Cenários Comuns

Cenário 1: TLS Oportunista (Padrão)

Objetivo: Aceitar conexões criptografadas e não-criptografadas

# /etc/postfix/main.cf
smtpd_tls_security_level = may  # TLS opcional
smtp_tls_security_level = may   # TLS opcional

# Por quê: Compatibilidade máxima
# Desvantagem: Algumas conexões podem não ser criptografadas

Cenário 2: TLS Obrigatório (Alta Segurança)

Objetivo: Rejeitar conexões não-criptografadas

# /etc/postfix/main.cf
smtpd_tls_security_level = encrypt  # REQUERER TLS
smtp_tls_security_level = encrypt   # REQUERER TLS

# Por quê: Segurança máxima
# Desvantagem: Sistemas antigos podem falhar ao conectar

Cenário 3: Certificado Cliente para Relay

Objetivo: Permitir relay apenas com certificado cliente válido

# /etc/postfix/main.cf
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.key
smtpd_tls_CAfile = /etc/pki/tls/certs/client-ca.crt

smtpd_tls_ask_ccert = yes
smtpd_tls_req_ccert = yes

smtpd_recipient_restrictions =
  permit_tls_clientcerts,
  reject_unauth_destination

# Apenas clientes com cert válido de client-ca.crt podem fazer relay

16.16 Monitorando Postfix TLS

O Que Monitorar

#============================================#
# MONITORAMENTO POSTFIX TLS
#============================================#

# Verificar uso TLS em logs
sudo grep "TLS connection established" /var/log/maillog | tail -20

# Contar conexões TLS vs não-TLS
sudo grep "connect from" /var/log/maillog | grep -c "TLS"

# Verificar por erros TLS
sudo grep "TLS" /var/log/maillog | grep -i error

# Monitorar expiração certificado
openssl x509 -in /etc/pki/tls/certs/mail.crt -noout -checkend $((86400*30))

# Status certmonger (se usado)
sudo getcert list -f /etc/pki/tls/certs/mail.crt

# Verificar fila por falhas TLS
mailq

Script de Monitoramento

#!/bin/bash
# monitor-postfix-tls.sh

echo "=== Monitoramento Postfix TLS ==="

# Expiração certificado
echo "1. Expiração Certificado:"
openssl x509 -in /etc/pki/tls/certs/mail.crt -noout -enddate

# Conexões TLS hoje
echo ""
echo "2. Conexões TLS Hoje:"
sudo grep "$(date '+%b %e')" /var/log/maillog | grep "TLS connection" | wc -l

# Erros TLS hoje
echo ""
echo "3. Erros TLS Hoje:"
sudo grep "$(date '+%b %e')" /var/log/maillog | grep -i "tls.*error" | tail -5

# Status serviço
echo ""
echo "4. Status Postfix:"
systemctl is-active postfix

# Portas escutando
echo ""
echo "5. Escutando em:"
ss -tlnp | grep master | grep -E ':(25|465|587)'

16.17 Problemas e Soluções Comuns

Problema 1: Certificado Não Confiável por Clientes

Sintoma: Clientes recebem avisos “untrusted certificate”

Diagnóstico:

# Testar cadeia certificado
openssl s_client -starttls smtp -connect mail.example.com:25 -showcerts

# Verificar se certificados intermediários incluídos
sudo postconf smtpd_tls_cert_file
# Deveria incluir cadeia completa ou usar smtpd_tls_chain_files

Solução:

# Opção 1: Incluir cadeia no arquivo certificado
cat server.crt intermediate.crt > /etc/pki/tls/certs/mail-chain.crt

# Atualizar config
sudo postconf -e 'smtpd_tls_cert_file = /etc/pki/tls/certs/mail-chain.crt'
sudo postfix reload

# Opção 2: Usar arquivo cadeia separado (Postfix 3.4+)
sudo postconf -e 'smtpd_tls_chain_files = /etc/pki/tls/certs/chain.crt'

Problema 2: “Permission denied” na Chave Privada

Sintoma: Postfix não inicia, logs mostram erro permissão

Corrigir:

# Definir permissões corretas
sudo chmod 600 /etc/pki/tls/private/mail.key
sudo chown root:postfix /etc/pki/tls/private/mail.key

# Corrigir contexto SELinux
sudo restorecon -v /etc/pki/tls/private/mail.key

# Reiniciar Postfix
sudo systemctl restart postfix

Problema 3: TLS Não Oferecido aos Clientes

Sintoma: STARTTLS não mostrado em resposta EHLO

Diagnóstico:

# Telnet para servidor
telnet mail.example.com 25
# Digitar: EHLO test
# Deveria mostrar: 250-STARTTLS

# Se não mostrado, verificar config
sudo postconf smtpd_tls_security_level
# Deveria ser 'may' ou 'encrypt', não 'none'

Solução:

sudo postconf -e 'smtpd_tls_security_level = may'
sudo postfix reload

16.18 Tabela Comparação Versões

RecursoRHEL 7RHEL 8RHEL 9RHEL 10
Versão Postfix2.10.x3.3.x+3.5.x+3.8.x+
OpenSSL1.0.2k1.1.1k3.5.53.5.5
Config TLSManualCrypto-policiesCrypto-policiesCrypto-policies
TLS PadrãoPode incluir 1.0/1.1TLS 1.2+TLS 1.2+TLS 1.3 preferido
certmongerBásicoAprimoradoSuporte ACMESuporte ACME

16.19 Script Configuração Rápido

#!/bin/bash
# setup-postfix-tls.sh - Setup Postfix TLS completo

DOMAIN="example.com"
HOSTNAME="mail.$DOMAIN"

echo "=== Setup Postfix TLS para $HOSTNAME ==="

# 1. Instalar Postfix
sudo dnf install -y postfix

# 2. Gerar certificado (ou usar certmonger)
sudo openssl genpkey -algorithm RSA \
  -out /etc/pki/tls/private/$HOSTNAME.key \
  -pkeyopt rsa_keygen_bits:2048

sudo chmod 600 /etc/pki/tls/private/$HOSTNAME.key

# 3. Gerar autoassinado para teste (substituir com cert apropriado!)
sudo openssl req -new -x509 -days 365 \
  -key /etc/pki/tls/private/$HOSTNAME.key \
  -out /etc/pki/tls/certs/$HOSTNAME.crt \
  -subj "/CN=$HOSTNAME" \
  -addext "subjectAltName=DNS:$HOSTNAME,DNS:smtp.$DOMAIN"

# 4. Configurar Postfix
sudo postconf -e "smtpd_tls_cert_file = /etc/pki/tls/certs/$HOSTNAME.crt"
sudo postconf -e "smtpd_tls_key_file = /etc/pki/tls/private/$HOSTNAME.key"
sudo postconf -e "smtpd_tls_security_level = may"
sudo postconf -e "smtpd_tls_auth_only = yes"
sudo postconf -e "smtpd_tls_loglevel = 1"

sudo postconf -e "smtp_tls_cert_file = /etc/pki/tls/certs/$HOSTNAME.crt"
sudo postconf -e "smtp_tls_key_file = /etc/pki/tls/private/$HOSTNAME.key"
sudo postconf -e "smtp_tls_security_level = may"

# 5. Abrir firewall
sudo firewall-cmd --permanent --add-service=smtp
sudo firewall-cmd --permanent --add-service=smtps
sudo firewall-cmd --permanent --add-service=smtp-submission
sudo firewall-cmd --reload

# 6. Iniciar Postfix
sudo systemctl enable postfix
sudo systemctl restart postfix

# 7. Testar
echo "Testando SMTP STARTTLS..."
echo "QUIT" | openssl s_client -starttls smtp -connect localhost:25 2>&1 | grep -E "(CONNECTED|subject=)"

echo "✅ Setup Postfix TLS completo!"
echo "⚠️ Substituir cert autoassinado com certificado apropriado da CA"

16.20 Conclusões Chave

  1. Postfix suporta TLS nas portas 25 (STARTTLS), 465 (SMTPS), 587 (Submission)
  2. RHEL 7 requer config TLS manual (protocolos, cifras)
  3. RHEL 8+ usa crypto-policies (muito mais simples!)
  4. Níveis de segurança: none, may, encrypt, dane
  5. certmonger funciona ótimo com Postfix
  6. Sempre testar com openssl s_client -starttls smtp
  7. Monitorar logs para erros TLS

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA POSTFIX TLS                                │
├──────────────────────────────────────────────────────────────┤
│ Config:       /etc/postfix/main.cf                           │
│ Certs:        smtpd_tls_cert_file = /path/to/cert.crt        │
│ Chaves:       smtpd_tls_key_file = /path/to/key.key          │
│ Segurança:    smtpd_tls_security_level = may|encrypt         │
│                                                              │
│ Testar:       openssl s_client -starttls smtp -connect :25   │
│ Recarregar:   postfix reload                                 │
│ Verificar:    postfix check                                  │
│ Logs:         tail -f /var/log/maillog | grep TLS            │
│                                                              │
│ Portas:       25 (SMTP+STARTTLS)                             │
│               465 (SMTPS - TLS direto)                       │
│               587 (Submission com STARTTLS)                  │
│                                                              │
│ certmonger:   ipa-getcert ... -C "postfix reload"            │
└──────────────────────────────────────────────────────────────┘

⚠️ RHEL 7: Config manual protocolo/cifra necessária
✅ RHEL 8/9/10: Crypto-policies lidam com ajustes TLS

🧪 Laboratório Prático

Lab 08: TLS do Postfix

Configure TLS para servidor de email Postfix

  • 📁 Localização: labs/pt_BR/08-postfix-tls/
  • ⏱️ Tempo: 30 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 17: OpenLDAP e Serviços de Diretório

Diretório Empresarial: Aprenda como proteger serviços de diretório OpenLDAP com TLS/SSL no RHEL, protegendo autenticação de usuário e consultas de diretório.


17.1 LDAP vs LDAPS vs STARTTLS

Três Formas de Proteger LDAP

MétodoPortaCriptografiaCaso de Uso
LDAP389❌ NenhumaLegado, não recomendado
LDAPS636✅ TLS desde inícioPreferido, criptografado
LDAP+STARTTLS389✅ Atualizar para TLSAlternativa ao LDAPS

Recomendação: Usar LDAPS (porta 636) para simplicidade e segurança.


17.2 Instalação OpenLDAP

Todas Versões RHEL

#============================================#
# INSTALAR SERVIDOR OPENLDAP
#============================================#

# Instalar servidor OpenLDAP
sudo dnf install openldap-servers openldap-clients -y

# Iniciar e habilitar
sudo systemctl enable slapd
sudo systemctl start slapd

# Abrir firewall
sudo firewall-cmd --permanent --add-service=ldap
sudo firewall-cmd --permanent --add-service=ldaps
sudo firewall-cmd --reload

# Verificar
systemctl status slapd
ss -tlnp | grep -E ':(389|636)'

17.3 Gerando Certificados para LDAP

Requisitos Certificado

Certificados LDAP devem incluir:

  • CN coincidindo com hostname servidor LDAP
  • SANs com FQDN servidor LDAP
  • Server Authentication key usage
  • Cadeia confiança válida
#============================================#
# GERAR CERTIFICADO SERVIDOR LDAP
#============================================#

# Passo 1: Gerar chave privada
sudo openssl genpkey -algorithm RSA \
  -out /etc/openldap/certs/ldap.key \
  -pkeyopt rsa_keygen_bits:2048

# Passo 2: Definir permissões (importante!)
sudo chmod 600 /etc/openldap/certs/ldap.key
sudo chown ldap:ldap /etc/openldap/certs/ldap.key

# Passo 3: Gerar CSR
sudo openssl req -new \
  -key /etc/openldap/certs/ldap.key \
  -out /tmp/ldap.csr \
  -subj "/CN=ldap.example.com" \
  -addext "subjectAltName=DNS:ldap.example.com,DNS:dir.example.com"

# Passo 4: Obter certificado da CA

# Passo 5: Instalar certificado
sudo cp ldap.crt /etc/openldap/certs/
sudo chmod 644 /etc/openldap/certs/ldap.crt
sudo chown ldap:ldap /etc/openldap/certs/ldap.crt

# Passo 6: Instalar certificado CA
sudo cp ca.crt /etc/openldap/certs/
sudo chmod 644 /etc/openldap/certs/ca.crt

17.4 Configuração TLS OpenLDAP

Método 1: cn=config (Configuração Dinâmica)

#============================================#
# CONFIGURAR TLS COM cn=config (PREFERIDO)
#============================================#

# Criar arquivo LDIF
cat > /tmp/tls-config.ldif << EOF
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldap.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.key
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ca.crt
-
replace: olcTLSProtocolMin
olcTLSProtocolMin: 3.2
EOF

# Aplicar configuração
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/tls-config.ldif

# Reiniciar slapd
sudo systemctl restart slapd

# Verificar
sudo slapcat -b "cn=config" | grep -i tls

Método 2: slapd.conf (Legado)

#============================================#
# CONFIGURAR TLS COM slapd.conf (LEGADO)
#============================================#

# Editar /etc/openldap/slapd.conf

TLSCertificateFile      /etc/openldap/certs/ldap.crt
TLSCertificateKeyFile   /etc/openldap/certs/ldap.key
TLSCACertificateFile    /etc/openldap/certs/ca.crt

# RHEL 7: Especificar manualmente versão TLS
TLSProtocolMin          1.2

# Reiniciar
sudo systemctl restart slapd

17.5 Configuração Cliente

Configurar Cliente LDAP para TLS

#============================================#
# /etc/openldap/ldap.conf - CONFIG CLIENTE
#============================================#

# URI servidor (usar ldaps:// para porta 636)
URI ldaps://ldap.example.com

# Certificado CA para validação
TLS_CACERT /etc/pki/tls/certs/ca-bundle.crt

# Verificação certificado
TLS_REQCERT demand  # requerer certificado válido

# RHEL 7: Especificar versão TLS mínima
# TLS_PROTOCOL_MIN 1.2

Testar Conexão Cliente LDAP

#============================================#
# TESTAR CONEXÃO CLIENTE LDAPS
#============================================#

# Testar LDAPS (porta 636)
ldapsearch -H ldaps://ldap.example.com:636 \
  -D "cn=admin,dc=example,dc=com" \
  -W \
  -b "dc=example,dc=com" \
  "(objectClass=*)"

# Testar LDAP com STARTTLS (porta 389)
ldapsearch -H ldap://ldap.example.com:389 -ZZ \
  -D "cn=admin,dc=example,dc=com" \
  -W \
  -b "dc=example,dc=com"

# -ZZ força STARTTLS (falha se indisponível)
# -Z tenta STARTTLS (continua sem se indisponível)

17.6 Integração FreeIPA

Nota: FreeIPA é coberto em detalhes no Capítulo 19. Esta é uma visão geral rápida.

FreeIPA Lida Automaticamente com LDAPS

#============================================#
# LDAPS FREEIPA (AUTOMÁTICO!)
#============================================#

# FreeIPA configura automaticamente LDAPS
# Sem config certificado manual necessária!

# Testar LDAPS FreeIPA
ldapsearch -H ldaps://ipa.example.com:636 \
  -D "uid=admin,cn=users,cn=accounts,dc=example,dc=com" \
  -W \
  -b "dc=example,dc=com"

# Certificados FreeIPA gerenciados por certmonger automaticamente
sudo getcert list | grep -A10 "Directory Server"

17.7 Testando OpenLDAP TLS

Teste Abrangente

#============================================#
# TESTE OPENLDAP TLS
#============================================#

# Teste 1: Verificar se slapd está escutando
ss -tlnp | grep slapd
# Deveria mostrar portas 389 e/ou 636

# Teste 2: Testar conexão LDAPS com OpenSSL
openssl s_client -connect ldap.example.com:636

# Procurar por:
# - Handshake TLS bem-sucedido
# - Detalhes certificado
# - Verify return code: 0 (ok)

# Teste 3: Testar com ldapsearch (anônimo)
ldapsearch -H ldaps://ldap.example.com:636 \
  -x -b "" -s base "(objectClass=*)" namingContexts

# Teste 4: Testar consulta autenticada
ldapsearch -H ldaps://ldap.example.com:636 \
  -D "cn=admin,dc=example,dc=com" \
  -W \
  -b "dc=example,dc=com" \
  "(uid=*)"

# Teste 5: Testar STARTTLS
ldapsearch -H ldap://ldap.example.com:389 -ZZ \
  -x -b "" -s base

# Teste 6: Verificar certificado do servidor
echo | openssl s_client -connect ldap.example.com:636 2>&1 | \
  openssl x509 -noout -subject -issuer -dates

17.8 Solução de Problemas OpenLDAP TLS

Comandos de Diagnóstico

#============================================#
# DIAGNÓSTICO OPENLDAP TLS
#============================================#

# Verificar configuração slapd
sudo slapcat -b "cn=config" | grep -i tls

# Verificar arquivos certificado
sudo ls -lZ /etc/openldap/certs/

# Verificar permissões
# Chave deve ser legível pelo usuário 'ldap'
sudo -u ldap cat /etc/openldap/certs/ldap.key >/dev/null && \
  echo "✅ Chave legível" || echo "❌ Permissão negada"

# Verificar contexto SELinux
ls -Z /etc/openldap/certs/*.{crt,key}

# Verificar logs slapd
sudo journalctl -u slapd -f

# Testar com OpenSSL verbose
openssl s_client -connect ldap.example.com:636 -showcerts -debug

# Testar STARTTLS
ldapsearch -H ldap://ldap.example.com:389 -ZZ -d 1

Problemas TLS Comuns do OpenLDAP

ErroCausaSolução
“TLS: can’t connect”Certificado/chave não legívelVerificar propriedade: chown ldap:ldap
“TLS: hostname does not match”Desajuste CN/SANRegenerar cert com hostname correto
“Certificate verification failed”CA não confiávelAdicionar CA ao repositório de confiança cliente
“Permission denied” na chavePropriedade/permissões erradaschmod 600, chown ldap:ldap
“TLS engine not initialized”TLS não configuradoAdicionar diretivas TLS à config
“error:14094410:SSL routines”Desajuste protocolo/cifraVerificar crypto-policy (RHEL 8+)

17.9 Autenticação Certificado Cliente

Requerer Certificados Cliente

#============================================#
# OPENLDAP COM AUTH CERT CLIENTE
#============================================#

# Configuração servidor (cn=config)
cat > /tmp/client-cert.ldif << EOF
dn: cn=config
changetype: modify
add: olcTLSVerifyClient
olcTLSVerifyClient: demand
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/client-ca.crt
EOF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/client-cert.ldif

# Reiniciar
sudo systemctl restart slapd

Conexão cliente com certificado:

# Cliente deve fornecer certificado
ldapsearch -H ldaps://ldap.example.com:636 \
  -x -b "dc=example,dc=com" \
  -ZZ

# Configurar cert cliente em /etc/openldap/ldap.conf:
TLS_CERT /etc/openldap/certs/client.crt
TLS_KEY /etc/openldap/certs/client.key

17.10 Considerações Específicas por Versão

RHEL 7

#============================================#
# OPENLDAP TLS - RHEL 7
#============================================#

# Especificação protocolo TLS manual
# Em slapd.conf ou cn=config:
TLSProtocolMin 1.2

# Ou com cn=config:
olcTLSProtocolMin: 3.2  # 3.1=TLS1.0, 3.2=TLS1.1, 3.3=TLS1.2

# Configuração cipher manual
TLSCipherSuite HIGH:!aNULL:!MD5:!3DES

# Testar
openssl s_client -connect ldap.example.com:636 -tls1_2

RHEL 8/9/10

#============================================#
# OPENLDAP TLS - RHEL 8/9/10
#============================================#

# Crypto-policies configuram automaticamente TLS
# Sem necessidade especificar TLSProtocolMin ou cifras!

# Apenas configurar certificados:
olcTLSCertificateFile: /etc/openldap/certs/ldap.crt
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.key
olcTLSCACertificateFile: /etc/openldap/certs/ca.crt

# Crypto-policy lida com resto
update-crypto-policies --show

17.11 certmonger com OpenLDAP

Gerenciamento Certificado Automatizado

#============================================#
# CERTMONGER + OPENLDAP
#============================================#

# Instalar certmonger
sudo dnf install certmonger
sudo systemctl enable --now certmonger

# Solicitar certificado do FreeIPA
sudo ipa-getcert request \
  -f /etc/openldap/certs/ldap.crt \
  -k /etc/openldap/certs/ldap.key \
  -D ldap.example.com \
  -K ldap/ldap.example.com@REALM \
  -C "systemctl restart slapd"  # Reiniciar slapd após renovação

# Definir propriedade apropriada
sudo chown ldap:ldap /etc/openldap/certs/ldap.{crt,key}
sudo chmod 600 /etc/openldap/certs/ldap.key

# Monitorar
sudo getcert list

17.12 Solução de Problemas LDAPS

Passos de Diagnóstico

#============================================#
# SOLUÇÃO DE PROBLEMAS LDAPS
#============================================#

# Passo 1: Verificar se slapd está escutando na 636
ss -tlnp | grep 636

# Passo 2: Verificar configuração certificado
sudo slapcat -b "cn=config" | grep olcTLS

# Passo 3: Testar arquivo certificado
sudo openssl x509 -in /etc/openldap/certs/ldap.crt -noout -text

# Passo 4: Testar arquivo chave
sudo openssl rsa -in /etc/openldap/certs/ldap.key -check

# Passo 5: Verificar coincidência cert/chave
CERT_MOD=$(openssl x509 -noout -modulus -in /etc/openldap/certs/ldap.crt | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in /etc/openldap/certs/ldap.key | openssl md5)
[ "$CERT_MOD" = "$KEY_MOD" ] && echo "✅ Coincide" || echo "❌ Desajuste!"

# Passo 6: Verificar permissões
ls -l /etc/openldap/certs/
# Chave deve ser de propriedade ldap:ldap com modo 600

# Passo 7: Testar conexão
openssl s_client -connect ldap.example.com:636

# Passo 8: Verificar logs
sudo journalctl -u slapd | grep -i tls

# Passo 9: Testar do cliente
ldapsearch -H ldaps://ldap.example.com:636 -x -b "" -s base

# Passo 10: Verificar SELinux
sudo ausearch -m avc -ts recent | grep ldap

17.13 Problemas e Soluções Comuns

Problema 1: Erro “TLS: can’t accept”

Sintoma: Conexão LDAPS recusada

Diagnóstico:

sudo journalctl -u slapd | grep "TLS: can't accept"

Causas e Soluções:

# Causa 1: Chave não legível pelo usuário ldap
sudo chown ldap:ldap /etc/openldap/certs/ldap.key
sudo chmod 600 /etc/openldap/certs/ldap.key

# Causa 2: SELinux bloqueando
sudo restorecon -Rv /etc/openldap/certs/
# Ou verificar negações:
sudo ausearch -m avc -ts recent | grep ldap

# Causa 3: Desajuste certificado/chave
# Regenerar CSR com chave correta

Problema 2: “TLS: hostname does not match”

Sintoma: Cliente recebe erro hostname mismatch

Diagnóstico:

# Verificar CN e SANs certificado
openssl x509 -in /etc/openldap/certs/ldap.crt -noout -subject -ext subjectAltName

Solução:

# Reemitir certificado com hostname correto nos SANs
openssl req -new -key /etc/openldap/certs/ldap.key -out /tmp/ldap.csr \
  -subj "/CN=ldap.example.com" \
  -addext "subjectAltName=DNS:ldap.example.com,DNS:ldap,IP:10.0.0.10"

# Ou no lado cliente: permitir verificação mais frouxa (NÃO recomendado para produção)
# Em /etc/openldap/ldap.conf:
TLS_REQCERT allow  # em vez de 'demand'

Problema 3: Certificado Não Confiável

Sintoma: “Certificate verification failed”

Solução:

# Adicionar CA ao repositório de confiança sistema
sudo cp ldap-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# Ou especificar CA na config cliente
# /etc/openldap/ldap.conf:
TLS_CACERT /etc/openldap/certs/ca.crt

17.14 Melhores Práticas de Segurança

Configuração TLS OpenLDAP Fortalecida

#============================================#
# CONFIG TLS LDAP FORTALECIDA (cn=config)
#============================================#

dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldap.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.key
-
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ca.crt
-
replace: olcTLSProtocolMin
olcTLSProtocolMin: 3.3
-
replace: olcTLSCipherSuite
olcTLSCipherSuite: HIGH:!aNULL:!MD5:!RC4
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never

Aplicar:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f hardened-tls.ldif
sudo systemctl restart slapd

17.15 Integração com Serviços Sistema

SSSD com LDAPS (Autenticação Sistema)

#============================================#
# CONFIGURAR SSSD PARA USAR LDAPS
#============================================#

# /etc/sssd/sssd.conf

[domain/example.com]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://ldap.example.com:636
ldap_search_base = dc=example,dc=com
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_tls_reqcert = demand

# Reiniciar SSSD
sudo systemctl restart sssd

# Testar
id ldapuser@example.com

17.16 Monitorando LDAP TLS

Comandos de Monitoramento

#============================================#
# MONITORAR LDAP TLS
#============================================#

# Verificar expiração certificado
openssl s_client -connect ldap.example.com:636 2>/dev/null | \
  openssl x509 -noout -dates

# Verificar conexões TLS
sudo journalctl -u slapd | grep "TLS established"

# Contar conexões LDAPS vs LDAP
sudo journalctl -u slapd --since today | grep -c "conn=.*LDAPS"
sudo journalctl -u slapd --since today | grep -c "conn=.*LDAP"

# Verificar por erros TLS
sudo journalctl -u slapd | grep -i "tls.*error"

# Status certmonger (se usado)
sudo getcert list -d /etc/openldap/certs

17.17 Conclusões Chave

  1. LDAPS (porta 636) é mais simples que STARTTLS
  2. Propriedade certificado crítica - Deve ser legível pelo usuário ldap
  3. cn=config preferido sobre slapd.conf (RHEL moderno)
  4. FreeIPA lida com LDAPS automaticamente - Muito mais fácil!
  5. Configuração cliente importa - Definir TLS_CACERT corretamente
  6. Testar completamente - Usar openssl s_client e ldapsearch -ZZ
  7. certmonger automatiza renovação certificado

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA OPENLDAP TLS                               │
├──────────────────────────────────────────────────────────────┤
│ Config:        cn=config (dinâmica) ou slapd.conf (legado)   │
│ Certs:         /etc/openldap/certs/                          │
│ Propriedade:   chown ldap:ldap *.{crt,key}                   │
│ Permissões:    chmod 600 ldap.key                            │
│                                                              │
│ LDAPS:         Porta 636 (TLS desde início)                  │
│ STARTTLS:      Porta 389 (atualizar para TLS)                │
│                                                              │
│ Testar LDAPS:  openssl s_client -connect host:636            │
│ Testar STLS:   ldapsearch -H ldap://host:389 -ZZ             │
│                                                              │
│ Cliente:       /etc/openldap/ldap.conf                       │
│                TLS_CACERT /path/to/ca.crt                    │
│                TLS_REQCERT demand                            │
│                                                              │
│ Logs:          journalctl -u slapd | grep TLS                │
└──────────────────────────────────────────────────────────────┘

⚠️ Chave deve ser de propriedade do usuário 'ldap'!
✅ Usar FreeIPA para gerenciamento LDAP+TLS mais fácil

🧪 Laboratório Prático

Lab 09: LDAPS do OpenLDAP

Configure LDAPS para serviços de diretório seguros

  • 📁 Localização: labs/pt_BR/09-openldap-ldaps/
  • ⏱️ Tempo: 35-40 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 18: TLS em Bancos de Dados (PostgreSQL, MySQL)

Dados em Trânsito: Proteja conexões banco dados com criptografia TLS. Aprenda como configurar PostgreSQL e MySQL/MariaDB com certificados no RHEL.


18.1 Por Que TLS de Banco de Dados?

Proteger Dados Sensíveis:

  • ✅ Criptografar consultas e resultados banco dados
  • ✅ Prevenir escuta clandestina em credenciais
  • ✅ Autenticar servidores banco dados
  • ✅ Habilitar autenticação certificado cliente
  • ✅ Cumprir requisitos conformidade (PCI-DSS, HIPAA)

Modelo Ameaça:

  • Sem TLS: Senhas e dados viajam em cleartext
  • Com TLS: Toda comunicação criptografada

18.2 PostgreSQL com SSL/TLS

Instalação

#============================================#
# INSTALAR POSTGRESQL
#============================================#

# RHEL 7/8/9/10
sudo dnf install postgresql-server -y

# Inicializar banco dados
sudo postgresql-setup --initdb

# Habilitar e iniciar
sudo systemctl enable postgresql
sudo systemctl start postgresql

# Verificar
systemctl status postgresql
ss -tlnp | grep 5432

Gerar Certificados PostgreSQL

#============================================#
# GERAR CERTIFICADOS POSTGRESQL
#============================================#

# Passo 1: Gerar chave servidor
sudo -u postgres openssl genpkey -algorithm RSA \
  -out /var/lib/pgsql/data/server.key \
  -pkeyopt rsa_keygen_bits:2048

# Passo 2: Definir permissões (crítico!)
sudo chmod 600 /var/lib/pgsql/data/server.key
sudo chown postgres:postgres /var/lib/pgsql/data/server.key

# Passo 3: Gerar CSR
sudo -u postgres openssl req -new \
  -key /var/lib/pgsql/data/server.key \
  -out /tmp/postgres.csr \
  -subj "/CN=db.example.com" \
  -addext "subjectAltName=DNS:db.example.com,DNS:postgres.example.com"

# Passo 4: Obter certificado da CA

# Passo 5: Instalar certificado
sudo cp postgres.crt /var/lib/pgsql/data/server.crt
sudo chmod 600 /var/lib/pgsql/data/server.crt
sudo chown postgres:postgres /var/lib/pgsql/data/server.crt

# Passo 6: Instalar certificado CA
sudo cp ca.crt /var/lib/pgsql/data/root.crt
sudo chmod 644 /var/lib/pgsql/data/root.crt

Configurar PostgreSQL para SSL

#============================================#
# CONFIGURAR POSTGRESQL SSL
#============================================#

# Editar /var/lib/pgsql/data/postgresql.conf
sudo -u postgres vi /var/lib/pgsql/data/postgresql.conf

# Habilitar SSL
ssl = on

# Arquivos certificado (relativos ao diretório data)
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'

# RHEL 7: Especificar versão TLS mínima
# ssl_min_protocol_version = 'TLSv1.2'

# RHEL 8/9/10: Usa crypto-policy sistema
# (sem necessidade especificar ssl_min_protocol_version)

# Opcional: Preferir cifras servidor
ssl_prefer_server_ciphers = on

# Reiniciar PostgreSQL
sudo systemctl restart postgresql

Configurar Autenticação Cliente

#============================================#
# /var/lib/pgsql/data/pg_hba.conf
#============================================#

# Requerer SSL para todas conexões
hostssl all all 0.0.0.0/0 md5

# Requerer certificado cliente
hostssl all alice 0.0.0.0/0 cert clientcert=verify-full

# Recarregar configuração
sudo systemctl reload postgresql

Tipos HBA:

  • host: Permitir não-SSL
  • hostssl: Requerer SSL
  • hostnossl: Explicitamente proibir SSL

Opções Cert Cliente:

  • md5: SSL requerido, auth senha
  • cert: SSL + certificado cliente requerido
  • clientcert=verify-full: Verificar cert cliente contra CA

Testar PostgreSQL SSL

#============================================#
# TESTAR POSTGRESQL SSL
#============================================#

# Teste 1: Conectar com SSL requerido
psql "host=db.example.com port=5432 user=testuser dbname=testdb sslmode=require"

# Teste 2: Conectar com verificação completa
psql "host=db.example.com port=5432 user=testuser dbname=testdb sslmode=verify-full sslrootcert=/etc/pki/tls/certs/ca-bundle.crt"

# Teste 3: Com certificado cliente
psql "host=db.example.com port=5432 user=alice dbname=mydb sslmode=verify-full sslcert=/home/alice/.postgresql/client.crt sslkey=/home/alice/.postgresql/client.key sslrootcert=/etc/pki/tls/certs/ca-bundle.crt"

# Teste 4: Verificar SSL de dentro PostgreSQL
psql -h db.example.com -U testuser -d testdb -c "SELECT ssl, version FROM pg_stat_ssl WHERE pid = pg_backend_pid();"

# Teste 5: Teste OpenSSL
openssl s_client -connect db.example.com:5432 -starttls postgres

Modos SSL:

  • disable: Sem SSL
  • allow: Tentar SSL, fallback para não-SSL
  • prefer: Preferir SSL, fallback permitido
  • require: Requerer SSL (não verificar cert)
  • verify-ca: Requerer SSL, verificar CA
  • verify-full: Requerer SSL, verificar hostname + CA

18.3 MySQL/MariaDB com SSL/TLS

Instalação

#============================================#
# INSTALAR MARIADB (SUBSTITUIÇÃO MYSQL NO RHEL 8+)
#============================================#

# RHEL 8/9/10
sudo dnf install mariadb-server -y

# Iniciar e habilitar
sudo systemctl enable mariadb
sudo systemctl start mariadb

# Instalação segura
sudo mysql_secure_installation

# Verificar
systemctl status mariadb
ss -tlnp | grep 3306

Gerar Certificados MySQL/MariaDB

#============================================#
# GERAR CERTIFICADOS MYSQL/MARIADB
#============================================#

# Criar diretório certificado
sudo mkdir -p /etc/mysql/certs
sudo chmod 755 /etc/mysql/certs

# Passo 1: Gerar chave servidor
sudo openssl genpkey -algorithm RSA \
  -out /etc/mysql/certs/server.key \
  -pkeyopt rsa_keygen_bits:2048

sudo chmod 600 /etc/mysql/certs/server.key
sudo chown mysql:mysql /etc/mysql/certs/server.key

# Passo 2: Gerar CSR
sudo openssl req -new \
  -key /etc/mysql/certs/server.key \
  -out /tmp/mysql.csr \
  -subj "/CN=db.example.com" \
  -addext "subjectAltName=DNS:db.example.com,DNS:mysql.example.com"

# Passo 3: Obter certificado da CA

# Passo 4: Instalar certificado e CA
sudo cp mysql.crt /etc/mysql/certs/server.crt
sudo cp ca.crt /etc/mysql/certs/ca.crt
sudo chmod 644 /etc/mysql/certs/{server.crt,ca.crt}
sudo chown mysql:mysql /etc/mysql/certs/{server.crt,ca.crt}

Configurar MySQL/MariaDB para SSL

#============================================#
# CONFIGURAR MYSQL/MARIADB SSL
#============================================#

# Editar /etc/my.cnf.d/server.cnf (ou /etc/my.cnf)
sudo vi /etc/my.cnf.d/server.cnf

[mysqld]
# Configuração SSL/TLS
ssl-ca=/etc/mysql/certs/ca.crt
ssl-cert=/etc/mysql/certs/server.crt
ssl-key=/etc/mysql/certs/server.key

# Requerer transporte seguro (opcional, força TLS para todos)
require_secure_transport=ON

# RHEL 7: Especificar versão TLS
# tls_version=TLSv1.2,TLSv1.3

# Reiniciar MySQL/MariaDB
sudo systemctl restart mariadb

Verificar SSL Está Habilitado

#============================================#
# VERIFICAR MYSQL SSL
#============================================#

# Conectar e verificar status SSL
mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"

# Deveria mostrar:
# have_ssl           | YES
# ssl_ca             | /etc/mysql/certs/ca.crt
# ssl_cert           | /etc/mysql/certs/server.crt
# ssl_key            | /etc/mysql/certs/server.key

# Verificar conexões ativas
mysql -u root -p -e "SHOW STATUS LIKE 'Ssl_cipher';"

Testar Conexão MySQL SSL

#============================================#
# TESTAR CONEXÃO MYSQL SSL
#============================================#

# Conectar com SSL
mysql --ssl-ca=/etc/mysql/certs/ca.crt \
  --ssl-mode=REQUIRED \
  -h db.example.com \
  -u testuser \
  -p

# Verificar SSL em uso
mysql> \s
# Procurar por: "SSL: Cipher in use is ..."

# Ou verificar de linha comando
mysql -h db.example.com -u testuser -p -e "STATUS" | grep SSL

18.4 Autenticação Certificado Cliente

PostgreSQL com Certificados Cliente

#============================================#
# AUTH CERT CLIENTE POSTGRESQL
#============================================#

# Lado servidor: pg_hba.conf
hostssl all alice 0.0.0.0/0 cert clientcert=verify-full

# Gerar certificado cliente
openssl genpkey -algorithm RSA -out alice.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key alice.key -out alice.csr -subj "/CN=alice"
# Obter assinado por CA

# Conexão cliente
psql "host=db.example.com user=alice dbname=mydb sslmode=verify-full sslcert=alice.crt sslkey=alice.key sslrootcert=ca.crt"

MySQL/MariaDB com Certificados Cliente

#============================================#
# AUTH CERT CLIENTE MYSQL/MARIADB
#============================================#

# Criar usuário requerendo X.509
mysql -u root -p << EOF
CREATE USER 'alice'@'%' REQUIRE X509;
GRANT ALL ON mydb.* TO 'alice'@'%';
FLUSH PRIVILEGES;
EOF

# Conexão cliente
mysql --ssl-ca=ca.crt \
  --ssl-cert=alice.crt \
  --ssl-key=alice.key \
  -h db.example.com \
  -u alice \
  -p mydb

18.5 Solução de Problemas TLS Banco Dados

Solução de Problemas PostgreSQL

#============================================#
# SOLUÇÃO DE PROBLEMAS SSL POSTGRESQL
#============================================#

# Verificar SSL está habilitado
sudo -u postgres psql -c "SHOW ssl;"
# Deveria mostrar: on

# Ver configurações SSL
sudo -u postgres psql -c "SHOW ssl_cert_file; SHOW ssl_key_file; SHOW ssl_ca_file;"

# Verificar arquivos certificado
ls -l /var/lib/pgsql/data/server.{crt,key}

# Verificar propriedade
# Deveria ser: postgres:postgres

# Verificar permissões
# server.key deveria ser 600

# Testar conexão com debugging SSL
psql "host=db.example.com sslmode=require" -d postgres -U testuser --set=sslcompression=on

# Verificar logs PostgreSQL
sudo tail -f /var/lib/pgsql/data/log/postgresql-*.log | grep -i ssl

Solução de Problemas MySQL/MariaDB

#============================================#
# SOLUÇÃO DE PROBLEMAS SSL MYSQL/MARIADB
#============================================#

# Verificar variáveis SSL
mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"

# Se have_ssl = NO, verificar:
# 1. Arquivos certificado existem
ls -l /etc/mysql/certs/

# 2. Permissões
# Deveriam ser legíveis por usuário mysql

# 3. Reiniciar banco dados
sudo systemctl restart mariadb

# Verificar log erro
sudo tail -f /var/log/mariadb/mariadb.log | grep -i ssl

# Testar conexão
mysql --ssl-ca=/etc/mysql/certs/ca.crt \
  --ssl-mode=REQUIRED \
  -h localhost \
  -u root \
  -p \
  -e "STATUS" | grep SSL

18.6 Problemas e Soluções Comuns

Problema 1: PostgreSQL “Permission denied” em server.key

Sintoma: PostgreSQL não inicia, logs mostram erro permissão

Correção:

# Definir permissões corretas
sudo chmod 600 /var/lib/pgsql/data/server.key
sudo chown postgres:postgres /var/lib/pgsql/data/server.key

# Corrigir contexto SELinux
sudo restorecon -Rv /var/lib/pgsql/data/

# Reiniciar
sudo systemctl restart postgresql

Problema 2: MySQL “SSL connection error”

Diagnóstico:

# Verificar se SSL está disponível
mysql -u root -p -e "SHOW VARIABLES LIKE 'have_ssl';"
# Deveria mostrar: YES

# Se mostra: DISABLED
# Verificar caminhos certificado em my.cnf

Correção:

# Verificar caminhos em /etc/my.cnf.d/server.cnf
[mysqld]
ssl-ca=/etc/mysql/certs/ca.crt
ssl-cert=/etc/mysql/certs/server.crt
ssl-key=/etc/mysql/certs/server.key

# Reiniciar
sudo systemctl restart mariadb

Problema 3: Certificado Cliente Rejeitado

Sintoma: Conexão falha com cert cliente

Correção PostgreSQL:

# Verificar pg_hba.conf
cat /var/lib/pgsql/data/pg_hba.conf | grep hostssl

# Garantir que CA cliente está instalada
sudo cp client-ca.crt /var/lib/pgsql/data/root.crt

# Recarregar
sudo systemctl reload postgresql

Correção MySQL:

# Verificar usuário requer X.509
mysql -u root -p -e "SELECT user, host, ssl_type FROM mysql.user WHERE user='alice';"
# Deveria mostrar: X509

# Verificar arquivo CA configurado
mysql -u root -p -e "SHOW VARIABLES LIKE 'ssl_ca';"

18.7 Considerações Específicas por Versão

Versões PostgreSQL no RHEL

Versão RHELPostgreSQLSuporte SSLNotas
RHEL 79.2✅ SimConfig versão TLS manual
RHEL 810.x+✅ SimCrypto-policy sistema
RHEL 913.x+✅ SimAprimorado, crypto-policy
RHEL 1015.x+✅ SimÚltimo, crypto-policy

Versões MySQL/MariaDB no RHEL

Versão RHELBanco DadosSuporte SSLNotas
RHEL 7MariaDB 5.5✅ SimConfig manual
RHEL 8MariaDB 10.3+✅ SimConsciente crypto-policy
RHEL 9MariaDB 10.5+✅ SimTLS moderno
RHEL 10MariaDB 10.11+✅ SimRecursos últimos

18.8 Considerações Desempenho

Desempenho SSL PostgreSQL

#============================================#
# AJUSTE DESEMPENHO SSL POSTGRESQL
#============================================#

# /var/lib/pgsql/data/postgresql.conf

# SSL habilitado
ssl = on

# Compressão SSL (desabilitada para segurança, ataque CRIME)
ssl_compression = off

# Cifras SSL (RHEL 7 - manual)
# ssl_ciphers = 'HIGH:!aNULL:!MD5'

# RHEL 8/9/10: crypto-policy lida com cifras

# Connection pooling ajuda (usar pgBouncer)
# Terminação SSL em proxy pode melhorar desempenho

Desempenho SSL MySQL

#============================================#
# DESEMPENHO SSL MYSQL
#============================================#

# [mysqld] em /etc/my.cnf.d/server.cnf

# SSL habilitado
ssl-ca=/etc/mysql/certs/ca.crt
ssl-cert=/etc/mysql/certs/server.crt
ssl-key=/etc/mysql/certs/server.key

# Desabilitar cifras fracas (RHEL 7)
# tls_version=TLSv1.2,TLSv1.3
# ssl_cipher='ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256'

# RHEL 8/9/10: crypto-policy lida com isso

# Connection pooling (usar ProxySQL ou similar)

18.9 Monitorando TLS Banco Dados

Monitoramento PostgreSQL

#============================================#
# MONITORAR SSL POSTGRESQL
#============================================#

# Verificar conexões SSL
sudo -u postgres psql -c "SELECT datname, usename, ssl, version FROM pg_stat_ssl JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid;"

# Contar SSL vs não-SSL
sudo -u postgres psql -c "SELECT ssl, COUNT(*) FROM pg_stat_ssl GROUP BY ssl;"

# Verificar expiração certificado
openssl x509 -in /var/lib/pgsql/data/server.crt -noout -checkend $((86400*30))

# Monitorar conexões
sudo -u postgres psql -c "SELECT COUNT(*) FROM pg_stat_activity WHERE ssl = true;"

Monitoramento MySQL

#============================================#
# MONITORAR SSL MYSQL
#============================================#

# Verificar status SSL
mysql -u root -p -e "SHOW STATUS LIKE 'Ssl%';"

# Contar conexões SSL
mysql -u root -p -e "SHOW STATUS LIKE 'Ssl_accepts';"

# Conexões SSL atuais
mysql -u root -p -e "SELECT user, host, connection_type FROM information_schema.processlist WHERE connection_type = 'SSL/TLS';"

# Expiração certificado
openssl x509 -in /etc/mysql/certs/server.crt -noout -checkend $((86400*30))

18.10 Scripts Configuração Completo

Script Configuração SSL PostgreSQL

#!/bin/bash
# setup-postgresql-ssl.sh

echo "=== Setup SSL PostgreSQL ==="

# Gerar cert autoassinado (substituir com cert CA apropriado!)
sudo -u postgres openssl req -new -x509 -days 365 -nodes \
  -out /var/lib/pgsql/data/server.crt \
  -keyout /var/lib/pgsql/data/server.key \
  -subj "/CN=$(hostname -f)"

# Definir permissões
sudo chmod 600 /var/lib/pgsql/data/server.{crt,key}
sudo chown postgres:postgres /var/lib/pgsql/data/server.{crt,key}

# Habilitar SSL em postgresql.conf
sudo -u postgres psql -c "ALTER SYSTEM SET ssl = on;"

# Reiniciar
sudo systemctl restart postgresql

# Testar
sudo -u postgres psql -c "SHOW ssl;"

echo "✅ PostgreSQL SSL habilitado"
echo "⚠️ Substituir cert autoassinado com certificado apropriado da CA"

18.11 Conclusões Chave

  1. Ambos PostgreSQL e MySQL suportam SSL/TLS
  2. Propriedade arquivo crítica - postgres:postgres ou mysql:mysql
  3. Permissões: 600 para chaves, 644 para certs
  4. pg_hba.conf controla acesso PostgreSQL (hostssl)
  5. sslmode importante para clientes PostgreSQL
  6. Certificados cliente habilitam autenticação forte
  7. Testar completamente antes forçar TLS
  8. Monitorar uso SSL - Garantir clientes realmente usam

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA TLS BANCO DADOS                            │
├──────────────────────────────────────────────────────────────┤
│ === POSTGRESQL ===                                           │
│ Config:        /var/lib/pgsql/data/postgresql.conf           │
│ Acesso:        /var/lib/pgsql/data/pg_hba.conf               │
│ Certs:         /var/lib/pgsql/data/server.{crt,key}          │
│ Proprietário:  postgres:postgres                             │
│ Habilitar:     ssl = on                                      │
│ Testar:        psql "sslmode=require"                        │
│                                                              │
│ === MYSQL/MARIADB ===                                        │
│ Config:        /etc/my.cnf.d/server.cnf                      │
│ Certs:         /etc/mysql/certs/server.{crt,key}             │
│ Proprietário:  mysql:mysql                                   │
│ Habilitar:     ssl-ca, ssl-cert, ssl-key em [mysqld]         │
│ Testar:        mysql --ssl-mode=REQUIRED                     │
│                                                              │
│ Permissões:    chmod 600 *.key                               │
│                chmod 644 *.crt                               │
└──────────────────────────────────────────────────────────────┘

⚠️ Propriedade e permissões arquivo são críticas!
✅ Usar hostssl em pg_hba.conf para requerer SSL

🧪 Laboratório Prático

Lab 10: TLS do PostgreSQL

Configure TLS para conexões de banco de dados PostgreSQL

  • 📁 Localização: labs/pt_BR/10-postgresql-tls/
  • ⏱️ Tempo: 25-30 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 19: Serviços de Certificados do FreeIPA

CA Empresarial: FreeIPA é a solução integrada de gerenciamento de identidade e certificados da Red Hat. É a forma recomendada de executar uma CA interna no RHEL.


19.1 O Que é FreeIPA?

FreeIPA (Identity, Policy, Audit) é uma solução integrada de gerenciamento de informações de segurança que combina:

  • 🔐 Gerenciamento de Identidade (diretório LDAP)
  • 🎫 Autenticação (Kerberos)
  • 🔏 Autoridade Certificadora (CA) (Dogtag PKI)
  • 📋 Gerenciamento de Política (sudo, HBAC)
  • 🔍 DNS (integração BIND)

Por Que FreeIPA para Certificados?

Em vez de:

  • ❌ Gerenciar manualmente certificados por servidor
  • ❌ Custos CA externa
  • ❌ Infraestrutura PKI complexa

FreeIPA Fornece:

  • ✅ CA interna (gratuita!)
  • ✅ Registro automático de certificados
  • ✅ Auto-renovação via certmonger
  • ✅ Perfis de certificados
  • ✅ Interface Web e gerenciamento CLI
  • ✅ Integração com serviços RHEL

19.2 Instalação FreeIPA (Servidor)

Pré-requisitos

#============================================#
# PRÉ-REQUISITOS PARA SERVIDOR FREEIPA
#============================================#

# Requisitos:
# - RHEL 7/8/9/10
# - Mínimo 2 GB RAM (4 GB recomendado)
# - Hostname fully qualified
# - Resolução DNS apropriada
# - Endereço IP estático

# Verificar hostname
hostnamectl
# Deve mostrar FQDN: ipa.example.com

# Verificar DNS
nslookup $(hostname -f)

# Definir hostname se necessário
sudo hostnamectl set-hostname ipa.example.com

Instalar Servidor FreeIPA

#============================================#
# INSTALAR SERVIDOR FREEIPA
#============================================#

# Instalar pacotes
sudo dnf install ipa-server ipa-server-dns -y

# Executar wizard instalação
sudo ipa-server-install \
  --realm EXAMPLE.COM \
  --domain example.com \
  --ds-password 'DirectoryPassword123!' \
  --admin-password 'AdminPassword123!' \
  --hostname ipa.example.com \
  --setup-dns \
  --forwarder 8.8.8.8 \
  --forwarder 8.8.4.4 \
  --unattended

# Instalação leva 5-15 minutos

# Abrir firewall
sudo firewall-cmd --add-service={http,https,dns,ntp,freeipa-ldap,freeipa-ldaps,freeipa-replication} --permanent
sudo firewall-cmd --reload

# Verificar
sudo ipactl status

# Deveria mostrar múltiplos serviços rodando:
# - Directory Service (389-ds)
# - Certificate Authority (pki-tomcatd)
# - Kerberos KDC
# - Apache Web Server
# - DNS (named)

Acessar Interface Web FreeIPA

# Obter ticket Kerberos
kinit admin
# Senha: AdminPassword123!

# Acessar Interface Web
# https://ipa.example.com/
# Username: admin
# Senha: AdminPassword123!

19.3 Registrando Clientes

Instalação Cliente

#============================================#
# REGISTRAR CLIENTE NO FREEIPA
#============================================#

# No sistema cliente (web01.example.com)

# Instalar cliente IPA
sudo dnf install ipa-client -y

# Registrar
sudo ipa-client-install \
  --domain example.com \
  --realm EXAMPLE.COM \
  --server ipa.example.com \
  --principal admin \
  --password 'AdminPassword123!' \
  --mkhomedir \
  --unattended

# Verificar registro
ipa ping
# Pong!

# Verificar rastreamento certificado
sudo getcert list
# Mostra certmonger rastreando certificado host

19.4 Solicitando Certificados do FreeIPA

Método 1: Interface Web

  1. Navegar para https://ipa.example.com/
  2. Identity → Hosts → Selecionar host → Actions → New Certificate
  3. Ou: Identity → Services → Add service → Request certificate

Método 2: CLI (Recomendado)

#============================================#
# SOLICITAR CERTIFICADO DO FREEIPA
#============================================#

# Para serviço HTTP em web01
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web01.crt \
  -k /etc/pki/tls/private/web01.key \
  -K HTTP/web01.example.com@EXAMPLE.COM \
  -D web01.example.com \
  -C "systemctl reload httpd"

# Para serviço customizado
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/myapp.crt \
  -k /etc/pki/tls/private/myapp.key \
  -K myapp/web01.example.com@EXAMPLE.COM \
  -D myapp.example.com

# Verificar status
sudo getcert list

# Aguardar status MONITORING (cert emitido)

Método 3: ipa cert-request (Avançado)

#============================================#
# AVANÇADO: IPA CERT-REQUEST
#============================================#

# Gerar CSR
openssl req -new -key server.key -out server.csr \
  -subj "/CN=server.example.com"

# Solicitar certificado via IPA
ipa cert-request server.csr \
  --principal HTTP/server.example.com@EXAMPLE.COM

# Obter ID certificado da saída
# Certificate: MIIDXTCCAkWgAwIBAgI...
# Request ID: 12345

# Recuperar certificado
ipa cert-show 12345 --out server.crt

19.5 Perfis de Certificado

Perfis Disponíveis

#============================================#
# PERFIS CERTIFICADO FREEIPA
#============================================#

# Listar perfis disponíveis
ipa certprofile-find

# Perfis comuns:
# - caIPAserviceCert: Certificados serviço (HTTP, LDAP, etc.)
# - IECUserRoles: Certificados usuário
# - smimeUserCert: Certificados email S/MIME
# - caSelfSignedCert: CA autoassinada

# Ver detalhes perfil
ipa certprofile-show caIPAserviceCert

# Criar perfil customizado
ipa certprofile-import MyCustomProfile \
  --file custom-profile.cfg \
  --store TRUE

Usando Perfil Específico

# Solicitar com perfil específico
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/custom.crt \
  -k /etc/pki/tls/private/custom.key \
  -K HTTP/web01.example.com@EXAMPLE.COM \
  -T caIPAserviceCert  # Especificar perfil

19.6 Renovação Automática

Como Funciona

FreeIPA + certmonger = Ciclo de Vida Certificado Automático!

#============================================#
# RENOVAÇÃO AUTOMÁTICA COM FREEIPA
#============================================#

# certmonger automaticamente:
# 1. Rastreia expiração certificado
# 2. Submete requisição renovação para IPA
# 3. Obtém certificado renovado
# 4. Salva em arquivo
# 5. Executa comando post-save (ex: reload httpd)

# Verificar status renovação
sudo getcert list

# Exemplo saída:
# Request ID '20240101000000':
#   status: MONITORING
#   stuck: no
#   key pair storage: type=FILE,location='/etc/pki/tls/private/web.key'
#   certificate: type=FILE,location='/etc/pki/tls/certs/web.crt'
#   CA: IPA
#   issuer: CN=Certificate Authority,O=EXAMPLE.COM
#   subject: CN=web01.example.com,O=EXAMPLE.COM
#   expires: 2025-01-01 00:00:00 UTC
#   pre-save command:
#   post-save command: systemctl reload httpd
#   track: yes
#   auto-renew: yes

# Renovação acontece automaticamente ~28 dias antes expiração!

Renovação Manual (Se Necessário)

# Forçar renovação agora
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

# Ou por ID requisição
sudo ipa-getcert resubmit -i 20240101000000

# Verificar se bem-sucedida
sudo getcert list -f /etc/pki/tls/certs/web.crt

19.7 FreeIPA como CA Empresarial

Gerenciamento Certificado CA

#============================================#
# GERENCIAMENTO CA FREEIPA
#============================================#

# Ver certificado CA
ipa ca-show ipa

# Exportar certificado CA
ipa ca-show ipa --certificate --out /tmp/ipa-ca.crt

# Instalar em clientes (automático durante ipa-client-install)
# Manual: Copiar para repositório de confiança
sudo cp /tmp/ipa-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# Renovar certificado CA (quando necessário)
sudo ipa-cacert-manage renew

# Verificar expiração CA
sudo getcert list -d /var/lib/ipa | grep "CA:"

Sub-CAs (Avançado)

#============================================#
# SUB-CA FREEIPA (RHEL 8+)
#============================================#

# Criar sub-CA
ipa ca-add subca \
  --subject "CN=SubCA,O=EXAMPLE.COM" \
  --desc "Department Sub-CA"

# Emitir certificado da sub-CA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/dept.crt \
  -k /etc/pki/tls/private/dept.key \
  -X subca \
  -K HTTP/dept.example.com@EXAMPLE.COM

19.8 Exemplos Integração Serviço

Apache com Certificados FreeIPA

#============================================#
# APACHE + FREEIPA SETUP COMPLETO
#============================================#

# 1. Registrar sistema no IPA (se ainda não)
sudo ipa-client-install

# 2. Solicitar certificado para Apache
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/$(hostname -f).crt \
  -k /etc/pki/tls/private/$(hostname -f).key \
  -K HTTP/$(hostname -f)@EXAMPLE.COM \
  -D $(hostname -f) \
  -C "systemctl reload httpd"

# 3. Aguardar certificado
until sudo getcert list -f /etc/pki/tls/certs/$(hostname -f).crt | grep -q "MONITORING"; do
  sleep 5
  echo "Aguardando certificado..."
done

# 4. Configurar Apache para usá-lo
# /etc/httpd/conf.d/ssl.conf:
# SSLCertificateFile /etc/pki/tls/certs/$(hostname -f).crt
# SSLCertificateKeyFile /etc/pki/tls/private/$(hostname -f).key

# 5. Recarregar Apache
sudo systemctl reload httpd

# Certificado auto-renova!

LDAP com Certificados FreeIPA

# Próprio serviço LDAP do FreeIPA automaticamente usa certificados IPA
# Nenhuma configuração manual necessária!

# Testar
ldapsearch -H ldaps://ipa.example.com:636 -x -b "dc=example,dc=com"

19.9 Solução de Problemas Certificados FreeIPA

Problemas Comuns

Problema 1: CA_UNREACHABLE

# Sintoma
sudo getcert list
# status: CA_UNREACHABLE

# Diagnóstico
# 1. Verificar conectividade servidor IPA
ipa ping

# 2. Verificar ticket Kerberos
klist

# 3. Renovar ticket se expirado
kinit -k host/$(hostname -f)@EXAMPLE.COM

# 4. Verificar serviços IPA
ssh ipa.example.com "sudo ipactl status"

# 5. Retentar
sudo ipa-getcert resubmit -i <request-id>

Problema 2: Requisição Certificado Negada

# Verificar status requisição
sudo getcert list -v

# Causas comuns:
# 1. Principal serviço não existe
ipa service-find HTTP/$(hostname -f)

# Se não encontrado, adicionar:
ipa service-add HTTP/$(hostname -f)

# 2. Host não registrado
ipa host-show $(hostname -f)

# 3. Permissões insuficientes
# Deve solicitar como principal host registrado

Problema 3: Certificado Não Renovado

# Verificar logs certmonger
sudo journalctl -u certmonger | tail -50

# Verificar status CA IPA
sudo ipactl status | grep "CA"

# Forçar renovação
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

# Verificar expiração certificado CA
sudo openssl x509 -in /etc/ipa/ca.crt -noout -dates

19.10 Recursos Avançados

Suporte ACME (RHEL 9+)

FreeIPA pode atuar como servidor ACME!

#============================================#
# HABILITAR ACME NO FREEIPA (RHEL 9+)
#============================================#

# No servidor IPA (RHEL 9+)
sudo ipa-acme-manage enable

# Verificar que ACME está disponível
curl https://ipa.example.com/acme/directory

# No cliente: Usar certbot ou certmonger com ACME
sudo certbot register --server https://ipa.example.com/acme/directory
sudo certbot certonly --server https://ipa.example.com/acme/directory \
  -d web01.example.com

Hold/Revogação Certificado

#============================================#
# REVOGAR CERTIFICADOS
#============================================#

# Colocar certificado em hold (temporário)
ipa cert-revoke 12345 --revocation-reason 6

# Revogar permanentemente
ipa cert-revoke 12345 --revocation-reason 1

# Razões:
# 0: não especificado
# 1: keyCompromise
# 2: cACompromise
# 4: superseded
# 6: certificateHold (pode ser removido)

# Remover de hold
ipa cert-remove-hold 12345

# Verificar status revogação
ipa cert-show 12345

19.11 Monitorando PKI FreeIPA

Verificações Saúde

#============================================#
# MONITORAMENTO SAÚDE PKI FREEIPA
#============================================#

# Verificar status geral IPA
sudo ipactl status

# Verificar subsistema CA
sudo systemctl status pki-tomcatd@pki-tomcat

# Verificar expirações certificado
ipa-healthcheck --source ipahealthcheck.ipa.certs

# Verificar rastreamento certificado
sudo getcert list | grep -E "(Request|status|expires)"

# Monitorar certificado CA
openssl x509 -in /etc/ipa/ca.crt -noout -dates

# Verificar por certificados expirando
ipa cert-find --validnotafter-from=$(date -d '+60 days' +%Y-%m-%d)

19.12 Backup e Recuperação

Backup Servidor IPA

#============================================#
# BACKUP FREEIPA (INCLUINDO CA)
#============================================#

# Backup completo
sudo ipa-backup --data --online

# Localização backup
ls -lh /var/lib/ipa/backup/

# Incluir chaves CA (apenas backup offline!)
sudo ipactl stop
sudo ipa-backup --data --gpg
# Entrar passphrase GPG
sudo ipactl start

Restaurar Servidor IPA

# Restaurar do backup
sudo ipactl stop
sudo ipa-restore /var/lib/ipa/backup/ipa-full-YYYY-MM-DD-HH-MM-SS/
sudo ipactl start

19.13 Melhores Práticas

Melhores Práticas Certificado FreeIPA

✅ Usar FreeIPA para todos certificados internos
✅ Deixar certmonger lidar com renovação (não renovar manualmente)
✅ Usar principals serviço (HTTP/host, ldap/host, etc.)
✅ Adicionar SANs ao solicitar certificados
✅ Definir comandos post-save (flag -C) para reload serviço
✅ Monitorar saúde servidor IPA regularmente
✅ Backup servidor IPA semanalmente (incluindo chaves CA)
✅ Ter pelo menos 2 réplicas IPA (HA)
✅ Monitorar expiração certificado CA
✅ Testar renovação certificado antes expiração
✅ Usar perfis certificado para padronização

19.14 Exemplos Integração

Configuração Serviço Completo com FreeIPA

#!/bin/bash
# setup-service-with-ipa.sh
# Workflow completo para certificado serviço do FreeIPA

SERVICE_NAME="HTTP"  # Ou LDAP, postgresql, etc.
HOST=$(hostname -f)
PRINCIPAL="${SERVICE_NAME}/${HOST}@EXAMPLE.COM"
CERT_FILE="/etc/pki/tls/certs/${HOST}.crt"
KEY_FILE="/etc/pki/tls/private/${HOST}.key"
POST_COMMAND="systemctl reload httpd"

echo "=== Solicitando Certificado do FreeIPA ==="

# 1. Garantir que principal serviço existe
if ! ipa service-show "${SERVICE_NAME}/${HOST}" &>/dev/null; then
  echo "Criando principal serviço..."
  ipa service-add "${SERVICE_NAME}/${HOST}"
fi

# 2. Solicitar certificado
sudo ipa-getcert request \
  -f "$CERT_FILE" \
  -k "$KEY_FILE" \
  -K "$PRINCIPAL" \
  -D "$HOST" \
  -C "$POST_COMMAND"

# 3. Aguardar certificado
echo "Aguardando emissão certificado..."
until sudo getcert list -f "$CERT_FILE" | grep -q "MONITORING"; do
  sleep 5
done

# 4. Verificar
echo "✅ Certificado emitido!"
sudo openssl x509 -in "$CERT_FILE" -noout -subject -issuer -dates

# 5. Certificado vai auto-renovar!
echo "✅ Rastreamento certificado habilitado - auto-renovação ativa"

19.15 Conclusões Chave

  1. FreeIPA é a CA interna recomendada pela Red Hat
  2. Combina identidade + certificados + autenticação
  3. Integração certmonger é automática
  4. Certificados auto-renovam (sem trabalho manual!)
  5. Usar principals serviço (HTTP/host, ldap/host)
  6. Suporte ACME no RHEL 9+ (pode substituir Let’s Encrypt para interno)
  7. Interface Web e CLI ambas disponíveis
  8. Escala para empresarial - Suporta réplicas, sub-CAs

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA SERVIÇOS CERTIFICADO FREEIPA               │
├──────────────────────────────────────────────────────────────┤
│ Instalar:       dnf install ipa-server                       │
│ Setup:          ipa-server-install                           │
│ Status:         ipactl status                                │
│ Interface Web:  https://ipa.example.com/                     │
│                                                              │
│ Registrar:      ipa-client-install                           │
│ Solicitar:      ipa-getcert request -K service/host@REALM    │
│ Listar:         getcert list                                 │
│ Reenviar:       ipa-getcert resubmit -f /path/to/cert.crt    │
│                                                              │
│ Principal:      HTTP/host.example.com@REALM                  │
│                 ldap/host.example.com@REALM                  │
│                 postgresql/host.example.com@REALM            │
│                                                              │
│ Auto-renov:     Automática via certmonger                    │
│ ACME:           ipa-acme-manage enable (RHEL 9+)             │
└──────────────────────────────────────────────────────────────┘

✅ Melhor para gerenciamento certificado empresarial interno
✅ Totalmente integrado com RHEL
✅ Sem renovação manual necessária!

Navegação do Capítulo

Capítulo 20: Outros Serviços RHEL com Certificados

Além do Básico: Muitos outros serviços RHEL usam certificados. Este capítulo cobre Cockpit, serviços VPN, registros container, e mais.


20.1 Serviços Cobertos

Este capítulo fornece guias de início rápido para:

  • 🖥️ Cockpit (Console admin baseado em web)
  • 🔒 OpenVPN (Serviço VPN)
  • 🛡️ strongSwan (VPN IPsec)
  • 📦 Container Registry (Registro Podman/Docker)
  • 📡 HAProxy (Load balancer)
  • 🔌 Redis com TLS (usando stunnel)
  • ⚙️ Ansible Tower/AWX (Plataforma automatização)

20.2 Console Web Cockpit

O Que é Cockpit?

Cockpit é a interface de administração baseada em web integrada do RHEL.

Padrão: Usa certificado autoassinado Objetivo: Substituir com certificado apropriado

Configurar Cockpit com Certificados

#============================================#
# COCKPIT COM CERTIFICADO APROPRIADO
#============================================#

# Instalar Cockpit
sudo dnf install cockpit -y
sudo systemctl enable --now cockpit.socket

# Abrir firewall
sudo firewall-cmd --add-service=cockpit --permanent
sudo firewall-cmd --reload

# Localização certificado Cockpit
ls -l /etc/cockpit/ws-certs.d/

# Método 1: Colocar certificado com nome específico
# Cockpit usa certificados em /etc/cockpit/ws-certs.d/
# Formato filename: NN-name.cert (onde NN = prioridade, menor = maior prioridade)

sudo cat server.crt server.key > /etc/cockpit/ws-certs.d/01-server.cert
sudo chmod 644 /etc/cockpit/ws-certs.d/01-server.cert

# Reiniciar Cockpit
sudo systemctl restart cockpit.socket

# Método 2: Usar certmonger
sudo ipa-getcert request \
  -f /etc/cockpit/ws-certs.d/01-cockpit.cert \
  -k /etc/cockpit/ws-certs.d/01-cockpit.cert \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f) \
  -C "systemctl restart cockpit.socket" \
  -F /etc/cockpit/ws-certs.d/01-cockpit.cert  # Cert+chave combinados

# Acessar Cockpit
# https://server.example.com:9090/

Nota: Cockpit espera cert+chave combinados em arquivo único!


20.3 OpenVPN

Configuração Servidor com Certificados

#============================================#
# SERVIDOR OPENVPN COM CERTIFICADOS
#============================================#

# Instalar OpenVPN (de EPEL no RHEL 7, repos no RHEL 8+)
sudo dnf install openvpn -y

# Gerar ou obter certificados:
# - Certificado CA
# - Certificado servidor + chave
# - Certificados cliente

# /etc/openvpn/server/server.conf
port 1194
proto udp
dev tun

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh2048.pem

tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256

server 10.8.0.0 255.255.255.0

# Iniciar OpenVPN
sudo systemctl enable --now openvpn-server@server

# Abrir firewall
sudo firewall-cmd --add-port=1194/udp --permanent
sudo firewall-cmd --reload

Testar OpenVPN

# Verificar se rodando
systemctl status openvpn-server@server

# Testar do cliente
openvpn --config client.ovpn --verb 3

20.4 strongSwan IPsec VPN

Configurar com Certificados

#============================================#
# STRONGSWAN COM CERTIFICADOS
#============================================#

# Instalar
sudo dnf install strongswan -y

# Localizações certificado
# CA: /etc/strongswan/ipsec.d/cacerts/
# Certs Servidor/Cliente: /etc/strongswan/ipsec.d/certs/
# Chaves privadas: /etc/strongswan/ipsec.d/private/

# Copiar certificados
sudo cp ca.crt /etc/strongswan/ipsec.d/cacerts/
sudo cp server.crt /etc/strongswan/ipsec.d/certs/
sudo cp server.key /etc/strongswan/ipsec.d/private/
sudo chmod 600 /etc/strongswan/ipsec.d/private/server.key

# /etc/strongswan/ipsec.conf
config setup
    charondebug="ike 2, knl 2, cfg 2"

conn example-ipsec
    left=%any
    leftid=@server.example.com
    leftcert=server.crt
    leftsubnet=10.0.0.0/24

    right=%any
    rightid=@client.example.com
    rightcert=client.crt

    auto=add
    type=tunnel
    keyexchange=ikev2

# Iniciar strongSwan
sudo systemctl enable --now strongswan

# Verificar status
sudo swanctl --list-sas

20.5 Registro Container com TLS

Registro Podman/Docker

#============================================#
# REGISTRO CONTAINER COM TLS
#============================================#

# Instalar registry
sudo dnf install -y podman
sudo podman pull docker.io/library/registry:2

# Criar certificado para registry
sudo mkdir -p /etc/registry/certs
sudo openssl genpkey -algorithm RSA \
  -out /etc/registry/certs/registry.key \
  -pkeyopt rsa_keygen_bits:2048

sudo openssl req -new -x509 -days 365 \
  -key /etc/registry/certs/registry.key \
  -out /etc/registry/certs/registry.crt \
  -subj "/CN=registry.example.com" \
  -addext "subjectAltName=DNS:registry.example.com"

# Executar registry com TLS
sudo podman run -d \
  --name registry \
  -p 5000:5000 \
  -v /etc/registry/certs:/certs:ro \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
  registry:2

# Testar
curl https://registry.example.com:5000/v2/_catalog

Configuração Cliente

# Adicionar CA registry ao trust sistema
sudo cp /etc/registry/certs/registry.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# Testar pull
podman pull registry.example.com:5000/myimage:latest

20.6 Terminação TLS HAProxy

Load Balancer com TLS

#============================================#
# TERMINAÇÃO TLS HAPROXY
#============================================#

# Instalar HAProxy
sudo dnf install haproxy -y

# HAProxy requer cert+chave+cadeia combinados em UM arquivo
cat server.crt intermediate.crt server.key > /etc/haproxy/certs/bundle.pem
sudo chmod 600 /etc/haproxy/certs/bundle.pem

# /etc/haproxy/haproxy.cfg
frontend https-in
    bind *:443 ssl crt /etc/haproxy/certs/bundle.pem
    mode http
    default_backend web_servers

    # Forçar HTTPS
    http-request redirect scheme https unless { ssl_fc }

    # Headers segurança
    http-response set-header Strict-Transport-Security "max-age=31536000"

backend web_servers
    mode http
    balance roundrobin
    server web1 10.0.1.10:80 check
    server web2 10.0.1.11:80 check
    server web3 10.0.1.12:80 check

# Iniciar HAProxy
sudo systemctl enable --now haproxy

# Testar
curl -v https://loadbalancer.example.com/

20.7 Redis com TLS (via stunnel)

Proxy TLS Redis

#============================================#
# REDIS COM TLS USANDO STUNNEL
#============================================#

# Instalar Redis e stunnel
sudo dnf install redis stunnel -y

# Configurar Redis (escutar apenas em localhost)
# /etc/redis/redis.conf
bind 127.0.0.1

# Iniciar Redis
sudo systemctl enable --now redis

# Configurar stunnel
# /etc/stunnel/redis.conf
[redis-tls]
accept = 0.0.0.0:6380
connect = 127.0.0.1:6379
cert = /etc/pki/tls/certs/redis.crt
key = /etc/pki/tls/private/redis.key
CAfile = /etc/pki/tls/certs/ca-bundle.crt

# Opcional: Requerer certificados cliente
verify = 2
CApath = /etc/pki/tls/certs/

# Iniciar stunnel
sudo systemctl enable --now stunnel@redis

# Testar
openssl s_client -connect localhost:6380
# Então digitar: PING
# Deveria responder: +PONG

20.8 Ansible Tower/AWX

Tower/AWX com Certificado Customizado

#============================================#
# ANSIBLE TOWER/AWX CERTIFICADO CUSTOMIZADO
#============================================#

# Localização certificado Tower
# /etc/tower/tower.cert
# /etc/tower/tower.key

# Substituir com certificado apropriado
sudo cp tower.example.com.crt /etc/tower/tower.cert
sudo cp tower.example.com.key /etc/tower/tower.key
sudo chmod 600 /etc/tower/tower.key

# Reiniciar serviços Tower
sudo ansible-tower-service restart

# Ou para AWX (containerizado)
# Atualizar docker-compose.yml ou secrets k8s

# Testar
curl -v https://tower.example.com/

20.9 SSH com Certificados (Avançado)

Autenticação Certificado SSH

Nota: Diferente de chaves SSH! Isto usa certificados X.509.

#============================================#
# SSH COM CERTIFICADOS X.509 (AVANÇADO)
#============================================#

# Requer: openssh-server com patch X.509 ou ssh-keysign

# Gerar certificado para usuário SSH
openssl genpkey -algorithm RSA -out ssh-user.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key ssh-user.key -out ssh-user.csr -subj "/CN=user@example.com"
# Obter assinado por CA

# Configurar sshd (experimental, não padrão RHEL)
# /etc/ssh/sshd_config
# X509KeyAlgorithm x509v3-rsa2048-sha256
# X509TrustAnchor /etc/ssh/ca.crt

# Abordagem padrão: Usar chaves SSH, não X.509
# Suporte X.509 SSH é limitado no RHEL

Recomendação: Usar autenticação SSH baseada em chave padrão para SSH, usar X.509 para outros serviços.


20.10 Monitorando Múltiplos Serviços

Verificação Certificado Multi-Serviço

#!/bin/bash
# check-all-services.sh
# Verificar certificados para todos serviços

echo "=== Verificação Certificado Multi-Serviço ==="

# Apache
echo "1. Apache (porta 443):"
timeout 3 openssl s_client -connect localhost:443 </dev/null 2>&1 | grep -E "(subject=|issuer=)" | head -2

# NGINX (se instalado)
echo "2. NGINX (porta 8443 ou customizada):"
timeout 3 openssl s_client -connect localhost:8443 </dev/null 2>&1 | grep -E "(subject=|issuer=)" | head -2

# Postfix
echo "3. Postfix SMTPS (porta 465):"
timeout 3 openssl s_client -connect localhost:465 </dev/null 2>&1 | grep -E "(subject=|issuer=)" | head -2

# LDAPS
echo "4. LDAP (porta 636):"
timeout 3 openssl s_client -connect localhost:636 </dev/null 2>&1 | grep -E "(subject=|issuer=)" | head -2

# PostgreSQL
echo "5. PostgreSQL (porta 5432):"
sudo -u postgres psql -c "SHOW ssl;" 2>/dev/null

# Cockpit
echo "6. Cockpit (porta 9090):"
timeout 3 openssl s_client -connect localhost:9090 </dev/null 2>&1 | grep -E "(subject=|issuer=)" | head -2

# Rastreamento certmonger
echo ""
echo "7. Certificados rastreados certmonger:"
sudo getcert list | grep -c "Request ID"
echo "total certificados rastreados"

echo ""
echo "=== Verificação Completa ==="

20.11 Referências Rápidas Específicas por Serviço

Cockpit

# Instalar: dnf install cockpit
# Localização cert: /etc/cockpit/ws-certs.d/
# Formato: Cert+chave combinados
# Recarregar: systemctl restart cockpit.socket
# Testar: https://server:9090/

OpenVPN

# Instalar: dnf install openvpn (EPEL)
# Localização cert: /etc/openvpn/server/
# Arquivos: ca.crt, server.crt, server.key
# Iniciar: systemctl start openvpn-server@server
# Testar: openvpn --config client.ovpn

strongSwan

# Instalar: dnf install strongswan
# Localização cert: /etc/strongswan/ipsec.d/
# Subdirs: cacerts/, certs/, private/
# Iniciar: systemctl start strongswan
# Testar: swanctl --list-sas

HAProxy

# Instalar: dnf install haproxy
# Formato cert: PEM Combinado (cert+chave+cadeia)
# Localização: /etc/haproxy/certs/
# Config: bind *:443 ssl crt /path/to/bundle.pem
# Testar: curl -v https://loadbalancer/

Registro Container

# Executar: podman run -d -p 5000:5000 registry:2
# Certs: Montar como volumes (-v)
# Env vars: REGISTRY_HTTP_TLS_CERTIFICATE
#           REGISTRY_HTTP_TLS_KEY
# Testar: curl https://registry:5000/v2/_catalog

20.12 Certificados Wildcard para Múltiplos Serviços

Quando Usar Wildcards

Cenário: Múltiplos subdomínios no mesmo servidor

web.example.com    → Apache
api.example.com    → NGINX
admin.example.com  → Cockpit
mail.example.com   → Postfix

Solução: Usar certificado wildcard *.example.com

Gerar Certificado Wildcard

#============================================#
# CERTIFICADO WILDCARD
#============================================#

# Gerar chave
openssl genpkey -algorithm RSA -out wildcard.key -pkeyopt rsa_keygen_bits:2048

# Gerar CSR
openssl req -new -key wildcard.key -out wildcard.csr \
  -subj "/CN=*.example.com" \
  -addext "subjectAltName=DNS:*.example.com,DNS:example.com"

# Submeter para CA, receber wildcard.crt

# Usar para múltiplos serviços
sudo cp wildcard.crt /etc/pki/tls/certs/
sudo cp wildcard.key /etc/pki/tls/private/
sudo chmod 600 /etc/pki/tls/private/wildcard.key

# Configurar cada serviço para usá-lo
# Apache: SSLCertificateFile /etc/pki/tls/certs/wildcard.crt
# NGINX: ssl_certificate /etc/pki/tls/certs/wildcard.crt
# Postfix: smtpd_tls_cert_file = /etc/pki/tls/certs/wildcard.crt

Prós:

  • ✅ Um certificado para múltiplos subdomínios
  • ✅ Gerenciamento mais fácil
  • ✅ Cost-effective (se comprando)

Contras:

  • ⚠️ Se comprometido, afeta todos subdomínios
  • ⚠️ Não funciona para multi-nível (..example.com)
  • ⚠️ Algumas políticas segurança proíbem wildcards

20.13 Matriz Certificados Serviço

Requisitos Certificado por Serviço

ServiçoCN/SANCert ClienteAuto-RenovNotas Especiais
ApacheRequeridoOpcional (mTLS)certmongerMais comum
NGINXRequeridoOpcional (mTLS)certmongerAlto desempenho
PostfixRequeridoOpcionalcertmongerSMTP/SMTPS
OpenLDAPRequeridoOpcionalcertmongerDeve ser legível usuário ldap
PostgreSQLRequeridoOpcionalManual ou scriptPropriedade usuário postgres
MySQLRequeridoOpcionalManual ou scriptPropriedade usuário mysql
FreeIPAAutomáticoN/AAutomáticoAuto-gerenciado
CockpitRequeridoNãocertmongerArquivo cert+chave combinado
OpenVPNRequeridoRequeridoManualPKI complexa
strongSwanRequeridoRequeridoManualIPsec específico
HAProxyRequeridoNãocertmongerFormato PEM combinado
RegistryRequeridoOpcionalManualContainer específico

20.14 Guia Rápido Solução de Problemas

Solução de Problemas TLS Serviço Genérico

#============================================#
# SOLUÇÃO DE PROBLEMAS TLS UNIVERSAL
#============================================#

# 1. Identificar serviço e porta
ss -tlnp | grep <serviço>

# 2. Verificar se TLS está habilitado
# (comando específico serviço)

# 3. Testar conexão TLS
openssl s_client -connect localhost:<porta>
# Ou com STARTTLS:
openssl s_client -connect localhost:<porta> -starttls <protocolo>

# 4. Verificar arquivos certificado
ls -lZ /path/to/certs/

# 5. Verificar propriedade/permissões
# - Certificado: 644, propriedade usuário serviço
# - Chave: 600, propriedade usuário serviço

# 6. Verificar configuração
# (arquivo config específico serviço)

# 7. Verificar logs
sudo journalctl -u <serviço> | grep -i tls
sudo tail -f /var/log/<serviço>/ | grep -i tls

# 8. Testar de cliente remoto
openssl s_client -connect server.example.com:<porta>

20.15 Gerenciamento Certificado Centralizado

Usando certmonger para Todos Serviços

#============================================#
# ESTRATÉGIA GERENCIAMENTO CERTIFICADO CENTRAL
#============================================#

# Rastrear todos certificados serviço com certmonger

# Apache
sudo ipa-getcert request -f /etc/pki/tls/certs/apache.crt \
  -k /etc/pki/tls/private/apache.key \
  -K HTTP/$(hostname -f)@REALM \
  -C "systemctl reload httpd"

# NGINX
sudo ipa-getcert request -f /etc/pki/tls/certs/nginx.crt \
  -k /etc/pki/tls/private/nginx.key \
  -K HTTP/$(hostname -f)@REALM \
  -C "systemctl reload nginx"

# Postfix
sudo ipa-getcert request -f /etc/pki/tls/certs/postfix.crt \
  -k /etc/pki/tls/private/postfix.key \
  -K smtp/$(hostname -f)@REALM \
  -C "postfix reload"

# OpenLDAP
sudo ipa-getcert request -f /etc/openldap/certs/ldap.crt \
  -k /etc/openldap/certs/ldap.key \
  -K ldap/$(hostname -f)@REALM \
  -o ldap:ldap \
  -m 600 \
  -C "systemctl restart slapd"

# Monitorar todos
sudo getcert list

Benefícios:

  • ✅ Ferramenta única para todos serviços
  • ✅ Renovação automática
  • ✅ Monitoramento centralizado
  • ✅ Abordagem consistente

20.16 Conclusões Chave

  1. Muitos serviços usam certificados além de apenas servidores web
  2. Cada serviço tem requisitos únicos - Verificar propriedade, permissões
  3. certmonger funciona com maioria serviços para automatização
  4. Certificados wildcard podem simplificar setups multi-serviço
  5. Testar cada serviço independentemente
  6. Rastreamento centralizado com certmonger recomendado
  7. Documentar configurações específicas serviço

Cartão de Referência Rápida

┌───────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CERTIFICADOS OUTROS SERVIÇOS                │
├───────────────────────────────────────────────────────────────┤
│ Cockpit:     /etc/cockpit/ws-certs.d/NN-name.cert             │
│              (cert+chave combinados)                          │
│                                                               │
│ OpenVPN:     /etc/openvpn/server/{ca,server}.{crt,key}        │
│              PKI complexa com certs cliente                   │
│                                                               │
│ strongSwan:  /etc/strongswan/ipsec.d/{cacerts,certs,private}/ │
│              Configuração IPsec-específica                    │
│                                                               │
│ HAProxy:     PEM Combinado (cert+chave+cadeia em um arquivo)  │
│              /etc/haproxy/certs/bundle.pem                    │
│                                                               │
│ Registry:    Variáveis ambiente para container                │
│              REGISTRY_HTTP_TLS_CERTIFICATE/KEY                │
│                                                               │
│ Genérico:    Verificar propriedade, permissões, SELinux       │
│              Testar com: openssl s_client -connect :porta     │
└───────────────────────────────────────────────────────────────┘

✅ Usar certmonger para automatização onde possível
✅ Cada serviço tem requisitos únicos formato/localização arquivo

Navegação do Capítulo

Capítulo 21: Melhores Práticas de Certificados de Serviço

Crítico para Operações: Aprenda as melhores práticas que previnem 90% dos problemas de certificado antes que aconteçam.


21.1 O Custo de Gerenciamento Pobre de Certificados

Impactos mundo real:

  • ❌ Certificado expirado → Website fora do ar (perda receita)
  • ❌ Permissões erradas → Serviço falha ao iniciar (downtime)
  • ❌ Sem backup → Falha CA significa reemissão manual (horas/dias)
  • ❌ Nomenclatura ruim → Confusão durante incidente (resposta atrasada)
  • ❌ Sem monitoramento → Expiração surpresa (resposta emergência)

Este capítulo previne estes problemas.


21.2 Melhores práticas de organização de arquivos

Estrutura Diretório Padrão

/etc/pki/tls/
├── certs/                      # Arquivos certificado (públicos)
│   ├── service-name.crt        # Certificados reais
│   ├── service-name-chain.crt  # Com cadeia intermediária
│   └── ca-bundle.crt           # Bundle CA
│
├── private/                    # Chaves privadas (protegidas!)
│   └── service-name.key        # Chaves privadas (modo 600)
│
├── csr/                        # Requisições certificado (opcional)
│   └── service-name.csr        # CSRs para rastreamento
│
└── backup/                     # Backups (opcional mas recomendado)
    └── YYYY-MM-DD/
        ├── service-name.crt
        └── service-name.key

Convenções de Nomenclatura

Boa nomenclatura previne confusão:

# ✅ BOM - Claro, descritivo
/etc/pki/tls/certs/web01-example-com.crt
/etc/pki/tls/certs/mail-smtp-example-com.crt
/etc/pki/tls/certs/ldap-primary-example-com.crt

# ❌ RUIM - Não claro, genérico
/etc/pki/tls/certs/cert1.crt
/etc/pki/tls/certs/new.crt
/etc/pki/tls/certs/temp.crt

Padrão nomenclatura:

[serviço]-[hostname/função]-[domínio].crt
[serviço]-[hostname/função]-[domínio].key

Exemplos:
apache-web01-example-com.crt
nginx-www-example-com.crt
postfix-mail-example-com.crt
ldap-dir01-example-com.crt
postgresql-db-primary-example-com.crt

Padrões Permissão Arquivo

#============================================#
# CRÍTICO: Permissões Apropriadas
#============================================#

# Certificados (públicos) - legíveis por todos
/etc/pki/tls/certs/*.crt           → 644 (rw-r--r--)
/etc/pki/tls/certs/                → 755 (rwxr-xr-x)

# Chaves privadas (secretas!) - apenas legíveis pelo proprietário
/etc/pki/tls/private/*.key         → 600 (rw-------)
/etc/pki/tls/private/              → 711 (rwx--x--x)

# Chaves específicas serviço - propriedade usuário serviço
/etc/pki/tls/private/apache.key    → 600, owner: root ou apache
/etc/pki/tls/private/postgres.key  → 600, owner: postgres

Script definir permissões:

#!/bin/bash
# set-cert-permissions.sh
# Define permissões apropriadas em arquivos certificado

CERT_DIR="/etc/pki/tls/certs"
KEY_DIR="/etc/pki/tls/private"

# Diretório certificados
chmod 755 "$CERT_DIR"
chmod 644 "$CERT_DIR"/*.crt 2>/dev/null

# Diretório chaves privadas
chmod 711 "$KEY_DIR"
chmod 600 "$KEY_DIR"/*.key 2>/dev/null

# Verificar
echo "Permissões certificados:"
ls -ld "$CERT_DIR" "$CERT_DIR"/*.crt 2>/dev/null

echo ""
echo "Permissões chaves privadas:"
ls -ld "$KEY_DIR" "$KEY_DIR"/*.key 2>/dev/null

# Verificar por chaves excessivamente permissivas
echo ""
echo "Verificando por problemas segurança:"
find "$KEY_DIR" -type f -not -perm 600 -ls 2>/dev/null && \
  echo "⚠️ AVISO: Algumas chaves têm permissões incorretas!" || \
  echo "✅ Todas chaves apropriadamente protegidas"

21.3 Gerenciamento do ciclo de vida de certificados

Timeline Renovação

Ciclo de Vida Certificado (validade 365 dias):

Dia   0: Certificado emitido
Dia  30: Primeiro lembrete renovação (335 dias restantes)
Dia  60: Segundo lembrete (305 dias restantes)
Dia 300: Janela renovação crítica inicia (65 dias restantes)
Dia 330: URGENTE - Renovação necessária (35 dias restantes)
Dia 350: CRÍTICO - Renovação atrasada (15 dias restantes)
Dia 365: EXPIRADO - Interrupção serviço!

Ações Recomendadas:
- Dias 300-330: Planejar e executar renovação
- Dias 330-350: Renovação emergência se perdida
- Dias 350+: Resposta incidente, cert temporário

Estratégias Renovação

Estratégia 1: Automatizada (Recomendada)

# Usando certmonger (RHEL)
sudo getcert request \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -D web.example.com \
  -K host/web.example.com@REALM \
  -C "systemctl reload httpd"  # Auto-recarregar serviço

# Auto-renovação acontece em 2/3 do tempo vida cert
# cert 365 dias → renova no dia 243 (122 dias restantes)

Estratégia 2: Renovação Manual Agendada

# Job cron para verificação renovação manual
# /etc/cron.weekly/check-certificates

#!/bin/bash
# Verificar certificados expirando em 60 dias
find /etc/pki/tls/certs/ -name "*.crt" | while read cert; do
  if openssl x509 -in "$cert" -noout -checkend $((86400*60)); then
    echo "✅ $cert: OK"
  else
    echo "⚠️ $cert: Expira dentro de 60 dias!"
    # Enviar alerta
    mail -s "Certificado Expirando Em Breve: $cert" admin@example.com
  fi
done

Estratégia 3: Lembretes Calendário

# Para ambientes sem automatização
# Criar entradas calendário:
# - 90 dias antes expiração: Iniciar renovação
# - 60 dias antes: Verificar renovação em progresso
# - 30 dias antes: Completar renovação
# - 7 dias antes: Emergência se não feito

21.4 Rastreamento de metadados de certificados

Inventário Certificados

Manter inventário certificados (planilha ou banco dados):

Service,Hostname,Certificate_Path,Key_Path,Issuer,Issue_Date,Expiry_Date,SANs,Owner,Notes
Apache,web01,/etc/pki/tls/certs/web01.crt,/etc/pki/tls/private/web01.key,Internal CA,2024-01-01,2025-01-01,"web01.example.com,www.example.com",John Doe,Production
NGINX,web02,/etc/pki/tls/certs/web02.crt,/etc/pki/tls/private/web02.key,Let's Encrypt,2024-06-15,2024-09-15,"web02.example.com",Jane Smith,Staging

Script gerar inventário:

#!/bin/bash
# generate-cert-inventory.sh
# Cria inventário certificados do sistema

echo "Service,Hostname,Certificate_Path,Issuer,Issue_Date,Expiry_Date,Days_Remaining"

# Escanear localizações certificado comuns
for cert in /etc/pki/tls/certs/*.crt /etc/httpd/conf/ssl/*.crt /etc/nginx/ssl/*.crt; do
  [ -f "$cert" ] || continue

  subject=$(openssl x509 -in "$cert" -noout -subject 2>/dev/null | sed 's/subject=//')
  issuer=$(openssl x509 -in "$cert" -noout -issuer 2>/dev/null | sed 's/issuer=//')
  notbefore=$(openssl x509 -in "$cert" -noout -startdate 2>/dev/null | cut -d= -f2)
  notafter=$(openssl x509 -in "$cert" -noout -enddate 2>/dev/null | cut -d= -f2)

  # Calcular dias restantes
  expiry_epoch=$(date -d "$notafter" +%s 2>/dev/null)
  now_epoch=$(date +%s)
  days_remaining=$(( ($expiry_epoch - $now_epoch) / 86400 ))

  # Determinar serviço do caminho
  service="Unknown"
  [[ "$cert" =~ httpd ]] && service="Apache"
  [[ "$cert" =~ nginx ]] && service="NGINX"

  echo "$service,$(hostname),$cert,\"$issuer\",$notbefore,$notafter,$days_remaining"
done

21.5 Backup e Recuperação

O Que Fazer Backup

Arquivos críticos para backup:
✅ Chaves privadas (arquivos .key)
✅ Certificados (arquivos .crt)
✅ Certificados CA
✅ Cadeias certificado
✅ CSRs (para referência)
✅ Arquivos configuração (Apache ssl.conf, etc.)
⚠️ NÃO senhas ou passphrases (armazenar separadamente em vault)

Script Backup

#!/bin/bash
# backup-certificates.sh
# Faz backup de todos certificados e chaves

BACKUP_DIR="/var/backups/certificates"
DATE=$(date +%Y-%m-%d)
BACKUP_PATH="$BACKUP_DIR/$DATE"

# Criar diretório backup
mkdir -p "$BACKUP_PATH"

# Backup certificados
echo "Fazendo backup certificados..."
cp -a /etc/pki/tls/certs/*.crt "$BACKUP_PATH/" 2>/dev/null

# Backup chaves privadas (criptografadas!)
echo "Fazendo backup chaves privadas..."
tar czf - /etc/pki/tls/private/*.key 2>/dev/null | \
  openssl enc -aes-256-cbc -salt -out "$BACKUP_PATH/keys.tar.gz.enc" -pass pass:CHANGEME

# Backup arquivos configuração
echo "Fazendo backup configs..."
cp -a /etc/httpd/conf.d/ssl.conf "$BACKUP_PATH/" 2>/dev/null
cp -a /etc/nginx/nginx.conf "$BACKUP_PATH/" 2>/dev/null

# Criar inventário
ls -lh "$BACKUP_PATH"

# Definir permissões
chmod 700 "$BACKUP_PATH"

echo "✅ Backup completo: $BACKUP_PATH"
echo "⚠️ Lembrar de mudar senha criptografia!"

Procedimento Recuperação

#============================================#
# PROCEDIMENTO RECUPERAÇÃO CERTIFICADO
#============================================#

# 1. Parar serviço afetado
sudo systemctl stop httpd

# 2. Restaurar certificado
sudo cp /var/backups/certificates/2024-11-15/web.crt /etc/pki/tls/certs/

# 3. Restaurar chave privada (descriptografar)
cd /var/backups/certificates/2024-11-15/
openssl enc -aes-256-cbc -d -in keys.tar.gz.enc -pass pass:CHANGEME | \
  sudo tar xzf - -C /

# 4. Definir permissões
sudo chmod 600 /etc/pki/tls/private/*.key
sudo chmod 644 /etc/pki/tls/certs/*.crt

# 5. Verificar arquivos
sudo openssl x509 -in /etc/pki/tls/certs/web.crt -noout -text
sudo openssl rsa -in /etc/pki/tls/private/web.key -check

# 6. Iniciar serviço
sudo systemctl start httpd

# 7. Testar
curl -v https://localhost/

21.6 Melhores práticas de segurança

Proteção Chave Privada

#============================================#
# CHECKLIST SEGURANÇA CHAVE PRIVADA
#============================================#

✅ Permissões: 600 (ou 400 para proteção extra)
✅ Propriedade: root ou apenas usuário serviço
✅ Localização: /etc/pki/tls/private/ (modo 711)
✅ SELinux: Contexto apropriado (cert_t)
✅ Backup: Criptografado em repouso
✅ Nunca: Email, colar em tickets, commit no git
✅ Nunca: Compartilhar entre sistemas (gerar novo)
✅ Auditoria: Logar acesso com auditd

# Verificar segurança
ls -lZ /etc/pki/tls/private/*.key
# -rw------- root root unconfined_u:object_r:cert_t:s0 server.key

Melhores Práticas Geração Chave

#============================================#
# GERAR CHAVES SEGURAS
#============================================#

# RSA 2048 (mínimo para RHEL 8+)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

# RSA 4096 (recomendado para certs longevidade longa)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:4096

# EC P-256 (moderno, menor, rápido)
openssl genpkey -algorithm EC -out server.key -pkeyopt ec_paramgen_curve:P-256

# Definir permissões imediatamente!
chmod 600 server.key

# ❌ NUNCA fazer isto:
# openssl genrsa -out server.key 1024   # Muito fraco!
# chmod 644 server.key                  # Muito permissivo!

Validação Certificado Antes de Implantação

#!/bin/bash
# validate-certificate.sh
# Valida certificado antes de implantação

CERT=$1
KEY=$2

echo "=== Validação Certificado Pré-Implantação ==="

# Verificação 1: Arquivo certificado existe e legível
if [ ! -f "$CERT" ]; then
  echo "❌ Arquivo certificado não encontrado: $CERT"
  exit 1
fi

# Verificação 2: Chave privada existe e legível
if [ ! -f "$KEY" ]; then
  echo "❌ Chave privada não encontrada: $KEY"
  exit 1
fi

# Verificação 3: Certificado é X.509 válido
if ! openssl x509 -in "$CERT" -noout 2>/dev/null; then
  echo "❌ Certificado X.509 inválido"
  exit 1
fi

# Verificação 4: Certificado não expirou
if ! openssl x509 -in "$CERT" -noout -checkend 0; then
  echo "❌ Certificado está expirado!"
  exit 1
fi

# Verificação 5: Par certificado/chave coincide
CERT_MOD=$(openssl x509 -noout -modulus -in "$CERT" | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in "$KEY" 2>/dev/null | openssl md5)

if [ "$CERT_MOD" != "$KEY_MOD" ]; then
  echo "❌ Certificado e chave não coincidem!"
  exit 1
fi

# Verificação 6: SANs presentes (requerido para navegadores modernos)
if ! openssl x509 -in "$CERT" -noout -ext subjectAltName 2>/dev/null | grep -q "DNS:"; then
  echo "⚠️ AVISO: Nenhum Subject Alternative Name encontrado"
fi

# Verificação 7: Algoritmo assinatura forte
SIG_ALG=$(openssl x509 -in "$CERT" -noout -text | grep "Signature Algorithm" | head -2)
if echo "$SIG_ALG" | grep -qi "sha1\|md5"; then
  echo "❌ Algoritmo assinatura fraco: $SIG_ALG"
  exit 1
fi

# Verificação 8: Tamanho chave adequado
KEY_SIZE=$(openssl x509 -in "$CERT" -noout -text | grep "Public-Key:" | grep -oP '\d+')
if [ "$KEY_SIZE" -lt 2048 ]; then
  echo "❌ Tamanho chave muito pequeno: $KEY_SIZE bits (mínimo 2048)"
  exit 1
fi

echo ""
echo "✅ Validação certificado passou!"
echo "   Subject: $(openssl x509 -in "$CERT" -noout -subject)"
echo "   Issuer: $(openssl x509 -in "$CERT" -noout -issuer)"
echo "   Expires: $(openssl x509 -in "$CERT" -noout -enddate | cut -d= -f2)"
echo "   Key Size: $KEY_SIZE bits"

21.7 Coordenação Multi-Serviço

Quando Múltiplos Serviços Compartilham Certificados

# Cenário: Load balancer + múltiplos servidores web

# Problema: Certificado no LB, serviços atrás necessitam mesmo CN/SANs

# Solução 1: Usar mesmo certificado em todos (se hostnames coincidem)
# web01, web02, web03 todos usam cert para: web.example.com

# Solução 2: Certificado wildcard
# *.example.com funciona para web01.example.com, web02.example.com, etc.

# Solução 3: SANs abrangentes
# Cert único com SANs: web.example.com, web01.example.com, web02.example.com

Fluxo Trabalho Implantação Certificado

#============================================#
# IMPLANTAÇÃO MULTI-SERVIDOR
#============================================#

# Passo 1: Gerar certificado no nó gerenciamento
openssl genpkey -algorithm RSA -out web.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key web.key -out web.csr \
  -subj "/CN=web.example.com" \
  -addext "subjectAltName=DNS:web.example.com,DNS:web01.example.com,DNS:web02.example.com"

# Passo 2: Obter certificado da CA
# (submeter web.csr para CA, receber web.crt)

# Passo 3: Validar localmente
./validate-certificate.sh web.crt web.key

# Passo 4: Distribuir com segurança
for host in web01 web02 web03; do
  scp web.crt root@$host:/etc/pki/tls/certs/
  scp web.key root@$host:/etc/pki/tls/private/
  ssh root@$host "chmod 644 /etc/pki/tls/certs/web.crt"
  ssh root@$host "chmod 600 /etc/pki/tls/private/web.key"
done

# Passo 5: Recarregar serviços
for host in web01 web02 web03; do
  ssh root@$host "systemctl reload httpd"
done

# Passo 6: Testar cada servidor
for host in web01 web02 web03; do
  echo "Testando $host..."
  curl -vk https://$host/ 2>&1 | grep "subject:"
done

21.8 Padrões de documentação

Template Documentação Certificado

## Certificado: web.example.com

### Informação Básica
- **Serviço:** Apache (httpd)
- **Servidor:** web01.example.com
- **Caminho Certificado:** `/etc/pki/tls/certs/web-example-com.crt`
- **Caminho Chave:** `/etc/pki/tls/private/web-example-com.key`
- **Proprietário:** Web Team (webadmin@example.com)

### Detalhes Certificado
- **Common Name (CN):** web.example.com
- **SANs:** web.example.com, www.example.com
- **Emissor:** Internal CA (ca.example.com)
- **Data Emissão:** 2024-01-01
- **Data Expiração:** 2025-01-01
- **Tipo Chave:** RSA 2048

### Processo Renovação
- **Método:** certmonger automático
- **Janela Renovação:** 65 dias antes expiração
- **Pós-Renovação:** `systemctl reload httpd`
- **Contato:** webadmin@example.com

### Configuração Serviço
- **Arquivo Config:** `/etc/httpd/conf.d/ssl.conf`
- **Serviço:** `httpd.service`
- **Comando Restart:** `systemctl reload httpd`

### Solução de Problemas
- **Logs:** `/var/log/httpd/ssl_error_log`
- **Comando Teste:** `curl -v https://web.example.com/`
- **Problemas Comuns:** Nenhum relatado

### Histórico Mudanças
- 2024-01-01: Implantação inicial
- 2024-06-15: Adicionado SAN www.example.com

21.9 Monitoramento e Alertas

O Que Monitorar

✅ Expiração certificado (60, 30, 7 dias antes)
✅ Validade certificado (não expirado, ainda não válido)
✅ Coincidência par certificado/chave
✅ Cadeia confiança certificado
✅ Saúde serviço (está usando o cert?)
✅ Status rastreamento certmonger
✅ Sucesso/falha renovação

Script Monitoramento Simples

#!/bin/bash
# monitor-certificates.sh
# Monitoramento certificado simples

WARN_DAYS=30
CRIT_DAYS=7
EMAIL="admin@example.com"

check_cert() {
  local cert=$1
  local name=$(basename "$cert")

  # Verificar se expira dentro período aviso
  if ! openssl x509 -in "$cert" -noout -checkend $((86400*WARN_DAYS)); then
    if ! openssl x509 -in "$cert" -noout -checkend $((86400*CRIT_DAYS)); then
      echo "🚨 CRÍTICO: $name expira dentro de $CRIT_DAYS dias!"
      return 2
    else
      echo "⚠️ AVISO: $name expira dentro de $WARN_DAYS dias"
      return 1
    fi
  fi

  return 0
}

# Verificar todos certificados
WARNINGS=0
CRITICALS=0

for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue
  check_cert "$cert"
  ret=$?
  [ $ret -eq 1 ] && ((WARNINGS++))
  [ $ret -eq 2 ] && ((CRITICALS++))
done

# Alertar se problemas encontrados
if [ $CRITICALS -gt 0 ] || [ $WARNINGS -gt 0 ]; then
  echo "Problemas certificado encontrados: $CRITICALS críticos, $WARNINGS avisos" | \
    mail -s "Alerta Certificado: $(hostname)" "$EMAIL"
fi

21.10 Procedimentos de resposta a incidentes

Incidente Expiração Certificado

#============================================#
# EMERGÊNCIA CERTIFICADO EXPIRADO
#============================================#

# Passo 1: Avaliar impacto
systemctl status httpd
journalctl -xe | grep -i cert

# Passo 2: Correção rápida - Obter cert temporário
# Opção A: Autoassinado (apenas para interno!)
openssl req -x509 -nodes -days 30 -newkey rsa:2048 \
  -keyout /etc/pki/tls/private/temp.key \
  -out /etc/pki/tls/certs/temp.crt \
  -subj "/CN=$(hostname)"

# Opção B: Restaurar do backup
cp /var/backups/certificates/latest/*.crt /etc/pki/tls/certs/
cp /var/backups/certificates/latest/*.key /etc/pki/tls/private/

# Passo 3: Atualizar config serviço para usar cert temp
# Editar /etc/httpd/conf.d/ssl.conf
# SSLCertificateFile /etc/pki/tls/certs/temp.crt
# SSLCertificateKeyFile /etc/pki/tls/private/temp.key

# Passo 4: Reiniciar serviço
systemctl restart httpd

# Passo 5: Obter certificado apropriado ASAP
# Seguir processo requisição cert normal

# Passo 6: Documentar incidente
# O que aconteceu, por quê, como corrigido, prevenção

21.11 Lista de verificação de melhores práticas

## Lista de verificação de gerenciamento de certificados

### Organização de arquivos
- [ ] Estrutura diretório padrão usada
- [ ] Convenção nomenclatura consistente
- [ ] Permissões arquivo apropriadas (600 para chaves, 644 para certs)
- [ ] Contextos SELinux corretos

### Gerenciamento do ciclo de vida
- [ ] Processo renovação definido e documentado
- [ ] Lembretes renovação definidos (60, 30, 7 dias)
- [ ] Renovação automatizada se possível (certmonger)
- [ ] Ações pós-renovação definidas

### Segurança
- [ ] Chaves privadas protegidas (permissões 600)
- [ ] Chaves nunca compartilhadas/emailadas
- [ ] Algoritmo chave forte (RSA 2048+ ou EC P-256)
- [ ] Assinatura forte (SHA-256+)

### Backup
- [ ] Certificados com backup
- [ ] Chaves privadas com backup (criptografadas)
- [ ] Backup testado e validado
- [ ] Procedimento restauração documentado

### Documentação
- [ ] Inventário certificados mantido
- [ ] Cada certificado documentado
- [ ] Procedimentos escritos
- [ ] Contatos listados

### Monitoramento
- [ ] Monitoramento expiração habilitado
- [ ] Alertas configurados
- [ ] Verificações saúde em vigor
- [ ] Plano resposta incidente pronto

### Validação
- [ ] Validação pré-implantação
- [ ] Teste pós-implantação
- [ ] Auditorias regulares agendadas

21.12 Conclusões Chave

  1. Organização previne confusão - Estrutura e nomenclatura consistentes
  2. Permissões são críticas - 600 para chaves, 644 para certs
  3. Automatizar renovação - Usar certmonger sempre que possível
  4. Backup de tudo - Mas criptografar chaves privadas
  5. Documentar completamente - Seu eu futuro agradecerá
  6. Monitorar proativamente - Não esperar por expiração
  7. Validar antes implantar - Capturar problemas cedo
  8. Planejar para incidentes - Ter procedimentos recuperação prontos

Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ MELHORES PRÁTICAS CERTIFICADOS SERVIÇO                       │
├──────────────────────────────────────────────────────────────┤
│ Arquivos:   /etc/pki/tls/certs/*.crt (644)                   │
│             /etc/pki/tls/private/*.key (600)                 │
│ Nomencl:    [serviço]-[host]-[domínio].[crt|key]             │
│ Renovação:  Automatizar com certmonger                       │
│ Backup:     Diário, criptografado, testado                   │
│ Monitor:    60, 30, 7 dias antes expiração                   │
│ Validar:    Antes de cada implantação                        │
│ Document:   Tudo, todos                                      │
└──────────────────────────────────────────────────────────────┘

Navegação do Capítulo

Capítulo 22: Domínio do certmonger

Configure e Esqueça: certmonger é a ferramenta de automatização de certificados integrada do RHEL. Domine-a e você nunca renovará um certificado manualmente novamente.


22.1 O Que é certmonger?

certmonger é um daemon de rastreamento de certificados e renovação automática para RHEL.

Pense nisso como:

  • 📋 Rastreador de certificados - Monitora datas de expiração
  • 🔄 Renovador automático - Renova antes de expirar
  • 🔗 Integrador de CA - Funciona com FreeIPA, CAs locais/internas e helpers de CA externa
  • ⚙️ Integração de serviços - Executa comandos após renovação

Por Que certmonger?

Sem certmonger:

❌ Rastreamento manual de datas de expiração
❌ Lembretes de calendário para renovar
❌ Geração manual de CSR
❌ Reinício manual de serviço após renovação
❌ Risco de perder renovações → interrupções

Com certmonger:

✅ Rastreamento automático
✅ Renovação automática
✅ Recarga automática de serviço
✅ Monitoramento centralizado
✅ Sem intervenção manual!

22.2 Instalação e Configuração

Todas Versões RHEL

#============================================#
# INSTALAR CERTMONGER
#============================================#

# Instalar
sudo dnf install certmonger -y

# Habilitar e iniciar
sudo systemctl enable certmonger
sudo systemctl start certmonger

# Verificar
systemctl status certmonger
sudo getcert list  # Deveria mostrar lista vazia inicialmente

22.3 Uso Básico

Solicitando um Certificado

#============================================#
# REQUISIÇÃO CERTIFICADO BÁSICA
#============================================#

# Autoassinado (para teste)
sudo getcert request \
  -f /etc/pki/tls/certs/test.crt \
  -k /etc/pki/tls/private/test.key

# Do FreeIPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f)

# Para certificados públicos do Let's Encrypt, use certbot (Capítulo 24).
# certmonger é a escolha nativa para IPA, CA local e fluxos baseados em helpers.

Verificando Status

#============================================#
# VERIFICAR STATUS CERTIFICADO
#============================================#

# Listar todos certificados rastreados
sudo getcert list

# Verificar certificado específico por arquivo
sudo getcert list -f /etc/pki/tls/certs/web.crt

# Verificar por ID requisição
sudo getcert list -i 20240101000000

# Saída verbose
sudo getcert list -v

Valores Status:

  • MONITORING: ✅ Certificado emitido, rastreando expiração
  • SUBMITTING: 🔄 Submetendo requisição para CA
  • CA_UNREACHABLE: ❌ Não consegue alcançar servidor CA
  • CA_REJECTED: ❌ CA rejeitou requisição
  • NEED_KEY_GEN_PIN: ⏸️ Aguardando PIN (HSM/token)
  • PRE_SAVE_COMMAND: 🔄 Executando script pre-save
  • POST_SAVE_COMMAND: 🔄 Executando script post-save

22.4 Opções Avançadas

Requisição Completa com Todas Opções

#============================================#
# REQUISIÇÃO CERTMONGER COMPLETA
#============================================#

sudo ipa-getcert request \
  -f /etc/pki/tls/certs/web.example.com.crt \              # Arquivo certificado
  -k /etc/pki/tls/private/web.example.com.key \            # Arquivo chave privada
  -K HTTP/web.example.com@EXAMPLE.COM \                    # Principal Kerberos
  -D web.example.com \                                     # Nome DNS (SAN)
  -D www.example.com \                                     # SAN adicional
  -D api.example.com \                                     # Outro SAN
  -U id-kp-serverAuth \                                    # Extended key usage
  -N CN=web.example.com,O=Example,C=US \                   # Subject DN
  -g 2048 \                                                # Tamanho chave
  -G rsa \                                                 # Tipo chave
  -T caIPAserviceCert \                                    # Perfil IPA
  -C "systemctl reload httpd" \                            # Comando post-save
  -B "systemctl stop httpd" \                              # Comando pre-save
  -v \                                                     # Verbose
  -w                                                       # Aguardar conclusão

# Verificar status
sudo getcert list -f /etc/pki/tls/certs/web.example.com.crt

Opções Chave Explicadas:

OpçãoPropósitoExemplo
-fCaminho arquivo certificado/etc/pki/tls/certs/web.crt
-kCaminho arquivo chave privada/etc/pki/tls/private/web.key
-KPrincipal KerberosHTTP/web.example.com@REALM
-DDNS SANweb.example.com
-NSubject DNCN=web,O=Example
-CComando post-savesystemctl reload httpd
-BComando pre-savesystemctl stop httpd
-cNome CAIPA ou external-ca
-TPerfil certificadocaIPAserviceCert
-gTamanho chave2048 ou 4096
-GTipo chaversa ou ec

22.5 Trabalhando com CAs Diferentes

FreeIPA (Recomendado para Interno)

#============================================#
# CERTMONGER + FREEIPA
#============================================#

# Pré-requisitos: Sistema registrado no IPA
ipa-client-install

# Solicitar certificado
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.crt \
  -k /etc/pki/tls/private/internal.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f) \
  -C "systemctl reload httpd"

# certmonger automaticamente:
# ✅ Submete requisição para CA IPA
# ✅ Obtém certificado
# ✅ Salva em arquivo
# ✅ Executa comando reload
# ✅ Rastreia expiração
# ✅ Renova ~28 dias antes expiração

ACME público requer certbot

#============================================#
# ACME PÚBLICO VS FLUXOS NATIVOS DO CERTMONGER
#============================================#

# Certificado público do Let's Encrypt:
# Use certbot, não um perfil de CA falso no certmonger.
sudo certbot certonly --apache -d public.example.com

# Certificado nativo do FreeIPA / IdM:
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.crt \
  -k /etc/pki/tls/private/internal.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f) \
  -C "systemctl reload httpd"

CA Externa (Submissão Manual)

#============================================#
# CERTMONGER COM CA EXTERNA
#============================================#

# Configurar helper CA externa
sudo getcert add-ca -c external-ca \
  -e '/usr/local/bin/external-ca-submit.sh'

# Solicitar certificado
sudo getcert request \
  -c external-ca \
  -f /etc/pki/tls/certs/external.crt \
  -k /etc/pki/tls/private/external.key

# Script helper deve:
# 1. Ler CSR de stdin
# 2. Submeter para CA externa
# 3. Retornar certificado em stdout

22.6 Gerenciando Certificados Rastreados

Modificar Rastreamento

#============================================#
# MODIFICAR RASTREAMENTO CERTIFICADO EXISTENTE
#============================================#

# Atualizar comando post-save sem rekey
sudo getcert stop-tracking -f /etc/pki/tls/certs/web.crt
sudo getcert start-tracking \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -C "systemctl reload httpd"
# Re-adicione -c, -K, -D, etc. se a entrada original os usava

# Adicionar SAN adicional
sudo getcert resubmit -f /etc/pki/tls/certs/web.crt \
  -D additional.example.com

# Parar rastreamento (manter certificado)
sudo getcert stop-tracking -f /etc/pki/tls/certs/web.crt

# Remover completamente
sudo getcert stop-tracking -f /etc/pki/tls/certs/web.crt -r

# Iniciar rastreamento certificado existente
sudo getcert start-tracking \
  -f /etc/pki/tls/certs/existing.crt \
  -k /etc/pki/tls/private/existing.key

Forçar Renovação

#============================================#
# FORÇAR RENOVAÇÃO IMEDIATA
#============================================#

# Por caminho arquivo
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

# Por ID requisição
sudo getcert resubmit -i 20240101000000

# Aguardar renovação
sudo getcert list -f /etc/pki/tls/certs/web.crt
# Aguardar status: MONITORING

22.7 Timing Renovação

Entendendo Janelas Renovação

Ciclo de Vida Certificado (365 dias):

Dia   0: Certificado emitido
      │
      │ [Operação normal]
      │
Dia 243: Janela renovação inicia (certmonger tenta renovação)
      │ (2/3 do tempo vida cert: 365 × 2/3 ≈ 243 dias)
      │
      │ [Tentativas renovação a cada 8 horas se CA disponível]
      │
Dia 335: Aviso se ainda não renovado (30 dias restantes)
      │
Dia 350: Crítico se ainda não renovado (15 dias restantes)
      │
Dia 365: Certificado expira → INTERRUPÇÃO SERVIÇO se não renovado!

Comportamento Padrão:

  • Renovação inicia em 2/3 do tempo vida certificado
  • cert 365 dias → Renova no dia 243 (122 dias restantes)
  • cert 90 dias → Renova no dia 60 (30 dias restantes)

22.8 Comandos Post-Save

Reload vs Restart

#============================================#
# ESTRATÉGIAS COMANDO POST-SAVE
#============================================#

# PREFERIR: reload (sem downtime)
-C "systemctl reload httpd"
-C "systemctl reload nginx"
-C "postfix reload"

# ÀS VEZES NECESSÁRIO: restart
-C "systemctl restart slapd"  # OpenLDAP requer restart
-C "systemctl restart postgresql"  # PostgreSQL requer restart

# MÚLTIPLOS COMANDOS: Usar script
-C "/usr/local/bin/after-cert-renewal.sh"

# Exemplo script:
#!/bin/bash
# /usr/local/bin/after-cert-renewal.sh
systemctl reload httpd
systemctl reload nginx
systemctl reload postfix
logger "Certificados renovados via certmonger"

22.9 Solução de Problemas certmonger

Problemas Comuns

Problema 1: CA_UNREACHABLE

# Sintoma
sudo getcert list
# status: CA_UNREACHABLE

# Diagnóstico
# Para FreeIPA:
ipa ping  # Verificar conectividade IPA
klist  # Verificar ticket Kerberos

# Corrigir
kinit -k host/$(hostname -f)@REALM  # Renovar ticket host
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

# Verificar servidor IPA
ssh ipa-server "sudo ipactl status"

Problema 2: CA_REJECTED

# Sintoma
sudo getcert list
# status: CA_REJECTED
# ca-error: Server at https://ipa.example.com/ipa/xml unwilling to issue certificate

# Causas comuns:
# 1. Principal serviço não existe
ipa service-show HTTP/$(hostname -f)
# Se não encontrado:
ipa service-add HTTP/$(hostname -f)

# 2. Host não registrado
ipa host-show $(hostname -f)

# 3. Problema permissão
# Verificar permissões IPA

# Retentar
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

Problema 3: Renovação Não Acontecendo

# Verificar certmonger está rodando
systemctl status certmonger

# Verificar status certificado
sudo getcert list -f /etc/pki/tls/certs/web.crt

# Verificar logs certmonger
sudo journalctl -u certmonger -f

# Forçar renovação
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

# Verificar janela renovação
# Certificado renova em 2/3 do tempo vida
# Verificar data "expires" na saída getcert list

22.10 IdM ACME vs Let’s Encrypt público

Mantenha os fluxos separados

#============================================#
# ESCOLHA A FERRAMENTA CERTA PARA A CA CERTA
#============================================#

# Certificado público do Let's Encrypt:
# Use certbot (veja o Capítulo 24).
sudo certbot certonly --apache -d public.example.com -d www.public.example.com

# Certificado nativo do FreeIPA / IdM:
# Use certmonger + ipa-getcert.
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.example.com.crt \
  -k /etc/pki/tls/private/internal.example.com.key \
  -K HTTP/internal.example.com@REALM \
  -D internal.example.com \
  -C "systemctl reload httpd"

# Se o IdM ACME estiver habilitado, o diretório ACME dele é o seu servidor IPA,
# não o Let's Encrypt:
sudo certbot certonly \
  --server https://ipa.example.com/acme/directory \
  -d host.example.com

Distinção importante:

  • Let’s Encrypt = CA ACME pública da internet
  • IdM/FreeIPA ACME = sua CA IPA interna expondo um endpoint ACME
  • certmonger = rastreador/renovador nativo do RHEL para IPA e fluxos baseados em helpers

22.11 Monitorando certmonger

Monitoramento Status

#============================================#
# MONITORAR CERTMONGER
#============================================#

# Visão geral de todos certificados
sudo getcert list

# Contar certificados por status
sudo getcert list | grep "status:" | sort | uniq -c

# Encontrar certificados expirando em breve (30 dias)
for cert in $(sudo getcert list | grep "certificate:" | sed -n "s/.*location='\\([^']*\\)'.*/\\1/p"); do
  if ! openssl x509 -in "$cert" -noout -checkend $((86400*30)) 2>/dev/null; then
    echo "⚠️ Expira em breve: $cert"
  fi
done

# Verificar logs certmonger
sudo journalctl -u certmonger --since today

# Observar por atividade renovação
sudo journalctl -u certmonger -f

# Verificar próximo tempo renovação
sudo getcert list | grep -A15 "Request ID" | grep "expires"

Script Verificação Saúde

#!/bin/bash
# certmonger-health-check.sh

echo "=== Verificação Saúde certmonger ==="

# certmonger rodando?
if systemctl is-active --quiet certmonger; then
  echo "✅ certmonger está rodando"
else
  echo "❌ certmonger NÃO está rodando!"
  exit 1
fi

# Contar certificados rastreados
TOTAL=$(sudo getcert list | grep -c "Request ID")
echo "📋 Rastreando $TOTAL certificados"

# Verificar breakdown status
echo ""
echo "Breakdown status:"
sudo getcert list | grep "status:" | sort | uniq -c

# Verificar por problemas
PROBLEMS=$(sudo getcert list | grep "status:" | grep -v "MONITORING" | wc -l)
if [ $PROBLEMS -gt 0 ]; then
  echo ""
  echo "⚠️ $PROBLEMS certificados necessitam atenção:"
  sudo getcert list | grep -B5 "status:" | grep -E "(Request ID|status:)" | grep -v "MONITORING"
fi

# Verificar avisos expiração
echo ""
echo "Certificados expirando em 30 dias:"
sudo getcert list | grep -A10 "Request ID" | grep "expires:" | \
  while read line; do
    # Analisar e verificar expiração
    # (simplificado - script produção analisaria datas apropriadamente)
    echo "$line"
  done

22.12 Configuração certmonger

Arquivo Configuração Principal

#============================================#
# CONFIGURAÇÃO CERTMONGER
#============================================#

# Localização config
/etc/certmonger/certmonger.conf

# Localização banco dados (certificados rastreados)
/var/lib/certmonger/

# Listar CAs configuradas
sudo getcert list-cas

# Adicionar CA customizada
sudo getcert add-ca -c my-ca \
  -e '/usr/local/bin/my-ca-submit.sh'

# Remover CA
sudo getcert remove-ca -c my-ca

22.13 Melhores Práticas

Melhores Práticas certmonger

✅ **Sempre usar comandos post-save** (flag -C) para recarregar serviços
✅ **Rastrear todos certificados produção** com certmonger
✅ **Monitorar status semanalmente** com `getcert list`
✅ **Testar renovação** antes expiração com `resubmit`
✅ **Usar modo verbose** (-v) ao fazer solução de problemas
✅ **Configurar monitoramento** para status CA_UNREACHABLE
✅ **Documentar IDs requisição** em seu inventário certificados
✅ **Usar IPA/certmonger para certificados internos** e certbot para Let's Encrypt público
✅ **Manter logs certmonger** para trilha auditoria
✅ **Testar comandos post-save** independentemente antes uso

O Que Rastrear com certmonger

# ✅ RASTREAR com certmonger:
- Certificados servidor web (Apache, NGINX)
- Certificados servidor email (Postfix, Dovecot)
- Certificados servidor LDAP (OpenLDAP)
- Certificados aplicação (APIs, microserviços)
- Certificados serviço (qualquer serviço TLS-habilitado)

# ❌ NÃO rastrear com certmonger:
- Certificados raiz CA (gerenciados separadamente)
- Certificados cliente para usuários (ciclo vida diferente)
- Certificados teste/temporários
- Certificados que você gerencia com outras ferramentas (certbot)

22.14 certmonger vs certbot

Quando Usar Qual?

Recursocertmongercertbot
RHEL Nativo✅ Sim (incluído)❌ Não (EPEL requerido)
Suporte FreeIPA✅ Nativo❌ Não
Let’s Encrypt ACME público❌ Use certbot em vez disso✅ Sim (todas as versões)
CA Interna✅ Excelente❌ Não
Config Apache/NGINX⏸️ Manual✅ Automática
Integração Serviço✅ Comandos post-save⏸️ Limitada
Timing Renovação2/3 do tempo vida30 dias antes
Suporte Red Hat✅ Sim❌ Não (EPEL)

Recomendação:

  • Interno/Empresarial: Usar certmonger + FreeIPA
  • Público/Simples: Usar certbot (mas saber que requer EPEL)
  • Certificados públicos em qualquer versão do RHEL: use certbot para Let’s Encrypt

22.15 Cenários Avançados

Cenário 1: Renovação Certificado Alta Disponibilidade

# Múltiplos servidores com mesmo serviço

# Servidor 1:
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/shared-service.crt \
  -k /etc/pki/tls/private/shared-service.key \
  -K HTTP/service.example.com@REALM \
  -D service.example.com \
  -C "systemctl reload httpd"

# Servidor 2: Mesma configuração
# Resultado: Cada servidor gerencia seu próprio cert independentemente
# Ou: Usar cert compartilhado (copiar arquivos, não recomendado)

Cenário 2: Certificado Wildcard

# Solicitar wildcard do FreeIPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/wildcard.crt \
  -k /etc/pki/tls/private/wildcard.key \
  -K HTTP/*.example.com@REALM \
  -D *.example.com \
  -D example.com \
  -C "/usr/local/bin/reload-all-services.sh"

Cenário 3: Chaves EC (Elliptic Curve)

# Solicitar com chave EC
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/ec-cert.crt \
  -k /etc/pki/tls/private/ec-cert.key \
  -K HTTP/$(hostname -f)@REALM \
  -G ec \
  -g nistp256  # ou nistp384, nistp521

22.16 Conclusões Chave

  1. certmonger é a automatização de certificados do RHEL
  2. Configure e esqueça - Renovação automática
  3. Funciona melhor com FreeIPA, CAs internas e renovações baseadas em helpers
  4. Comandos pós-salvamento recarregam serviços automaticamente
  5. Rastreia expiração e renova a 2/3 do tempo de vida
  6. Status MONITORING significa que tudo está bem
  7. getcert list é sua principal ferramenta de monitoramento

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA DO CERTMONGER                                  │
├──────────────────────────────────────────────────────────────────┤
│ Instalar:        dnf install certmonger                          │
│ Iniciar:         systemctl enable --now certmonger               │
│                                                                  │
│ Solicitar:       getcert request -f cert -k key -c <CA>          │
│ Solicitar (IPA): ipa-getcert request -f cert -k key -K principal │
│ Listar:          getcert list                                    │
│ Status:          getcert list -f /path/to/cert.crt               │
│ Reenviar:        getcert resubmit -f /path/to/cert.crt           │
│ Parar rastreio:  getcert stop-tracking -f /path/to/cert.crt      │
│                                                                  │
│ Status:          MONITORING = ✅ Bom                             │
│                  CA_UNREACHABLE = ❌ Verificar IPA/CA            │
│                  CA_REJECTED = ❌ Verificar principal/permissões │
│                                                                  │
│ Logs:            journalctl -u certmonger -f                     │
│ Renovação:       Automática a 2/3 do tempo de vida do cert       │
│ Pós-save:        -C "systemctl reload <serviço>"                 │
└──────────────────────────────────────────────────────────────────┘

✅ Ferramenta nativa RHEL (suportada Red Hat)
✅ Perfeita para integração FreeIPA
✅ Melhor encaixe para FreeIPA e fluxos de renovação com rastreamento

🧪 Laboratório Prático

Lab 11: Fundamentos do certmonger

Automatize renovação de certificados com certmonger

  • 📁 Localização: labs/pt_BR/11-certmonger-basics/
  • ⏱️ Tempo: 30-35 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 23: Mergulho Profundo em Crypto-Policies

Recurso Revolucionário: Crypto-policies RHEL 8+ fornecem configuração criptográfica system-wide. Domine isto e você controlará segurança em todas aplicações com um comando.


23.1 O Problema que crypto-policies Resolvem

Antes das Crypto-Policies (RHEL 7)

Configurar segurança individualmente para CADA aplicação:

Apache:      /etc/httpd/conf.d/ssl.conf
             SSLProtocol, SSLCipherSuite

NGINX:       /etc/nginx/nginx.conf
             ssl_protocols, ssl_ciphers

Postfix:     /etc/postfix/main.cf
             smtpd_tls_protocols, smtpd_tls_mandatory_ciphers

OpenLDAP:    olcTLSProtocolMin, olcTLSCipherSuite

PostgreSQL:  ssl_min_protocol_version

OpenSSH:     /etc/ssh/sshd_config
             Ciphers, MACs, KexAlgorithms

... e mais de 20 aplicações!

Resultado: Segurança inconsistente, pesadelo de configuração

Após Crypto-Policies (RHEL 8/9/10)

✅ Definir UMA política system-wide
✅ Todas aplicações automaticamente cumprem
✅ Segurança consistente em todo sistema
✅ Mudar política em segundos, não horas

Mudança radical para gerenciamento empresarial!


23.2 Como Crypto-Policies Funcionam

Arquitetura

┌──────────────────────────────────────────────────┐
│       update-crypto-policies --set DEFAULT       │
│              (Comando administrador)             │
└───────────────────────┬──────────────────────────┘
                        │
                        ▼
┌──────────────────────────────────────────────────┐
│  /etc/crypto-policies/back-ends/                 │
│  (Arquivos config gerados para cada biblioteca)  │
│  ├─ opensslcnf.config                            │
│  ├─ gnutls.config                                │
│  ├─ nss.config                                   │
│  ├─ bind.config                                  │
│  └─ ... mais ...                                 │
└───────────────────────┬──────────────────────────┘
                        │
            ┌───────────┼───────────┐
            ▼           ▼           ▼
         OpenSSL     GnuTLS        NSS
            ↓           ↓           ↓
         Apache      NGINX       Firefox
         Postfix     vsftpd      Thunderbird
         OpenSSH     wget        Java apps

Insight Chave: Aplicações leem de arquivos back-end, não diretamente da política!


23.3 As Quatro Políticas Principais

Comparação Políticas

PolíticaVersões TLSRSA MínSHA-13DESDH MínCaso de Uso
DEFAULT1.2, 1.320482048✅ Recomendado
LEGACY1.0+1024⚠️⚠️1024Apenas compatibilidade
FUTURE1.2, 1.330723072Alta segurança
FIPS1.2, 1.320482048Conformidade federal

Detalhes Política DEFAULT

# Segurança e compatibilidade balanceadas
Protocolos:
  - TLS 1.2
  - TLS 1.3

Tamanhos Chave Mínimos:
  - RSA: 2048 bits
  - DH: 2048 bits
  - ECC: secp256r1 (P-256)

Cifras Permitidas:
  - AES-128-GCM
  - AES-256-GCM
  - ChaCha20-Poly1305
  - AES-128-CBC
  - AES-256-CBC

Algoritmos Assinatura:
  - SHA-256
  - SHA-384
  - SHA-512

Bloqueados:
  - TLS 1.0, 1.1
  - MD5
  - Assinaturas SHA-1
  - 3DES, RC4, DES
  - RSA < 2048 bits
  - Cifras export

23.4 Visualizando e Mudando Políticas

Comandos Básicos

#============================================#
# OPERAÇÕES BÁSICAS CRYPTO-POLICY
#============================================#

# Ver política atual
update-crypto-policies --show
# Saída: DEFAULT

# Listar políticas disponíveis
ls /usr/share/crypto-policies/policies/
# DEFAULT.pol  FUTURE.pol  LEGACY.pol  FIPS.pol

# Definir política
sudo update-crypto-policies --set FUTURE

# Você DEVE reiniciar serviços para mudanças surtirem efeito!
sudo systemctl restart httpd nginx postfix slapd

# Ou reiniciar (garante que tudo pega as mudanças)
sudo reboot

O Que Acontece Quando Você Muda Política

#============================================#
# POR TRÁS DAS CENAS
#============================================#

# Antes
update-crypto-policies --show
# DEFAULT

# Mudar
sudo update-crypto-policies --set FUTURE

# Atualizações geradas:
ls -l /etc/crypto-policies/back-ends/
# -rw-r--r--. opensslcnf.config    ← Atualizado!
# -rw-r--r--. gnutls.config        ← Atualizado!
# -rw-r--r--. nss.config           ← Atualizado!
# -rw-r--r--. bind.config          ← Atualizado!
# ... todos back-ends atualizados ...

# Ver config OpenSSL
cat /etc/crypto-policies/back-ends/opensslcnf.config
# Mostra configuração OpenSSL real aplicada

23.5 Subpolíticas (RHEL 9+)

Modificadores Política

RHEL 9 introduziu subpolíticas - ajuste fino políticas existentes!

#============================================#
# SUBPOLÍTICAS CRYPTO-POLICY (RHEL 9+)
#============================================#

# Política base com modificador
sudo update-crypto-policies --set DEFAULT:NO-SHA1

# Múltiplos modificadores
sudo update-crypto-policies --set DEFAULT:NO-SHA1:GOST

# Módulos subpolítica disponíveis
ls /usr/share/crypto-policies/policies/modules/
# AD-SUPPORT.pmod
# GOST.pmod
# NO-CAMELLIA.pmod
# NO-SHA1.pmod
# NO-ENFORCE-EMS.pmod
# ...e mais

# Ver detalhes módulo
cat /usr/share/crypto-policies/policies/modules/NO-SHA1.pmod

Subpolíticas Comuns:

SubpolíticaEfeitoCaso de Uso
NO-SHA1Desabilitar completamente SHA-1Segurança extra
AD-SUPPORTHabilitar compatibilidade ADWindows/Linux misto
GOSTHabilitar algoritmos GOSTRequisitos russos
NO-CAMELLIADesabilitar cifra CamelliaConformidade específica
NO-ENFORCE-EMSDesabilitar Extended Master SecretCompatibilidade

23.6 Criando Módulos Política Customizados

Exemplo Módulo Customizado

#============================================#
# CRIAR MÓDULO POLÍTICA CUSTOMIZADO
#============================================#

# Criar módulo customizado
sudo vi /etc/crypto-policies/policies/modules/CUSTOM-SECURITY.pmod

# Conteúdo exemplo:
min_rsa_size = 4096
min_dh_size = 3072
min_dsa_size = 3072
sha1_in_certs = 0
arbitrary_dh_groups = 0
ssh_certs = 0

# Aplicar
sudo update-crypto-policies --set DEFAULT:CUSTOM-SECURITY

# Reiniciar serviços
sudo systemctl restart httpd nginx postfix

# Verificar
openssl ciphers -v | grep -E "RSA|DH"

23.7 Overrides Por Aplicação

Quando Sobrescrever

Às vezes UMA aplicação necessita configurações diferentes da política sistema:

Exemplo: Aplicação legada necessita TLS 1.1, mas sistema usa DEFAULT

Override Apache

#============================================#
# OVERRIDE CRYPTO-POLICY APACHE
#============================================#

# /etc/httpd/conf.d/ssl.conf

# Opção 1: Incluir crypto-policy, então sobrescrever
Include /etc/crypto-policies/back-ends/httpd.config

# Então adicionar overrides:
SSLProtocol all -SSLv3  # Re-habilitar TLS 1.0/1.1

# Opção 2: Optar completamente por fora
# Não incluir arquivo crypto-policy
# Configurar manualmente tudo:
SSLProtocol TLSv1.1 TLSv1.2 TLSv1.3
SSLCipherSuite HIGH:!aNULL:!MD5

# ⚠️ Aviso: Você agora gerencia TLS Apache manualmente
# Mudanças crypto-policy sistema não afetarão Apache

Melhor Abordagem: Criar módulo política customizado em vez de overrides por app!


23.8 Testando Impacto Política

Antes de Mudar Política

#============================================#
# TESTAR IMPACTO MUDANÇA POLÍTICA
#============================================#

# 1. Documentar estado atual
update-crypto-policies --show > /tmp/current-policy.txt
systemctl list-units --type=service --state=running > /tmp/running-services.txt

# 2. Testar aplicações
curl https://localhost/
psql -h localhost  # etc.

# 3. Mudar política em sistema teste primeiro
sudo update-crypto-policies --set FUTURE

# 4. Reiniciar serviços
sudo systemctl restart httpd nginx postfix

# 5. Testar completamente
./test-all-services.sh

# 6. Se problemas: Reverter
sudo update-crypto-policies --set DEFAULT

# 7. Se bem-sucedido: Documentar e implantar em produção

23.9 Impacto Política em Certificados

O Que Políticas Controlam

Crypto-policies afetam:

  • ✅ Versões protocolo TLS permitidas
  • ✅ Suites cifra disponíveis
  • ✅ Tamanhos chave mínimos aceitos
  • ✅ Algoritmos assinatura permitidos
  • ✅ Parâmetros Diffie-Hellman
  • ✅ Rigor validação certificado

Crypto-policies NÃO afetam:

  • ❌ Quais certificados usar (ainda configurado por serviço)
  • ❌ Localizações arquivo certificado
  • ❌ CA repositório de confiança (isso é update-ca-trust)
  • ❌ Emissão certificado

Matriz Compatibilidade Certificado

Tipo CertificadoDEFAULTLEGACYFUTUREFIPS
RSA 1024 bit⚠️
RSA 2048 bit
RSA 3072 bit
RSA 4096 bit
EC P-256
EC P-384
Assinatura SHA-1⚠️
Assinatura SHA-256

23.10 Solução de Problemas Crypto-Policies

Problemas Comuns

Problema 1: Aplicação Falha Após Mudança Política

# Sintoma
sudo update-crypto-policies --set FUTURE
sudo systemctl restart httpd
# httpd falha ao iniciar

# Diagnóstico
sudo journalctl -xe -u httpd | grep -i cipher

# Causa comum: Aplicação tem cifras fracas codificadas

# Solução 1: Reverter política
sudo update-crypto-policies --set DEFAULT

# Solução 2: Atualizar config aplicação
# Remover especificações cipher codificadas

# Solução 3: Criar módulo política customizado

Problema 2: “No Shared Cipher”

# Sintoma: Clientes não conseguem conectar

# Testar
openssl s_client -connect server:443

# Se mostra "no shared cipher":

# Verificar política
update-crypto-policies --show

# Testar capacidades cliente
openssl s_client -connect server:443 -cipher 'ALL' -tls1_2

# Correção temporária (não recomendado longo prazo):
sudo update-crypto-policies --set LEGACY

# Correção apropriada: Atualizar cliente para suportar TLS 1.2+ e cifras modernas

Problema 3: Política Não Parece Aplicar

# Verificar se aplicação está sobrescrevendo política

# Apache
grep -r "SSLProtocol\|SSLCipherSuite" /etc/httpd/
# Se encontrado: App está sobrescrevendo política

# NGINX
grep -r "ssl_protocols\|ssl_ciphers" /etc/nginx/
# Se encontrado: App está sobrescrevendo política

# Solução: Remover overrides, deixar crypto-policy lidar com isso
# Ou: Documentar por que override é necessário

23.11 Melhores Práticas

Recomendações

✅ **Usar política DEFAULT** para maioria ambientes
✅ **Testar antes de implantar** novas políticas
✅ **Documentar escolhas política** e razões
✅ **Reiniciar serviços** após mudanças política
✅ **Evitar overrides por app** quando possível
✅ **Usar subpolíticas** (RHEL 9+) para ajuste fino
✅ **Monitorar por compatibilidade** problemas
✅ **Manter LEGACY temporária** se usada
✅ **Planejar migrações** ao mudar políticas
✅ **Atualizar clientes** em vez de enfraquecer política

Quando Usar Cada Política

DEFAULT:

  • ✅ Maioria ambientes produção
  • ✅ Segurança/compatibilidade balanceadas
  • ✅ Ponto inicial recomendado
  • ✅ Testada e mantida pela Red Hat

LEGACY:

  • ⚠️ Temporária apenas durante migrações!
  • ⚠️ Suportando clientes muito antigos
  • ⚠️ Testando problemas compatibilidade
  • ❌ Nunca longo prazo!

FUTURE:

  • ✅ Ambientes alta segurança
  • ✅ Todos clientes são modernos
  • ✅ Quer configurações mais fortes
  • ✅ Planejando para padrões futuros

FIPS:

  • ✅ Conformidade federal requerida
  • ✅ Contratos governo
  • ✅ Indústrias regulamentadas
  • ✅ Requisitos certificação

23.12 Mergulho Profundo Política FIPS

Habilitando Modo FIPS

#============================================#
# HABILITAR MODO FIPS
#============================================#

# Verificar status atual
fips-mode-setup --check
# FIPS mode is disabled.

# Habilitar modo FIPS
sudo fips-mode-setup --enable

# DEVE reiniciar
sudo reboot

# Verificar após reboot
fips-mode-setup --check
# FIPS mode is enabled.

# Crypto-policy automaticamente definida para FIPS
update-crypto-policies --show
# FIPS

Requisitos Modo FIPS:

  • Deve ser habilitado na instalação OU com fips-mode-setup
  • Requer reboot
  • Afeta sistema inteiro
  • Apenas algoritmos aprovados FIPS disponíveis
  • Impacto desempenho (~10-20% mais lento)

Especificações Política FIPS

# O que política FIPS permite:
✅ TLS 1.2, 1.3
✅ RSA 2048+ bits
✅ AES-128, AES-256 (modo GCM)
✅ SHA-256, SHA-384, SHA-512
✅ Troca chave ECDHE

# O que FIPS bloqueia:
❌ TLS 1.0, 1.1
❌ RSA < 2048 bits
❌ 3DES, RC4, DES
❌ MD5, SHA-1
❌ Algoritmos não aprovados
❌ Cifras modo CBC (em alguns casos)

23.13 Monitoramento e Auditoria

Verificar Conformidade Política

#============================================#
# VERIFICAR CONFORMIDADE CRYPTO-POLICY
#============================================#

# Política atual
update-crypto-policies --show

# Quais aplicações usam crypto-policies?
ls -l /etc/crypto-policies/back-ends/

# Verificar OpenSSL segue política
openssl ciphers -v | head -20

# Verificar config aplicação específica
# Apache
cat /etc/crypto-policies/back-ends/httpd.config

# Testar conexão real
openssl s_client -connect localhost:443 -tls1_3

# Verificar sem overrides
grep -r "SSLProtocol\|SSLCipherSuite" /etc/httpd/ | grep -v crypto-policies
# Deveria estar vazio ou comentado

23.14 Fluxo Trabalho Solução de Problemas

Abordagem Sistemática

Aplicação falha após mudança política?
    │
    ├─ Passo 1: Identificar erro
    │   └─ Verificar logs: journalctl -xe
    │
    ├─ Passo 2: Verificar política ativa
    │   └─ update-crypto-policies --show
    │
    ├─ Passo 3: Testar com LEGACY
    │   └─ sudo update-crypto-policies --set LEGACY
    │   └─ Se funciona → problema cipher/protocolo
    │
    ├─ Passo 4: Identificar incompatibilidade
    │   └─ openssl s_client -cipher 'ALL' -tls1
    │   └─ Descobrir o que cliente/servidor necessita
    │
    ├─ Passo 5: Escolher solução
    │   ├─ A) Atualizar cliente (melhor)
    │   ├─ B) Criar módulo customizado (bom)
    │   └─ C) Override por app (último recurso)
    │
    └─ Passo 6: Documentar e implantar
        └─ Por que override necessário, plano para remover

23.15 Conclusões Chave

  1. Crypto-policies são apenas RHEL 8+ (não no RHEL 7)
  2. Política DEFAULT é recomendada para maioria casos
  3. Mudanças requerem restarts serviço para surtir efeito
  4. Afeta TODAS aplicações crypto system-wide
  5. Subpolíticas fornecem ajuste fino (RHEL 9+)
  6. Evitar overrides por app quando possível
  7. Testar antes de implantar novas políticas
  8. LEGACY é apenas temporária!

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CRYPTO-POLICIES                            │
├──────────────────────────────────────────────────────────────┤
│ Disponível:   Apenas RHEL 8, 9, 10 (não RHEL 7)              │
│                                                              │
│ Ver:          update-crypto-policies --show                  │
│ Definir:      sudo update-crypto-policies --set <POLÍTICA>   │
│ Políticas:    DEFAULT, LEGACY, FUTURE, FIPS                  │
│                                                              │
│ Subpolítica:  update-crypto-policies --set DEFAULT:NO-SHA1   │
│               (apenas RHEL 9+)                               │
│                                                              │
│ Back-ends:    /etc/crypto-policies/back-ends/                │
│ Módulos:      /usr/share/crypto-policies/policies/modules/   │
│                                                              │
│ Após mudança: systemctl restart <serviços>                   │
│               OU reboot                                      │
│                                                              │
│ DEFAULT:      TLS 1.2+, RSA 2048+, Sem SHA-1                 │
│ LEGACY:       TLS 1.0+, permite fracos (apenas temporário!)  │
│ FUTURE:       TLS 1.2+, RSA 3072+, mais restritiva           │
│ FIPS:         Conformidade federal (requer modo FIPS)        │
└──────────────────────────────────────────────────────────────┘

⚠️ RHEL 7 não tem crypto-policies (apenas config manual)
✅ DEFAULT funciona para 95% dos ambientes

🧪 Laboratório Prático

Lab 12: Crypto-Policies

Entenda e configure crypto-policies em todo o sistema

  • 📁 Localização: labs/pt_BR/12-crypto-policies/
  • ⏱️ Tempo: 25-30 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 24: Let’s Encrypt e certbot

Certificados Públicos Gratuitos: Let’s Encrypt fornece certificados gratuitos e automatizados para websites públicos. Aprenda como usá-lo no RHEL com certbot.


24.1 O Que é Let’s Encrypt?

Let’s Encrypt é uma autoridade certificadora (CA) gratuita, automatizada e aberta.

Recursos Chave:

  • Certificados gratuitos (sem custo)
  • Emissão automatizada (via protocolo ACME)
  • Auto-renovação (a cada 60-90 dias)
  • Amplamente confiável (em todos navegadores principais)
  • Validação domínio (certificados DV)

Limitações:

  • Apenas domínios públicos (deve ser acessível pela internet para validação)
  • Validade 90 dias (curta vida, requer automatização)
  • Apenas Domain Validation (sem Organization ou Extended Validation)
  • Sem wildcard com HTTP-01 (requer desafio DNS-01)

24.2 Let’s Encrypt no RHEL: ACME público e alternativas nativas

Método 1: certbot (Tradicional)

⚠️ CRÍTICO: EPEL Requerido

certbot NÃO está disponível nos repositórios oficiais RHEL.

Requer EPEL (Extra Packages for Enterprise Linux), um repositório mantido pela comunidade que NÃO é oficialmente suportado pela Red Hat.

Para Ambientes Produção Empresarial:

  • Considere FreeIPA com certmonger (Capítulo 19)
  • Ou CA comercial com certmonger (Capítulo 22)
  • Ou gerenciamento certificado manual

EPEL é adequado para:

  • Ambientes desenvolvimento/teste
  • Implantações pequenas onde risco EPEL é aceitável
  • Situações onde certificados gratuitos superam preocupações suporte

Ferramenta certbot:

  • Automatização completa
  • Plugins Apache/NGINX
  • Configuração automática
  • Timers renovação
  • ⚠️ Requer EPEL

Método 2: certmonger para CAs internas/privadas

Solução RHEL Nativa:

  • ✅ Sem necessidade EPEL
  • ✅ Suportado Red Hat
  • ✅ Melhor encaixe para fluxos de FreeIPA / IdM e CA local
  • ⏸️ Configuração manual do servidor web (sem plugins Apache/NGINX)
  • ❌ Não é substituto direto do certbot para o Let’s Encrypt público

Usaremos certbot para o Let’s Encrypt público e certmonger para fluxos internos nativos.


24.3 Instalação certbot

RHEL 7

#============================================#
# INSTALAR CERTBOT NO RHEL 7 (REQUER EPEL!)
#============================================#

# ⚠️ AVISO: Habilitando repositório terceiros

# Passo 1: Habilitar EPEL
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y

# Verificar EPEL habilitado
yum repolist | grep epel

# Passo 2: Instalar certbot
sudo yum install certbot python2-certbot-apache python2-certbot-nginx -y

# Verificar
certbot --version

RHEL 8

#============================================#
# INSTALAR CERTBOT NO RHEL 8 (REQUER EPEL!)
#============================================#

# ⚠️ AVISO: Habilitando repositório terceiros

# Passo 1: Habilitar EPEL
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y

# Ou se você tem subscription:
sudo dnf install epel-release -y

# Passo 2: Instalar certbot
sudo dnf install certbot python3-certbot-apache python3-certbot-nginx -y

# Verificar
certbot --version

RHEL 9/10

#============================================#
# INSTALAR CERTBOT NO RHEL 9/10 (REQUER EPEL!)
#============================================#

# ⚠️ AVISO: Habilitando repositório terceiros

# Passo 1: Habilitar EPEL
sudo dnf install epel-release -y

# Passo 2: Instalar certbot
sudo dnf install certbot python3-certbot-apache python3-certbot-nginx -y

# Verificar
certbot --version

Lembrar: EPEL é suportado pela comunidade. Para produção empresarial, considere FreeIPA + certmonger (solução RHEL nativa).


24.4 Uso certbot - Apache

Configuração Apache Automática

#============================================#
# CERTBOT COM APACHE (AUTOMATIZADO!)
#============================================#

# Pré-requisitos:
# - Apache instalado e rodando
# - Porta 80 acessível da internet
# - Domínio resolve para este servidor
# - Repositório EPEL habilitado

# Obter certificado e auto-configurar Apache
sudo certbot --apache -d www.example.com -d example.com

# certbot vai:
# 1. Gerar certificado do Let's Encrypt
# 2. Configurar automaticamente SSL Apache
# 3. Configurar redirect HTTP→HTTPS
# 4. Configurar auto-renovação

# Prompts interativos:
# - Endereço email (para avisos renovação)
# - Concordar com ToS
# - Redirecionar HTTP para HTTPS? (escolher yes)

# Não-interativo (automatização):
sudo certbot --apache \
  -d www.example.com \
  -d example.com \
  --non-interactive \
  --agree-tos \
  --email admin@example.com \
  --redirect

# Localização certificado:
# /etc/letsencrypt/live/www.example.com/fullchain.pem
# /etc/letsencrypt/live/www.example.com/privkey.pem

24.5 Uso certbot - NGINX

Configuração NGINX Automática

#============================================#
# CERTBOT COM NGINX (AUTOMATIZADO!)
#============================================#

# Pré-requisitos:
# - NGINX instalado e rodando
# - Porta 80 acessível
# - Domínio resolve para servidor

# Obter e configurar
sudo certbot --nginx -d api.example.com

# Não-interativo
sudo certbot --nginx \
  -d api.example.com \
  --non-interactive \
  --agree-tos \
  --email admin@example.com \
  --redirect

# certbot atualiza config NGINX automaticamente!
# Nenhuma configuração SSL manual necessária

24.6 Modo Manual certbot (Standalone)

Sem Plugin Servidor Web

#============================================#
# CERTBOT STANDALONE (SEM PLUGIN)
#============================================#

# Usar quando:
# - Servidor web não é Apache/NGINX
# - Quer controle manual sobre config
# - Usando servidor web customizado

# Obter apenas certificado (não configura servidor)
sudo certbot certonly --standalone \
  -d app.example.com \
  --non-interactive \
  --agree-tos \
  --email admin@example.com

# Certificado salvo em:
# /etc/letsencrypt/live/app.example.com/fullchain.pem
# /etc/letsencrypt/live/app.example.com/privkey.pem

# Configurar manualmente seu serviço para usá-lo
# Exemplo Apache:
# SSLCertificateFile /etc/letsencrypt/live/app.example.com/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/app.example.com/privkey.pem

24.7 Renovação

Renovação Automática

#============================================#
# AUTO-RENOVAÇÃO CERTBOT
#============================================#

# certbot automaticamente configura timer renovação
systemctl list-timers | grep certbot
# Deveria mostrar: certbot-renew.timer

# Ver detalhes timer
systemctl status certbot-renew.timer

# Testar renovação (dry run - não renova realmente)
sudo certbot renew --dry-run

# Forçar renovação real (se necessário)
sudo certbot renew --force-renewal

# Verificar expiração certificado
sudo certbot certificates

# Renovação executa duas vezes diariamente
# Renova certificados expirando dentro de 30 dias

Hooks Renovação

#============================================#
# HOOKS RENOVAÇÃO (COMANDOS DEPLOY)
#============================================#

# Adicionar hook para recarregar serviço após renovação
sudo certbot renew --deploy-hook "systemctl reload nginx"

# Ou criar script hook
sudo vi /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh

#!/bin/bash
systemctl reload httpd
systemctl reload nginx
systemctl reload postfix

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh

# Hooks em /etc/letsencrypt/renewal-hooks/:
# - pre/: Executar antes renovação
# - post/: Executar após renovação (mesmo se falhou)
# - deploy/: Executar apenas após renovação bem-sucedida

24.8 Certificados Wildcard

Desafio DNS-01 Requerido

#============================================#
# CERTIFICADO WILDCARD (DESAFIO DNS)
#============================================#

# Wildcard requer desafio DNS-01
# (não pode usar HTTP-01 para *.example.com)

# Desafio DNS manual
sudo certbot certonly --manual \
  --preferred-challenges dns \
  -d "*.example.com" \
  -d "example.com"

# certbot vai pedir para:
# 1. Criar registro TXT no DNS
# 2. Aguardar propagação
# 3. Pressionar Enter para continuar

# Automatização DNS com plugins (se disponível)
# sudo certbot certonly --dns-route53 -d "*.example.com"
# (requer plugin provedor DNS)

24.9 Onde o certmonger se encaixa

Use certmonger para fluxos de CA interna ou privada

#============================================#
# CERTMONGER PARA FLUXOS IPA / CA INTERNA
#============================================#

# Instalar certmonger (incluído no RHEL)
sudo dnf install certmonger -y
sudo systemctl enable --now certmonger

# Solicitar um certificado interno do FreeIPA / IdM
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.example.com.crt \
  -k /etc/pki/tls/private/internal.example.com.key \
  -K HTTP/internal.example.com@REALM \
  -D internal.example.com \
  -C "systemctl reload httpd"

# Verificar status
sudo getcert list

# certmonger faz o rastreamento e a renovação do certificado interno

Mantenha estes fluxos separados:

Caso de usoFerramenta recomendada
Certificado público de internet do Let’s Encryptcertbot
Certificado interno do FreeIPA / IdMcertmonger com ipa-getcert
ACME contra seu próprio endpoint IdM ACMEcertbot ou outro cliente ACME

Importante: IdM ACME, quando habilitado, é a sua própria CA FreeIPA / IdM expondo um endpoint ACME. Não é o Let’s Encrypt.


24.10 Solução de Problemas certbot

Problemas Comuns

Problema 1: Validação Desafio Falhou

# Sintoma
sudo certbot --apache -d example.com
# Erro: Challenge validation failed

# Causas comuns:
# 1. Porta 80 não acessível
curl http://example.com/.well-known/acme-challenge/test
# Deve estar acessível da internet

# 2. Firewall bloqueando
sudo firewall-cmd --list-services | grep http

# 3. DNS não resolvendo
nslookup example.com

# 4. Outro serviço na porta 80
ss -tlnp | grep :80

Problema 2: Renovação Falhou

# Verificar logs renovação
sudo cat /var/log/letsencrypt/letsencrypt.log

# Causas comuns:
# - Porta 80 bloqueada
# - DNS mudou
# - Limite taxa atingido

# Testar renovação manualmente
sudo certbot renew --dry-run

Problema 3: Erros Permissão

# Corrigir permissões certbot
sudo chmod 0755 /etc/letsencrypt/{live,archive}
sudo chmod 0644 /etc/letsencrypt/live/*/fullchain.pem
sudo chmod 0600 /etc/letsencrypt/live/*/privkey.pem

24.11 Melhores Práticas

Melhores Práticas certbot

✅ **Usar certbot apenas para sites públicos**
✅ **Garantir porta 80 acessível** (desafio HTTP-01)
✅ **Testar renovação regularmente** (certbot renew --dry-run)
✅ **Monitorar timer renovação** (systemctl status certbot-renew.timer)
✅ **Configurar notificações email** para falhas
✅ **Usar hooks renovação** para recarregar serviços
✅ **Backup diretório /etc/letsencrypt/**
✅ **Documentar dependência EPEL** em runbooks
✅ **Ter plano fallback** se EPEL indisponível
✅ **Para serviços internos, usar certmonger + FreeIPA/CA local**

Quando Usar certbot

✅ Casos de Uso Bons:

  • Sites públicos
  • Ambientes desenvolvimento/staging
  • Implantações pequenas
  • Projetos sensíveis a custo
  • Setup HTTPS rápido

❌ Considerar Alternativas:

  • Produção empresarial (usar FreeIPA)
  • Serviços apenas internos (usar FreeIPA)
  • Suporte vendor estrito requerido (sem EPEL)
  • Ambientes air-gapped (sem internet)
  • Conformidade requerendo CA comercial

24.12 Alternativa: FreeIPA para Interno

Comparação

Para serviços INTERNOS:

# Em vez de Let's Encrypt (CA pública)
# Usar FreeIPA (CA interna)

# Vantagens FreeIPA para interno:
✅ Sem dependência internet
✅ Suportado Red Hat
✅ Funciona offline
✅ Sem necessidade EPEL
✅ Integrado com RHEL
✅ Perfis de certificados
✅ Gerenciamento centralizado

# Setup:
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.crt \
  -k /etc/pki/tls/private/internal.key \
  -K HTTP/$(hostname -f)@REALM \
  -C "systemctl reload httpd"

# Ver Capítulo 19 para detalhes FreeIPA

24.13 Migração de certbot para certmonger

Ao mover serviços internos para FreeIPA / IdM

Se você vai substituir certificados públicos do Let’s Encrypt por PKI interna para serviços não públicos, mova o serviço para FreeIPA / IdM em vez de tentar fazer o certmonger falar diretamente com o Let’s Encrypt.

#============================================#
# MIGRAR CERTBOT → CERTMONGER PARA PKI INTERNA
#============================================#

# Passo 1: Inventariar os certificados gerenciados pelo certbot
sudo certbot certificates

# Passo 2: Solicitar o certificado interno de substituição a partir do IPA
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/internal.example.com.crt \
  -k /etc/pki/tls/private/internal.example.com.key \
  -K HTTP/internal.example.com@REALM \
  -D internal.example.com \
  -C "systemctl reload httpd"

# Passo 3: Atualizar a configuração do Apache/NGINX
# Mudar de /etc/letsencrypt/live/... para /etc/pki/tls/...

# Passo 4: Recarregar e verificar
sudo systemctl reload httpd
sudo getcert list

# Passo 5: Desabilitar renovações do certbot apenas depois que todos os certificados públicos forem removidos
sudo systemctl disable --now certbot-renew.timer

24.14 Limites Taxa

Limites Let’s Encrypt

Estar ciente de limites taxa:

Tipo LimiteValorPeríodo
Certificados por domínio50por semana
Certificados duplicados5por semana
Validações falhadas5por hora
Novas contas10por IP por 3 horas

Evitar atingir limites:

  • ✅ Usar –dry-run para teste
  • ✅ Usar ambiente staging primeiro
  • ✅ Não solicitar mesmo cert repetidamente
  • ✅ Planejar implantações cuidadosamente

Ambiente Staging:

# Testar contra staging (não conta contra limites)
sudo certbot --apache \
  -d test.example.com \
  --test-cert  # Usa ambiente staging

# Quando pronto, obter cert produção:
sudo certbot --apache -d test.example.com

24.15 Exemplos Completos

Exemplo 1: Apache com certbot

#!/bin/bash
# setup-apache-letsencrypt.sh

DOMAIN="www.example.com"
EMAIL="admin@example.com"

echo "=== Setup Apache + Let's Encrypt ==="
echo "⚠️ Requer repositório EPEL"

# 1. Instalar Apache
sudo dnf install -y httpd

# 2. Habilitar EPEL
sudo dnf install -y epel-release

# 3. Instalar certbot
sudo dnf install -y certbot python3-certbot-apache

# 4. Garantir porta 80 aberta
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# 5. Iniciar Apache
sudo systemctl enable --now httpd

# 6. Obter certificado
sudo certbot --apache \
  -d "$DOMAIN" \
  --non-interactive \
  --agree-tos \
  --email "$EMAIL" \
  --redirect

# 7. Verificar
sudo certbot certificates

# 8. Testar
curl -I https://$DOMAIN/

echo "✅ Apache + Let's Encrypt configurado!"
echo "⚠️ Lembrar: certbot requer EPEL (suportado comunidade)"

Exemplo 2: NGINX com certbot

#!/bin/bash
# setup-nginx-letsencrypt.sh

DOMAIN="api.example.com"
EMAIL="admin@example.com"

echo "=== Setup NGINX + Let's Encrypt ==="

# 1. Instalar NGINX
sudo dnf install -y nginx

# 2. Instalar certbot
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx

# 3. Criar config NGINX básica
sudo tee /etc/nginx/conf.d/$DOMAIN.conf << EOF
server {
    listen 80;
    server_name $DOMAIN;
    root /usr/share/nginx/html;
}
EOF

# 4. Iniciar NGINX
sudo systemctl enable --now nginx

# 5. Obter certificado
sudo certbot --nginx \
  -d "$DOMAIN" \
  --non-interactive \
  --agree-tos \
  --email "$EMAIL"

# 6. certbot automaticamente atualiza config NGINX!

# 7. Verificar
curl -I https://$DOMAIN/

echo "✅ NGINX + Let's Encrypt configurado!"

24.16 Backup e Restore

Backup Certificados Let’s Encrypt

#============================================#
# BACKUP CERTBOT/LETSENCRYPT
#============================================#

# Backup diretório letsencrypt inteiro
sudo tar czf letsencrypt-backup-$(date +%Y%m%d).tar.gz \
  /etc/letsencrypt/

# Armazenar backup com segurança (contém chaves privadas!)

# Restore
sudo tar xzf letsencrypt-backup-YYYYMMDD.tar.gz -C /

# Verificar
sudo certbot certificates

24.17 Conclusões Chave

  1. Let’s Encrypt fornece certificados gratuitos para domínios públicos
  2. certbot requer EPEL em TODAS versões RHEL (não oficialmente suportado)
  3. certbot automatiza configuração Apache/NGINX
  4. Validade 90 dias requer renovação automática
  5. certmonger continua sendo a opção nativa para fluxos de FreeIPA e CA interna
  6. Para serviços internos: Usar FreeIPA ao invés
  7. Testar com –dry-run para evitar limites taxa
  8. Monitorar timer renovação - verificar que está rodando

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA LET'S ENCRYPT & CERTBOT                    │
├──────────────────────────────────────────────────────────────┤
│ ⚠️ REQUER EPEL (repositório comunidade, não Red Hat!)        │
│                                                              │
│ Instalar:     dnf install epel-release                       │
│               dnf install certbot python3-certbot-apache     │
│                                                              │
│ Apache:       certbot --apache -d example.com                │
│ NGINX:        certbot --nginx -d example.com                 │
│ Standalone:   certbot certonly --standalone -d example.com   │
│                                                              │
│ Testar:       certbot renew --dry-run                        │
│ Renovar:      certbot renew (automático via timer)           │
│ Listar:       certbot certificates                           │
│                                                              │
│ Certs:        /etc/letsencrypt/live/<domínio>/               │
│               fullchain.pem, privkey.pem                     │
│                                                              │
│ Timer:        systemctl status certbot-renew.timer           │
│ Logs:         /var/log/letsencrypt/letsencrypt.log           │
│                                                              │
│ Alternativa:  certmonger + FreeIPA / CA interna              │
│               ipa-getcert request ...                        │
└──────────────────────────────────────────────────────────────┘

⚠️ certbot NÃO disponível em repos oficiais RHEL
⚠️ EPEL é suportado comunidade, não Red Hat
✅ Para empresarial: Considere FreeIPA + certmonger (Capítulo 19)
✅ Use certmonger para renovações de FreeIPA / CA interna

🧪 Laboratório Prático

Lab 13: Let’s Encrypt e Certbot

Obtenha e renove automaticamente certificados Let’s Encrypt

  • 📁 Localização: labs/pt_BR/13-letsencrypt-certbot/
  • ⏱️ Tempo: 30-40 minutos
  • 🎯 Nível: Intermediário

Navegação do Capítulo

Capítulo 25: Automatização Ansible para Certificados

Escalar: Gerencie certificados através centenas de sistemas RHEL com Ansible. Automatize implantação, renovação e monitoramento em escala empresarial.


25.1 Por Que Ansible para Certificados?

Gerenciamento Manual:

❌ SSH para 100 servidores individualmente
❌ Copiar certificados um por um
❌ Configurar serviços manualmente
❌ Rastrear renovações por servidor
❌ Esperar não ter perdido nenhum

Automatização Ansible:

✅ Implantar certificados em 100 servidores em minutos
✅ Configuração consistente
✅ Idempotente (seguro executar repetidamente)
✅ Controlado versão (Git)
✅ Auditável (quem mudou o que quando)
✅ Capacidade rollback

25.2 Pré-requisitos

Instalar Ansible no RHEL

#============================================#
# INSTALAR ANSIBLE
#============================================#

# RHEL 8/9/10
sudo dnf install ansible-core -y

# Ou de repositório Ansible para último
sudo dnf install epel-release  # Se usando EPEL
sudo dnf install ansible -y

# Verificar
ansible --version

# Instalar coleção community.crypto (ESSENCIAL!)
ansible-galaxy collection install community.crypto

25.3 Inventário Ansible para Gerenciamento Certificado

Exemplo Inventário

#============================================#
# inventory/hosts.ini
#============================================#

[webservers]
web01.example.com
web02.example.com
web03.example.com

[mailservers]
mail01.example.com

[databases]
db01.example.com
db02.example.com

[all:vars]
ansible_user=ansible
ansible_become=yes
ansible_python_interpreter=/usr/bin/python3

25.4 Gerar Certificados com Ansible

Playbook: Gerar Chaves Privadas

#============================================#
# playbooks/generate-keys.yml
#============================================#

---
- name: Gerar chaves privadas para servidores RHEL
  hosts: webservers
  become: yes

  tasks:
    - name: Instalar OpenSSL
      dnf:
        name: openssl
        state: present

    - name: Gerar chave privada
      community.crypto.openssl_privatekey:
        path: "/etc/pki/tls/private/{{ inventory_hostname }}.key"
        size: 2048
        type: RSA
        mode: '0600'
        owner: root
        group: root

    - name: Verificar chave gerada
      stat:
        path: "/etc/pki/tls/private/{{ inventory_hostname }}.key"
      register: key_file

    - name: Mostrar resultado
      debug:
        msg: "Chave gerada: {{ key_file.stat.exists }}"

Playbook: Gerar CSRs

#============================================#
# playbooks/generate-csrs.yml
#============================================#

---
- name: Gerar solicitações de assinatura de certificado
  hosts: webservers
  become: yes

  tasks:
    - name: Criar CSR
      community.crypto.openssl_csr:
        path: "/tmp/{{ inventory_hostname }}.csr"
        privatekey_path: "/etc/pki/tls/private/{{ inventory_hostname }}.key"
        common_name: "{{ inventory_hostname }}"
        subject_alt_name:
          - "DNS:{{ inventory_hostname }}"
          - "DNS:{{ inventory_hostname_short }}"
        key_usage:
          - digitalSignature
          - keyEncipherment
        extended_key_usage:
          - serverAuth
        organization_name: "Example Company"
        country_name: "US"

    - name: Buscar CSR para o nó de controle
      fetch:
        src: "/tmp/{{ inventory_hostname }}.csr"
        dest: "csrs/{{ inventory_hostname }}.csr"
        flat: yes

25.5 Implantar Certificados com Ansible

Playbook: Implantar Certificados para Apache

#============================================#
# playbooks/deploy-apache-certs.yml
#============================================#

---
- name: Implantar certificados em servidores Apache
  hosts: webservers
  become: yes

  vars:
    cert_source_dir: "/path/to/certificates"

  tasks:
    - name: Instalar Apache e mod_ssl
      dnf:
        name:
          - httpd
          - mod_ssl
        state: present

    - name: Copiar certificado
      copy:
        src: "{{ cert_source_dir }}/{{ inventory_hostname }}.crt"
        dest: "/etc/pki/tls/certs/{{ inventory_hostname }}.crt"
        mode: '0644'
        owner: root
        group: root
      notify: recarregar apache

    - name: Implantar chave privada
      copy:
        src: "{{ cert_source_dir }}/{{ inventory_hostname }}.key"
        dest: "/etc/pki/tls/private/{{ inventory_hostname }}.key"
        mode: '0600'
        owner: root
        group: root
        no_log: yes  # Não registrar chave privada
      notify: recarregar apache

    - name: Configurar SSL do Apache
      template:
        src: templates/ssl.conf.j2
        dest: /etc/httpd/conf.d/ssl.conf
        mode: '0644'
      notify: recarregar apache

    - name: Garantir que o Apache está em execução
      service:
        name: httpd
        state: started
        enabled: yes

  handlers:
    - name: recarregar apache
      service:
        name: httpd
        state: reloaded

25.6 Validação Certificado com Ansible

Playbook: Validar Certificados

#============================================#
# playbooks/validate-certificates.yml
#============================================#

---
- name: Validar certificados em servidores RHEL
  hosts: all
  become: yes

  tasks:
    - name: Encontrar todos os certificados
      find:
        paths: /etc/pki/tls/certs/
        patterns: '*.crt'
      register: certificates

    - name: Verificar expiração do certificado
      community.crypto.x509_certificate_info:
        path: "{{ item.path }}"
      register: cert_info
      loop: "{{ certificates.files }}"
      loop_control:
        label: "{{ item.path }}"

    - name: Identificar certificados expirando (30 dias)
      set_fact:
        expiring_certs: "{{ expiring_certs | default([]) + [item.item.path] }}"
      when:
        - (item.not_after | to_datetime('%Y%m%d%H%M%SZ')) - (ansible_date_time.iso8601 | to_datetime) < '30 days'
      loop: "{{ cert_info.results }}"
      loop_control:
        label: "{{ item.item.path }}"

    - name: Reportar certificados expirando
      debug:
        msg: "⚠️ Certificado expirando em breve: {{ item }}"
      loop: "{{ expiring_certs | default([]) }}"
      when: expiring_certs is defined

25.7 Gerenciamento certmonger com Ansible

Playbook: Configuração Rastreamento certmonger

#============================================#
# playbooks/setup-certmonger.yml
#============================================#

---
- name: Configurar rastreamento certmonger
  hosts: webservers
  become: yes

  tasks:
    - name: Instalar certmonger
      dnf:
        name: certmonger
        state: present

    - name: Garantir que certmonger está em execução
      service:
        name: certmonger
        state: started
        enabled: yes

    - name: Solicitar certificado do FreeIPA
      command: >
        ipa-getcert request
        -f /etc/pki/tls/certs/{{ inventory_hostname }}.crt
        -k /etc/pki/tls/private/{{ inventory_hostname }}.key
        -K HTTP/{{ inventory_hostname }}@EXAMPLE.COM
        -D {{ inventory_hostname }}
        -C "systemctl reload httpd"
      args:
        creates: /etc/pki/tls/certs/{{ inventory_hostname }}.crt

    - name: Verificar status do certmonger
      command: getcert list
      register: cert_status
      changed_when: false

    - name: Exibir status
      debug:
        var: cert_status.stdout_lines

25.8 Monitoramento Certificado com Ansible

Playbook: Relatório Expiração Certificado

#============================================#
# playbooks/cert-expiration-report.yml
#============================================#

---
- name: Gerar relatório de expiração de certificados
  hosts: all
  become: yes
  gather_facts: yes

  tasks:
    - name: Obter expiração do certificado para Apache
      shell: |
        if [ -f /etc/pki/tls/certs/{{ inventory_hostname }}.crt ]; then
          openssl x509 -in /etc/pki/tls/certs/{{ inventory_hostname }}.crt -noout -enddate | cut -d= -f2
        else
          echo "Nenhum certificado encontrado"
        fi
      register: cert_expiry
      changed_when: false

    - name: Calcular dias até a expiração
      set_fact:
        days_left: "{{ ((cert_expiry.stdout | to_datetime('%b %d %H:%M:%S %Y %Z')) - (ansible_date_time.iso8601 | to_datetime)).days }}"
      when: cert_expiry.stdout != "Nenhum certificado encontrado"

    - name: Adicionar ao relatório
      set_fact:
        cert_report: |
          {{ inventory_hostname }},{{ cert_expiry.stdout }},{{ days_left | default('N/A') }}
      delegate_to: localhost
      delegate_facts: yes

    - name: Salvar relatório
      copy:
        content: "{{ hostvars | dict2items | map(attribute='value.cert_report') | join('\n') }}"
        dest: "/tmp/cert-expiration-report.csv"
      delegate_to: localhost
      run_once: yes

25.9 Fluxo de Trabalho Implantação Certificado Completo

Automatização End-to-End

#============================================#
# playbooks/full-cert-deployment.yml
#============================================#

---
- name: Implantação completa de certificados
  hosts: webservers
  become: yes

  vars:
    cert_domain: "example.com"
    cert_base_path: "/etc/pki/tls"

  pre_tasks:
    - name: Coletar facts
      setup:

  tasks:
    # 1. Garantir diretórios existem
    - name: Garantir que os diretórios de certificados existem
      file:
        path: "{{ item }}"
        state: directory
        mode: '0755'
      loop:
        - "{{ cert_base_path }}/certs"
        - "{{ cert_base_path }}/private"

    # 2. Gerar chave privada (se não existe)
    - name: Gerar chave privada
      community.crypto.openssl_privatekey:
        path: "{{ cert_base_path }}/private/{{ inventory_hostname }}.key"
        size: 2048
        mode: '0600'

    # 3. Implantar certificado (do controller)
    - name: Implantar certificado
      copy:
        src: "files/certs/{{ inventory_hostname }}.crt"
        dest: "{{ cert_base_path }}/certs/{{ inventory_hostname }}.crt"
        mode: '0644'
      notify: recarregar httpd

    # 4. Implantar bundle CA
    - name: Implantar bundle CA
      copy:
        src: "files/ca-bundle.crt"
        dest: "{{ cert_base_path }}/certs/ca-bundle.crt"
        mode: '0644'

    # 5. Configurar Apache
    - name: Implantar configuração SSL do Apache
      template:
        src: templates/apache-ssl.conf.j2
        dest: /etc/httpd/conf.d/ssl.conf
        mode: '0644'
      notify: recarregar httpd

    # 6. Validar configuração
    - name: Testar configuração do Apache
      command: apachectl configtest
      changed_when: false

    # 7. Garantir firewall aberto
    - name: Abrir HTTPS no firewall
      firewalld:
        service: https
        permanent: yes
        state: enabled
        immediate: yes

    # 8. Garantir Apache rodando
    - name: Garantir que o Apache está em execução
      service:
        name: httpd
        state: started
        enabled: yes

  handlers:
    - name: recarregar httpd
      service:
        name: httpd
        state: reloaded

25.10 Roles Ansible para Certificados

Criar Role Reutilizável

#============================================#
# CRIAR ROLE ANSIBLE PARA CERTIFICADOS
#============================================#

# Criar estrutura role
ansible-galaxy role init certificates

# Estrutura diretório:
certificates/
├── defaults/
│   └── main.yml          # Variáveis padrão
├── files/
│   └── ca-bundle.crt     # Certificados CA
├── handlers/
│   └── main.yml          # Handlers reload serviço
├── tasks/
│   └── main.yml          # Tarefas principais
├── templates/
│   └── ssl.conf.j2       # Templates config
└── vars/
    └── main.yml          # Variáveis

Exemplo Tarefas Role

#============================================#
# roles/certificates/tasks/main.yml
#============================================#

---
- name: Instalar ferramentas de gerenciamento de certificados
  dnf:
    name:
      - openssl
      - certmonger
    state: present

- name: Garantir diretórios de certificados
  file:
    path: "{{ item }}"
    state: directory
    mode: '0755'
  loop:
    - /etc/pki/tls/certs
    - /etc/pki/tls/private

- name: Implantar certificados
  include_tasks: deploy-cert.yml
  loop: "{{ certificates }}"
  loop_control:
    loop_var: cert

- name: Configurar rastreamento certmonger
  include_tasks: setup-certmonger.yml
  when: use_certmonger | default(false)

Usar a Role

#============================================#
# playbook.yml
#============================================#

---
- name: Implantar certificados
  hosts: webservers
  become: yes

  roles:
    - role: certificates
      vars:
        certificates:
          - name: "{{ inventory_hostname }}"
            service: httpd
            principal: "HTTP/{{ inventory_hostname }}@REALM"

25.11 Melhores Práticas

Melhores Práticas Gerenciamento Certificado Ansible

✅ **Usar coleção community.crypto** para tarefas certificado
✅ **Criptografar chaves privadas com vault** (ansible-vault)
✅ **Usar no_log para dados sensíveis** (chaves, senhas)
✅ **Testar em staging primeiro** antes produção
✅ **Usar handlers** para reloads serviço (evitar restarts desnecessários)
✅ **Tornar playbooks idempotentes** (seguro executar múltiplas vezes)
✅ **Controle versão** playbooks no Git
✅ **Documentar variáveis** e requisitos
✅ **Tag tasks** para execução seletiva
✅ **Usar roles** para reutilização

Considerações Segurança

# Criptografar chaves privadas com ansible-vault
ansible-vault encrypt files/private-keys/*.key

# Usar no_log para tarefas sensíveis
- name: Implantar chave privada
  copy:
    src: "{{ key_file }}"
    dest: "/etc/pki/tls/private/server.key"
  no_log: yes

# Usar vault para senhas
# group_vars/all/vault.yml (criptografado)
admin_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          ...

25.12 Exemplos Completos

Exemplo 1: Implantar CA para Todos Servidores

---
- name: Implantar CA corporativa em todos os servidores RHEL
  hosts: all
  become: yes

  tasks:
    - name: Copiar certificado CA
      copy:
        src: files/corporate-ca.crt
        dest: /etc/pki/ca-trust/source/anchors/corporate-ca.crt
        mode: '0644'

    - name: Atualizar repositório de confiança CA
      command: update-ca-trust extract
      changed_when: true

    - name: Verificar CA instalada
      command: trust list
      register: trust_list
      changed_when: false

    - name: Confirmar presença da CA
      assert:
        that:
          - "'Corporate CA' in trust_list.stdout"
        fail_msg: "CA corporativa não está no repositório de confiança!"

Exemplo 2: Verificação Renovação Certificado em Massa

---
- name: Verificar expiração de certificados em toda a frota
  hosts: all
  become: yes

  tasks:
    - name: Verificar status do certmonger
      command: getcert list
      register: certmonger_status
      changed_when: false
      failed_when: false

    - name: Verificar CA_UNREACHABLE
      set_fact:
        has_issue: true
      when: "'CA_UNREACHABLE' in certmonger_status.stdout"

    - name: Reportar problemas
      debug:
        msg: "⚠️ {{ inventory_hostname }} possui certificados CA_UNREACHABLE!"
      when: has_issue | default(false)

    - name: Criar relatório de problemas
      lineinfile:
        path: "/tmp/cert-problems.txt"
        line: "{{ inventory_hostname }}: CA_UNREACHABLE"
        create: yes
      delegate_to: localhost
      when: has_issue | default(false)

25.13 Conclusões Chave

  1. Ansible habilita implantação certificado em massa
  2. Coleção community.crypto essencial para tarefas certificado
  3. Usar ansible-vault para chaves privadas
  4. Playbooks idempotentes são críticos
  5. Testar em staging antes produção
  6. Combinar com certmonger para melhores resultados
  7. Controle versão tudo no Git

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA AUTOMATIZAÇÃO CERTIFICADO ANSIBLE              │
├──────────────────────────────────────────────────────────────────┤
│ Instalar:     dnf install ansible-core                           │
│ Coleção:      ansible-galaxy collection install community.crypto │
│                                                                  │
│ Gerar chave:  community.crypto.openssl_privatekey                │
│ Gerar CSR:    community.crypto.openssl_csr                       │
│ Info cert:    community.crypto.x509_certificate_info             │
│                                                                  │
│ Deploy cert:  copy module (com mode: '0644')                     │
│ Deploy key:   copy module (com mode: '0600', no_log: yes)        │
│                                                                  │
│ Vault:        ansible-vault encrypt <file>                       │
│               ansible-vault decrypt <file>                       │
│                                                                  │
│ Executar:     ansible-playbook playbook.yml                      │
│ Dry run:      ansible-playbook playbook.yml --check              │
│ Específico:   ansible-playbook playbook.yml --tags certs         │
└──────────────────────────────────────────────────────────────────┘

✅ Usar coleção community.crypto
✅ Criptografar chaves privadas com ansible-vault
✅ Usar no_log para dados sensíveis

🧪 Laboratório Prático

Lab 14: Automatização Ansible para Certificados

Automatize a implantação de certificados com Ansible

  • 📁 Localização: labs/pt_BR/14-ansible-automation/
  • ⏱️ Tempo: 40-50 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 26: Monitoramento e Alertas no RHEL

Prevenir Interrupções: Monitoramento proativo previne surpresas de expiração certificado. Aprenda como monitorar certificados e configurar alertas no RHEL.


26.1 Por Que Monitorar Certificados?

Sem Monitoramento:

❌ Certificado expira
❌ Website cai às 2 da manhã
❌ Incidente emergência
❌ Perda receita
❌ Dano reputação
❌ Noite estressante para time ops

Com Monitoramento:

✅ Alerta 30 dias antes expiração
✅ Renovação planejada durante horário comercial
✅ Sem interrupções
✅ Sem emergências
✅ Clientes felizes
✅ Time ops bem descansado

26.2 O Que Monitorar

Métricas Certificado

## Métricas Críticas:

✅ **Data expiração** (dias até expiração)
✅ **Validade certificado** (ainda não válido, expirado)
✅ **Coincidência par certificado/chave**
✅ **Validade cadeia confiança**
✅ **Status certmonger** (se usado)
✅ **Saúde serviço** (usando o certificado)
✅ **Sucesso/falha renovação**

## Limiares Aviso:

🟡 60 dias: Primeiro aviso
🟠 30 dias: Segundo aviso
🔴 15 dias: Alerta crítico
🚨 7 dias: Escalação emergência

26.3 Scripts Monitoramento Simples

Verificação Expiração Básica

#!/bin/bash
# check-cert-expiration.sh
# Verificador expiração certificado simples

WARN_DAYS=30
CRIT_DAYS=7

check_cert() {
  local cert=$1
  local name=$(basename "$cert")

  if [ ! -f "$cert" ]; then
    echo "❌ $name: Arquivo não encontrado"
    return 2
  fi

  # Obter data expiração
  expiry=$(openssl x509 -in "$cert" -noout -enddate 2>/dev/null | cut -d= -f2)

  if [ -z "$expiry" ]; then
    echo "❌ $name: Certificado inválido"
    return 2
  fi

  # Calcular dias restantes
  expiry_epoch=$(date -d "$expiry" +%s 2>/dev/null)
  now_epoch=$(date +%s)
  days_left=$(( ($expiry_epoch - $now_epoch) / 86400 ))

  # Verificar limiares
  if [ $days_left -lt 0 ]; then
    echo "🚨 $name: EXPIRADO há $((- days_left)) dias!"
    return 2
  elif [ $days_left -lt $CRIT_DAYS ]; then
    echo "🔴 $name: CRÍTICO - $days_left dias restantes"
    return 2
  elif [ $days_left -lt $WARN_DAYS ]; then
    echo "🟡 $name: AVISO - $days_left dias restantes"
    return 1
  else
    echo "✅ $name: OK - $days_left dias restantes"
    return 0
  fi
}

# Verificar todos certificados
for cert in /etc/pki/tls/certs/*.crt; do
  check_cert "$cert"
done

Monitor Status certmonger

#!/bin/bash
# monitor-certmonger.sh
# Monitorar status rastreamento certmonger

echo "=== Monitor Status certmonger ==="

# Verificar se certmonger está rodando
if ! systemctl is-active --quiet certmonger; then
  echo "🚨 CRÍTICO: certmonger não está rodando!"
  systemctl status certmonger
  exit 2
fi

# Obter status certmonger
STATUS_OUTPUT=$(sudo getcert list 2>&1)

# Contar certificados por status
TOTAL=$(echo "$STATUS_OUTPUT" | grep -c "Request ID")
MONITORING=$(echo "$STATUS_OUTPUT" | grep -c "status: MONITORING")
UNREACHABLE=$(echo "$STATUS_OUTPUT" | grep -c "status: CA_UNREACHABLE")
REJECTED=$(echo "$STATUS_OUTPUT" | grep -c "status: CA_REJECTED")

echo "Total certificados: $TOTAL"
echo "  MONITORING: $MONITORING ✅"
echo "  CA_UNREACHABLE: $UNREACHABLE $([ $UNREACHABLE -gt 0 ] && echo '⚠️')"
echo "  CA_REJECTED: $REJECTED $([ $REJECTED -gt 0 ] && echo '❌')"

# Alertar se problemas
if [ $UNREACHABLE -gt 0 ] || [ $REJECTED -gt 0 ]; then
  echo ""
  echo "🚨 ATENÇÃO REQUERIDA:"
  sudo getcert list | grep -B5 "status: CA_" | grep -E "(Request ID|status:)"
  exit 1
fi

echo "✅ Todos certificados OK"

26.4 Timer Systemd para Monitoramento

Criar Timer Monitoramento

#============================================#
# CRIAR TIMER SYSTEMD PARA MONITORAMENTO
#============================================#

# Criar arquivo service
sudo tee /etc/systemd/system/cert-monitor.service << 'EOF'
[Unit]
Description=Certificate Expiration Monitor
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/check-cert-expiration.sh
StandardOutput=journal
StandardError=journal
EOF

# Criar arquivo timer (executar diariamente)
sudo tee /etc/systemd/system/cert-monitor.timer << 'EOF'
[Unit]
Description=Daily Certificate Monitoring
Requires=cert-monitor.service

[Timer]
OnCalendar=daily
OnBootSec=15min
Persistent=true

[Install]
WantedBy=timers.target
EOF

# Instalar script monitoramento
sudo cp check-cert-expiration.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/check-cert-expiration.sh

# Habilitar timer
sudo systemctl daemon-reload
sudo systemctl enable cert-monitor.timer
sudo systemctl start cert-monitor.timer

# Verificar
systemctl list-timers | grep cert-monitor

# Testar manualmente
sudo systemctl start cert-monitor.service
sudo journalctl -u cert-monitor.service

26.5 Alertas Email

Alerta Email Simples

#!/bin/bash
# cert-monitor-with-email.sh
# Monitor certificado com alertas email

EMAIL="admin@example.com"
WARN_DAYS=30

ALERTS=""

for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue

  if ! openssl x509 -in "$cert" -noout -checkend $((86400*WARN_DAYS)) 2>/dev/null; then
    expiry=$(openssl x509 -in "$cert" -noout -enddate | cut -d= -f2)
    ALERTS="$ALERTS\nCertificado: $cert\nExpira: $expiry\n"
  fi
done

if [ -n "$ALERTS" ]; then
  echo -e "Avisos Expiração Certificado:\n$ALERTS" | \
    mail -s "⚠️ Alerta Expiração Certificado - $(hostname)" "$EMAIL"
fi

26.6 Monitoramento Prometheus (Avançado)

Exporter Certificado

#============================================#
# MONITORAMENTO CERTIFICADO PROMETHEUS
#============================================#

# Instalar x509-certificate-exporter (exemplo)
# https://github.com/enix/x509-certificate-exporter

# Ou usar coletor textfile Node Exporter

# Criar script coletor métricas
cat > /usr/local/bin/cert-metrics.sh << 'EOF'
#!/bin/bash
# Gerar métricas Prometheus para certificados

METRICS_FILE="/var/lib/node_exporter/textfile_collector/certificates.prom"
mkdir -p $(dirname "$METRICS_FILE")

cat > "$METRICS_FILE" << PROM
# HELP certificate_expiry_days Days until certificate expiration
# TYPE certificate_expiry_days gauge
PROM

for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue

  expiry=$(openssl x509 -in "$cert" -noout -enddate 2>/dev/null | cut -d= -f2)
  expiry_epoch=$(date -d "$expiry" +%s 2>/dev/null)
  now_epoch=$(date +%s)
  days_left=$(( ($expiry_epoch - $now_epoch) / 86400 ))

  echo "certificate_expiry_days{cert=\"$cert\",hostname=\"$(hostname)\"} $days_left" >> "$METRICS_FILE"
done
EOF

chmod +x /usr/local/bin/cert-metrics.sh

# Executar via cron
echo "*/5 * * * * /usr/local/bin/cert-metrics.sh" | sudo crontab -

Regras Alerta Prometheus

#============================================#
# prometheus-alerts.yml
#============================================#

groups:
  - name: certificates
    rules:
      - alert: CertificateExpiringSoon
        expr: certificate_expiry_days < 30
        for: 1h
        labels:
          severity: warning
        annotations:
          summary: "Certificado expirando em {{ $value }} dias"
          description: "Certificado {{ $labels.cert }} em {{ $labels.hostname }} expira em {{ $value }} dias"

      - alert: CertificateExpiryCritical
        expr: certificate_expiry_days < 7
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Certificado expirando em {{ $value }} dias!"
          description: "URGENTE: Certificado {{ $labels.cert }} em {{ $labels.hostname }} expira em {{ $value }} dias!"

      - alert: CertificateExpired
        expr: certificate_expiry_days < 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Certificado EXPIRADO!"
          description: "Certificado {{ $labels.cert }} em {{ $labels.hostname }} expirou!"

26.7 Logging Centralizado

Enviar Eventos Certificado para Syslog

#============================================#
# LOGAR EVENTOS CERTIFICADO
#============================================#

# certmonger loga para journal
sudo journalctl -u certmonger -f

# Encaminhar para syslog central
# /etc/rsyslog.conf
*.* @@syslog-server.example.com:514

# Ou configurar logging certmonger específico
# Monitorar renovações certmonger
sudo journalctl -u certmonger --since today | grep -i "renewed\|failed"

26.8 Comparação Ferramentas Monitoramento

Opções para RHEL

FerramentaComplexidadeCustoIntegraçãoAlertas
Scripts simplesBaixaGratuitoFácilEmail/syslog
Nagios/IcingaMédiaGratuitoBoaMúltiplos
Prometheus + GrafanaMédia-AltaGratuitoExcelentePoderoso
ZabbixMédiaGratuitoBoaMúltiplos
Comercial (Datadog, etc.)Baixa$$$ExcelenteAvançado
Red Hat InsightsBaixaSubscriptionNativoDashboard

Recomendação para RHEL:

  • Pequeno: Scripts simples + email
  • Médio: Prometheus + Grafana
  • Empresarial: Comercial ou Red Hat Insights

26.9 Solução Monitoramento Completa

Script Monitoramento Abrangente

#!/bin/bash
# comprehensive-cert-monitor.sh
# Monitoramento certificado completo para RHEL

WARN_DAYS=30
CRIT_DAYS=7
EMAIL="admin@example.com"
LOG_FILE="/var/log/cert-monitor.log"

log() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

send_alert() {
  local subject=$1
  local body=$2
  echo "$body" | mail -s "$subject" "$EMAIL"
  logger -t cert-monitor "$subject"
}

log "=== Iniciando Monitor Certificado ==="

# Verificação 1: certmonger rodando?
if ! systemctl is-active --quiet certmonger; then
  send_alert "🚨 certmonger NÃO rodando em $(hostname)" \
    "Serviço certmonger não está rodando. Renovações certificado podem falhar!"
fi

# Verificação 2: status certmonger
UNREACHABLE=$(sudo getcert list | grep -c "CA_UNREACHABLE")
if [ $UNREACHABLE -gt 0 ]; then
  send_alert "⚠️ CA inacessível para $UNREACHABLE certificados em $(hostname)" \
    "$(sudo getcert list | grep -B5 'CA_UNREACHABLE')"
fi

# Verificação 3: Expiração certificado
CRITICAL=0
WARNING=0

for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue

  expiry=$(openssl x509 -in "$cert" -noout -enddate 2>/dev/null | cut -d= -f2)
  [ -z "$expiry" ] && continue

  expiry_epoch=$(date -d "$expiry" +%s 2>/dev/null)
  now_epoch=$(date +%s)
  days_left=$(( ($expiry_epoch - $now_epoch) / 86400 ))

  if [ $days_left -lt 0 ]; then
    log "🚨 EXPIRADO: $cert"
    ((CRITICAL++))
  elif [ $days_left -lt $CRIT_DAYS ]; then
    log "🔴 CRÍTICO ($days_left dias): $cert"
    ((CRITICAL++))
  elif [ $days_left -lt $WARN_DAYS ]; then
    log "🟡 AVISO ($days_left dias): $cert"
    ((WARNING++))
  else
    log "✅ OK ($days_left dias): $cert"
  fi
done

# Enviar alerta resumo se problemas
if [ $CRITICAL -gt 0 ] || [ $WARNING -gt 0 ]; then
  SUMMARY="Crítico: $CRITICAL, Aviso: $WARNING\n\n$(tail -20 $LOG_FILE)"
  send_alert "Alerta Certificado: $(hostname)" "$SUMMARY"
fi

log "=== Monitor Completo: Crítico=$CRITICAL, Aviso=$WARNING ==="

26.10 Monitoramento com Grafana

Exemplo Dashboard

{
  "dashboard": {
    "title": "Monitoramento Certificado RHEL",
    "panels": [
      {
        "title": "Certificados Expirando Em Breve",
        "targets": [
          {
            "expr": "certificate_expiry_days < 30"
          }
        ]
      },
      {
        "title": "Status certmonger",
        "targets": [
          {
            "expr": "certmonger_status != 'MONITORING'"
          }
        ]
      }
    ]
  }
}

26.11 Conclusões Chave

  1. Monitorar proativamente - Não esperar por expiração
  2. Aviso 30 dias mínimo recomendado
  3. Status certmonger crítico se usando automatização
  4. Múltiplos canais alerta (email, Slack, PagerDuty)
  5. Testar monitoramento - Garantir alertas realmente chegam
  6. Logar tudo para trilha auditoria
  7. Automatizar remediação onde possível

Cartão de Referência Rápida

┌───────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA MONITORAMENTO CERTIFICADO                       │
├───────────────────────────────────────────────────────────────────┤
│ Verificar exp:   openssl x509 -in cert.crt -noout -checkend 86400 │
│ Dias restantes:  openssl x509 -in cert.crt -noout -enddate        │
│                                                                   │
│ certmonger:      getcert list                                     │
│ Status:          getcert list | grep "status:"                    │
│ Logs:            journalctl -u certmonger                         │
│                                                                   │
│ Níveis alerta:   60 dias (info)                                   │
│                  30 dias (aviso)                                  │
│                  7 dias (crítico)                                 │
│                  0 dias (emergência!)                             │
│                                                                   │
│ Ferramentas:     Scripts simples, Prometheus, Nagios, Zabbix      │
│ Nativo:          Rastreamento integrado certmonger                │
└───────────────────────────────────────────────────────────────────┘

✅ Monitorar == Sem Surpresas!
✅ Automatizar monitoramento com timers systemd ou cron

Navegação do Capítulo

Capítulo 27: Metodologia de Solução de Problemas de Certificados RHEL

Habilidade Crítica: Este capítulo ensina uma abordagem sistemática para resolver QUALQUER problema de certificado em sistemas RHEL. Domine esta metodologia e você resolverá problemas em minutos em vez de horas.


27.1 O Problema

Problemas de certificados são frustrantes:

  • Mensagens de erro são crípticas
  • Causas raiz estão ocultas
  • Múltiplas camadas envolvidas (OpenSSL, config serviço, SELinux, crypto-policies)
  • Varia por versão RHEL

A solução de problemas aleatória não funciona. Você precisa de um sistema.


27.2 A Abordagem Sistemática

Siga esta metodologia de 7 passos para CADA problema de certificado:

Passo 1: Identificar Versão RHEL e Ambiente
Passo 2: Verificar Propriedades Básicas do Certificado
Passo 3: Verificar Cadeia de Confiança e Validação CA
Passo 4: Verificar Configuração do Serviço
Passo 5: Verificar Ajustes em Nível de Sistema
Passo 6: Testar Funcionalidade do Certificado
Passo 7: Revisar Logs e Detalhes de Erros

Regra: Nunca pular passos. Cada um fornece informação de diagnóstico crítica.


27.3 Passo 1: Identificar Versão RHEL e Ambiente

Por Que Isso Importa

Comportamento de certificados difere significativamente entre versões RHEL.

Verificações Rápidas

#============================================#
# VERIFICAÇÃO DE VERSÃO RHEL
#============================================#

# 1. Verificar versão RHEL
cat /etc/redhat-release
# Exemplo saída: Red Hat Enterprise Linux release 9.8 (Plow)

# 2. Verificar versão OpenSSL
openssl version
# RHEL 7: OpenSSL 1.0.2k
# RHEL 8: OpenSSL 1.1.1k
# RHEL 9/10: OpenSSL 3.5.5

# 3. Verificar crypto-policy (RHEL 8+)
update-crypto-policies --show 2>/dev/null
# DEFAULT, LEGACY, FUTURE, ou FIPS

# 4. Verificar modo FIPS
fips-mode-setup --check 2>/dev/null
# FIPS mode is enabled/disabled

# 5. Verificar status SELinux
getenforce
# Enforcing, Permissive, ou Disabled

O Que Documentar

Criar uma nota de solução de problemas com:

Versão RHEL: _______
Versão OpenSSL: _______
Crypto-Policy: _______ (se RHEL 8+)
Modo FIPS: _______
SELinux: _______
Serviço: _______ (Apache, NGINX, Postfix, etc.)

27.4 Passo 2: Verificar Propriedades Básicas do Certificado

As Cinco Verificações Essenciais

#============================================#
# VERIFICAÇÃO 1: Expiração do Certificado
#============================================#

# Ver datas do certificado
openssl x509 -in /path/to/cert.crt -noout -dates

# Saída:
# notBefore=Jan 1 00:00:00 2024 GMT
# notAfter=Jan 1 23:59:59 2025 GMT   ← Deve estar no futuro!

# Verificação rápida se expirado
openssl x509 -in /path/to/cert.crt -noout -checkend 0
# Saída 0 = válido, Saída 1 = expirado

# Verificar expiração em X dias
openssl x509 -in /path/to/cert.crt -noout -checkend $((86400*30))
# Verificar se expira nos próximos 30 dias


#============================================#
# VERIFICAÇÃO 2: Subject/Hostname do Certificado
#============================================#

# Ver subject (para quem é o certificado)
openssl x509 -in /path/to/cert.crt -noout -subject
# subject=CN=server.example.com

# Ver Subject Alternative Names (SANs) - CRÍTICO!
openssl x509 -in /path/to/cert.crt -noout -ext subjectAltName
# X509v3 Subject Alternative Name:
#     DNS:server.example.com, DNS:www.example.com

# ⚠️ Navegadores modernos REQUEREM SANs (CN sozinho é insuficiente)


#============================================#
# VERIFICAÇÃO 3: Coincidência Par Certificado/Chave
#============================================#

# Obter módulo do certificado
openssl x509 -noout -modulus -in /path/to/cert.crt | openssl md5

# Obter módulo da chave
openssl rsa -noout -modulus -in /path/to/cert.key | openssl md5

# ✅ Se hashes MD5 coincidem → cert e chave estão pareados
# ❌ Se diferentes → CHAVE ERRADA!


#============================================#
# VERIFICAÇÃO 4: Emissor do Certificado
#============================================#

# Ver quem assinou este certificado
openssl x509 -in /path/to/cert.crt -noout -issuer
# issuer=C=US, O=Let's Encrypt, CN=R3

# Autoassinado? (subject == issuer)
openssl x509 -in /path/to/cert.crt -noout -subject -issuer | sort | uniq -d
# Se saída não está vazia → autoassinado


#============================================#
# VERIFICAÇÃO 5: Algoritmo e Tamanho da Chave do Certificado
#============================================#

# Ver algoritmo de assinatura
openssl x509 -in /path/to/cert.crt -noout -text | grep "Signature Algorithm"
# Signature Algorithm: sha256WithRSAEncryption   ← Bom
# Signature Algorithm: sha1WithRSAEncryption     ← Ruim (deprecated)

# Ver tamanho da chave pública
openssl x509 -in /path/to/cert.crt -noout -text | grep "Public-Key"
# Public-Key: (2048 bit)   ← Mínimo
# Public-Key: (4096 bit)   ← Melhor

# ⚠️ RHEL 8+ rejeita chaves < 2048 bit por padrão
# ⚠️ RHEL 9+ rejeita assinaturas SHA-1 por padrão

Script de Validação Rápida

#!/bin/bash
# quick-cert-check.sh
CERT=$1

echo "=== Verificação Rápida de Certificado ==="
echo ""
echo "Arquivo: $CERT"
echo ""

echo "1. Expiração:"
openssl x509 -in "$CERT" -noout -dates

echo ""
echo "2. Subject:"
openssl x509 -in "$CERT" -noout -subject

echo ""
echo "3. SANs:"
openssl x509 -in "$CERT" -noout -ext subjectAltName 2>/dev/null || echo "Nenhum SAN encontrado"

echo ""
echo "4. Emissor:"
openssl x509 -in "$CERT" -noout -issuer

echo ""
echo "5. Algoritmo e Chave:"
openssl x509 -in "$CERT" -noout -text | grep -E "(Signature Algorithm|Public-Key)"

echo ""
echo "6. Ainda válido?"
if openssl x509 -in "$CERT" -noout -checkend 0 >/dev/null 2>&1; then
    echo "✅ Certificado é válido"
else
    echo "❌ Certificado expirou!"
fi

Uso:

bash quick-cert-check.sh /etc/pki/tls/certs/server.crt

27.5 Passo 3: Verificar Cadeia de Confiança e Validação CA

Entendendo a Cadeia

Root CA (deve ser confiável pelo sistema)
  └─ CA(s) Intermediária(s)
      └─ Certificado do Servidor (seu certificado)

Verificar Cadeia de Confiança

#============================================#
# VERIFICAR CADEIA COMPLETA DE CERTIFICADOS
#============================================#

# Método 1: Verificar contra bundle CA do sistema
openssl verify /path/to/cert.crt
# /path/to/cert.crt: OK   ← Bom!
# error 20: unable to get local issuer certificate   ← CA faltando!

# Método 2: Verificar com arquivo CA específico
openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt /path/to/cert.crt

# Método 3: Mostrar cadeia completa
openssl s_client -connect server.example.com:443 -showcerts


#============================================#
# VERIFICAR SE CA É CONFIÁVEL PELO RHEL
#============================================#

# Listar todas CAs confiáveis
trust list | grep -i "certificate-authority"

# Buscar por CA específica
trust list | grep -i "Let's Encrypt"

# Verificar se arquivo CA específico é confiável
trust list --filter=ca-anchors | grep -A5 "pkcs11"


#============================================#
# VER CADEIA DE CERTIFICADOS
#============================================#

# Extrair e ver cadeia completa do servidor
openssl s_client -connect server.example.com:443 -showcerts 2>/dev/null | \
  awk '/BEGIN CERT/,/END CERT/ {print}'

# Ver cadeia de arquivo (se empacotado)
openssl crl2pkcs7 -nocrl -certfile /path/to/chain.crt | \
  openssl pkcs7 -print_certs -text -noout


#============================================#
# VERIFICAR CERTIFICADOS INTERMEDIÁRIOS
#============================================#

# Problema comum: Certificado intermediário faltando!
# Servidor deveria enviar: [Cert Servidor] → [Intermediário] → [Root]
# Mas envia apenas: [Cert Servidor]
# Resultado: Cliente não pode validar cadeia!

# Testar de outra máquina
echo | openssl s_client -connect server.example.com:443 -servername server.example.com 2>&1 | \
  grep -E "(verify return code|Verify return code)"
# Verify return code: 0 (ok)   ← Bom
# Verify return code: 21 (unable to verify the first certificate)   ← Intermediário faltando!

Problemas Comuns de Confiança

Código ErroSignificadoSolução
0OK✅ Sem problemas
19Certificado autoassinado na cadeiaAdicionar CA ao repositório de confiança
20Impossível obter cert emissor localCA ou intermediário faltando
21Impossível verificar primeiro certificadoCert intermediário faltando
27Certificado não confiávelCA não está no repositório de confiança sistema

27.6 Passo 4: Verificar Configuração do Serviço

Verificações Específicas por Serviço

#============================================#
# APACHE (httpd)
#============================================#

# Verificar configuração SSL
sudo apachectl -t -D DUMP_VHOSTS | grep -A5 ":443"

# Ver caminhos de cert SSL
sudo grep -r "SSLCertificateFile\|SSLCertificateKeyFile" /etc/httpd/

# Testar sintaxe de configuração
sudo apachectl configtest

# Verificar módulos SSL carregados
sudo httpd -M | grep ssl


#============================================#
# NGINX
#============================================#

# Testar configuração
sudo nginx -t

# Ver caminhos SSL
sudo grep -r "ssl_certificate\|ssl_certificate_key" /etc/nginx/

# Verificar arquivos de certificado referenciados
sudo nginx -T | grep "ssl_certificate"


#============================================#
# POSTFIX (Mail)
#============================================#

# Ver configurações TLS
sudo postconf | grep -i tls

# Verificar caminhos cert/chave
sudo postconf smtpd_tls_cert_file smtpd_tls_key_file

# Testar TLS
openssl s_client -connect localhost:25 -starttls smtp


#============================================#
# OPENLDAP
#============================================#

# Verificar configurações TLS
sudo grep -i "TLSCert\|TLSKey" /etc/openldap/slapd.conf /etc/openldap/slapd.d/* 2>/dev/null

# Testar LDAPS
openssl s_client -connect localhost:636


#============================================#
# POSTGRESQL
#============================================#

# Verificar configurações SSL
sudo -u postgres psql -c "SHOW ssl_cert_file; SHOW ssl_key_file;"

# Testar conexão SSL
psql "host=localhost sslmode=require"

Verificação de Permissões de Arquivo

#============================================#
# VERIFICAR PERMISSÕES (CRÍTICO!)
#============================================#

# Arquivos de certificado (públicos) devem ser legíveis
ls -l /etc/pki/tls/certs/*.crt
# -rw-r--r-- (644)   ← Bom

# Arquivos de chave (privados) devem ser protegidos
ls -l /etc/pki/tls/private/*.key
# -rw------- (600) ou -rw-r----- (640)   ← Bom
# -rw-r--r-- (644)   ← RUIM! Muito permissivo!

# Verificar propriedade
ls -l /etc/pki/tls/private/*.key
# Deve ser de propriedade do usuário do serviço ou root

# Corrigir permissões se necessário
sudo chmod 600 /etc/pki/tls/private/server.key
sudo chown root:root /etc/pki/tls/private/server.key

27.7 Passo 5: Verificar Ajustes em Nível de Sistema

Específico por Versão RHEL

#============================================#
# RHEL 8/9/10: VERIFICAR CRYPTO-POLICIES
#============================================#

# Política atual
update-crypto-policies --show
# DEFAULT, LEGACY, FUTURE, ou FIPS

# Se serviço falha com "no shared cipher" ou similar:
# Testar temporariamente com política LEGACY
sudo update-crypto-policies --set LEGACY
sudo systemctl restart <serviço>

# Testar se funciona agora
# Se SIM → incompatibilidade de cipher/versão TLS
# Se NÃO → problema diferente

# Reverter para DEFAULT
sudo update-crypto-policies --set DEFAULT


#============================================#
# VERIFICAR MODO FIPS (Todas Versões)
#============================================#

fips-mode-setup --check
# FIPS mode is enabled.

# No modo FIPS, restrições adicionais se aplicam:
# - Apenas algoritmos aprovados
# - Requisitos de chave mais rigorosos
# - Alguns ciphers desabilitados


#============================================#
# VERIFICAR SELINUX (Crítico!)
#============================================#

# Status SELinux
getenforce
# Enforcing, Permissive, ou Disabled

# Verificar negações relacionadas a certificados
sudo ausearch -m avc -ts recent | grep -i cert

# Verificar contexto SELinux de arquivos cert
ls -Z /etc/pki/tls/certs/server.crt
# system_u:object_r:cert_t:s0   ← Correto

# Se errado, relabeling
sudo restorecon -v /etc/pki/tls/certs/server.crt
sudo restorecon -v /etc/pki/tls/private/server.key


#============================================#
# VERIFICAR FIREWALL
#============================================#

# Verificar se porta do serviço está aberta
sudo firewall-cmd --list-all | grep -E "(https|443|ldaps|636)"

# Se não aberta
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

27.8 Passo 6: Testar Funcionalidade do Certificado

Testes de Conexão ao Vivo

#============================================#
# TESTAR CONEXÃO HTTPS/TLS
#============================================#

# Método 1: openssl s_client (mais detalhado)
openssl s_client -connect server.example.com:443 -servername server.example.com

# Procurar por:
# - "Verify return code: 0 (ok)"   ← Bom
# - Exibição da cadeia de certificados
# - Cipher negociado
# - Versão do protocolo (TLS 1.2/1.3)

# Método 2: curl (teste rápido)
curl -v https://server.example.com/
# Procurar por:
# * SSL connection using TLSv1.3
# * Server certificate:
# *  subject: CN=server.example.com
# *  issuer: CN=Let's Encrypt Authority

# Método 3: Testar com versão TLS específica
openssl s_client -connect server.example.com:443 -tls1_2
openssl s_client -connect server.example.com:443 -tls1_3


#============================================#
# TESTAR DA PERSPECTIVA DO CLIENTE
#============================================#

# Testar resolução DNS
nslookup server.example.com
# Deve resolver para IP correto

# Testar conectividade de rede
telnet server.example.com 443
nc -zv server.example.com 443

# Testar com clientes diferentes
curl --insecure https://server.example.com/   # Ignorar verificação cert
wget --no-check-certificate https://server.example.com/

Testes de Validação de Certificado

#============================================#
# VALIDAR ASPECTOS ESPECÍFICOS
#============================================#

# Testar correspondência de hostname
openssl s_client -connect server.example.com:443 -servername server.example.com 2>&1 | \
  grep "verify return"

# Testar com hostname errado (deveria falhar)
openssl s_client -connect server.example.com:443 -servername wrong.example.com 2>&1 | \
  grep "verify return"

# Testar expiração
openssl s_client -connect server.example.com:443 2>&1 | openssl x509 -noout -dates

# Testar força do cipher
openssl s_client -connect server.example.com:443 -cipher 'HIGH:!aNULL:!MD5'

27.9 Passo 7: Revisar Logs e Detalhes de Erros

Onde Procurar

#============================================#
# LOGS DE SERVIÇO
#============================================#

# Apache
sudo tail -f /var/log/httpd/error_log
sudo tail -f /var/log/httpd/ssl_error_log

# NGINX
sudo tail -f /var/log/nginx/error.log

# Postfix
sudo tail -f /var/log/maillog

# Journal do sistema (todos serviços)
sudo journalctl -u httpd.service -f
sudo journalctl -u nginx.service -f
sudo journalctl -xe | grep -i cert


#============================================#
# LOGS CERTMONGER (Auto-Renovação)
#============================================#

# Status certmonger
sudo getcert list

# Logs certmonger
sudo journalctl -u certmonger.service -f

# Status detalhado para cert específico
sudo getcert list -i <request-id>


#============================================#
# NEGAÇÕES SELINUX
#============================================#

# Negações AVC recentes
sudo ausearch -m avc -ts recent

# Negações relacionadas a certificados
sudo ausearch -m avc -ts today | grep -i cert


#============================================#
# ERROS OPENSSL/TLS
#============================================#

# Comum em logs:
# - "SSL_CTX_use_certificate:ca md too weak" → Algoritmo assinatura fraco
# - "unable to get local issuer certificate" → CA faltando
# - "certificate has expired" → Cert expirado
# - "certificate verify failed" → Falha validação cadeia
# - "no shared cipher" → Incompatibilidade cipher
# - "wrong version number" → Incompatibilidade protocolo

27.10 Árvores de Decisão

Fluxograma de Diagnóstico Rápido

Problema de Certificado
    │
    ├─ Serviço não inicia?
    │   ├─ Verificar caminhos de arquivo na config
    │   ├─ Verificar permissões de arquivo (600 para chaves)
    │   ├─ Verificar coincidência par cert/chave
    │   └─ Verificar contexto SELinux
    │
    ├─ Conexão falha com "certificate verify failed"?
    │   ├─ Verificar confiança CA (Passo 3)
    │   ├─ Verificar certificados intermediários
    │   └─ Verificar crypto-policy (RHEL 8+)
    │
    ├─ "Certificate has expired"?
    │   ├─ Verificar com: openssl x509 -noout -dates
    │   ├─ Verificar status certmonger
    │   └─ Renovar certificado
    │
    ├─ "Hostname does not match"?
    │   ├─ Verificar SANs: openssl x509 -noout -ext subjectAltName
    │   ├─ Verificar resolução DNS
    │   └─ Verificar diretiva server_name/ServerName
    │
    └─ "No shared cipher" / "wrong version number"?
        ├─ Verificar crypto-policy (RHEL 8+)
        ├─ Verificar compatibilidade versão TLS
        └─ Testar com: openssl s_client -tls1_2

27.11 Kit de Ferramentas de Solução de Problemas

Comandos Essenciais

# Cartão de referência rápida para solução de problemas

# 1. IDENTIFICAR
cat /etc/redhat-release
openssl version
update-crypto-policies --show

# 2. VERIFICAR CERTIFICADO
openssl x509 -in cert.crt -noout -text
openssl x509 -in cert.crt -noout -dates
openssl x509 -in cert.crt -noout -subject

# 3. VERIFICAR CONFIANÇA
openssl verify cert.crt
trust list | grep -i "authority"

# 4. TESTAR CONEXÃO
openssl s_client -connect host:443 -servername host
curl -v https://host/

# 5. VERIFICAR PERMISSÕES
ls -lZ /etc/pki/tls/certs/cert.crt
ls -lZ /etc/pki/tls/private/key.key

# 6. VERIFICAR LOGS
sudo journalctl -xe | grep -i cert
sudo tail -f /var/log/httpd/ssl_error_log

Criar Sua Lista de Verificação de Solução de Problemas

## Lista de verificação para solução de problemas de certificados

### Ambiente
- [ ] Versão RHEL: _______
- [ ] Versão OpenSSL: _______
- [ ] Crypto-Policy (RHEL 8+): _______
- [ ] Modo FIPS: _______
- [ ] SELinux: _______
- [ ] Serviço: _______

### Verificações Certificado
- [ ] Data expiração certificado
- [ ] Subject/hostname coincide
- [ ] SANs presentes e corretos
- [ ] Par certificado/chave coincide
- [ ] Algoritmo assinatura (SHA-256 ou superior; sem SHA-1 nem MD5)
- [ ] Tamanho chave (>= 2048 bits)

### Cadeia Confiança
- [ ] Certificado valida com bundle CA sistema
- [ ] Certificados intermediários presentes
- [ ] Root CA confiável pelo sistema

### Configuração Serviço
- [ ] Caminhos arquivo corretos na config
- [ ] Permissões arquivo corretas (600 para chaves)
- [ ] Contextos SELinux corretos
- [ ] Sintaxe config serviço válida

### Ajustes Sistema
- [ ] Crypto-policy compatível (RHEL 8+)
- [ ] Requisitos FIPS atendidos (se aplicável)
- [ ] Firewall permite conexões
- [ ] Sem negações SELinux

### Teste
- [ ] Teste conexão com openssl s_client
- [ ] Teste conexão com curl
- [ ] Verificação hostname passa

### Logs
- [ ] Logs serviço revisados
- [ ] Journal sistema verificado
- [ ] Log auditoria SELinux verificado

27.12 Conclusões Chave

  1. Sempre seguir metodologia de 7 passos - não pular passos
  2. Verificar versão RHEL primeiro - comportamento varia significativamente
  3. Verificar propriedades básicas certificado antes de solução de problemas complexa
  4. Problemas de cadeia de confiança são o problema mais comum
  5. Permissões de arquivo causam muitas falhas “misteriosas”
  6. Crypto-policies (RHEL 8+) afetam tudo
  7. SELinux pode bloquear acesso a certificados
  8. Logs contam a história - sempre verificá-los

27.13 Cenários Práticos

Ver capítulos próximos para solução de problemas detalhada de:

  • Capítulo 28: Erros Comuns de Certificados no RHEL
  • Capítulo 29: Solução de Problemas Específica por Serviço
  • Capítulo 30: Solução de Problemas do certmonger
  • Capítulo 31: Solução de Problemas Crypto-Policy
  • Capítulo 32: Análise Relatórios SOS
  • Capítulo 33: Procedimentos de Emergência

Referência Rápida

┌──────────────────────────────────────────────────────────────────┐
│ MÉTODO SOLUÇÃO DE PROBLEMAS DE 7 PASSOS                          │
├──────────────────────────────────────────────────────────────────┤
│ 1. Identificar: Versão RHEL, OpenSSL, crypto-policy              │
│ 2. Verificar: Expiração, hostname, coincidência chave, algoritmo │
│ 3. Confiança: Validação CA, cadeia, intermediários               │
│ 4. Config: Arquivos serviço, caminhos, permissões                │
│ 5. Sistema: Crypto-policy, FIPS, SELinux, firewall               │
│ 6. Testar: Conexões ao vivo, curl, openssl s_client              │
│ 7. Logs: Logs serviço, journal, auditoria SELinux                │
└──────────────────────────────────────────────────────────────────┘

🧪 Laboratório Prático

Lab 15: Cenários de Solução de Problemas

Pratique diagnosticar e corrigir um problema de certificado expirado (um cenário implementado)

  • 📁 Localização: labs/pt_BR/15-troubleshooting-scenarios/
  • ⏱️ Tempo: 15-20 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 28: Erros Comuns de Certificados no RHEL

Aprenda da Dor dos Outros: Este capítulo cataloga os erros de certificados mais comuns no RHEL, organizados por tipo e versão. Quando encontrar um erro, procure aqui primeiro!


28.1 Usando Este Capítulo

Como usar este guia de solução de problemas:

  1. Viu um erro? Busque neste capítulo pela mensagem de erro
  2. Serviço não inicia? Verifique Seção 28.3 (Erros de Configuração)
  3. Conexão falha? Verifique Seção 28.4 (Erros de Validação)
  4. Após atualização RHEL? Verifique Seção 28.7 (Específico por Versão)
  5. Não tem certeza? Use a metodologia do Capítulo 27

28.2 Erros Mais Comuns (Top 10)

Tabela de Referência Rápida

#ErroCausa ComumSolução Rápida
1Certificado expiradoEsqueceu renovarRenovar certificado
2unable to get local issuerCA faltando no repositório de confiançaAdicionar CA a /etc/pki/ca-trust/source/anchors/
3certificate verify failedCadeia incompletaInstalar certs intermediários
4Permission deniedPermissões de arquivo erradaschmod 600 em arquivo de chave
5hostname does not matchDesajuste de CN/SANReemitir com SANs corretos
6no shared cipherIncompatibilidade de cifraVerificar crypto-policy (RHEL 8+)
7ca md too weakAssinatura SHA-1 (RHEL 9+)Reemitir com SHA-256+
8wrong version numberDesajuste de versão TLSVerificar suporte TLS cliente
9CA_UNREACHABLEcertmonger não alcança IPAVerificar conectividade IPA
10SELinux denying accessContexto SELinux erradorestorecon em arquivos cert

28.3 Erros de Configuração

Erro: “SSLCertificateFile: file does not exist or is empty”

Serviços: Apache

Sintoma:

AH00526: Syntax error on line 100 of /etc/httpd/conf.d/ssl.conf:
SSLCertificateFile: file '/etc/pki/tls/certs/server.crt' does not exist or is empty

Diagnóstico:

ls -l /etc/pki/tls/certs/server.crt
# ls: cannot access '/etc/pki/tls/certs/server.crt': No such file or directory

Soluções:

# Solução 1: Corrigir caminho na config
sudo vi /etc/httpd/conf.d/ssl.conf
# Corrigir o caminho SSLCertificateFile

# Solução 2: Instalar certificado no local esperado
sudo cp server.crt /etc/pki/tls/certs/

# Solução 3: Restaurar do backup
sudo cp /var/backups/certificates/latest/server.crt /etc/pki/tls/certs/

Erro: “Private key does not match this certificate”

Serviços: Apache, NGINX, Postfix

Sintoma:

SSL Library Error: error:0B080074:x509 certificate routines:
X509_check_private_key:key values mismatch

Diagnóstico:

# Verificar se cert e chave coincidem
CERT_MOD=$(openssl x509 -noout -modulus -in /etc/pki/tls/certs/server.crt | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in /etc/pki/tls/private/server.key | openssl md5)

echo "Cert: $CERT_MOD"
echo "Key:  $KEY_MOD"
# Se diferentes → desajuste!

Causa: Certificado foi emitido para uma chave privada diferente

Solução:

# Regenerar CSR com a chave CORRETA
openssl req -new -key /etc/pki/tls/private/server.key -out server.csr \
  -subj "/CN=server.example.com"

# Submeter CSR para CA, obter novo certificado
# Instalar novo certificado

Erro: “Permission denied” na Chave Privada

Serviços: Todos

Sintoma:

Permission denied: Can't open PEM file '/etc/pki/tls/private/server.key'

Diagnóstico:

ls -l /etc/pki/tls/private/server.key
# -rw-r--r--. 1 root root  ← Muito permissivo!

# Verificar se usuário do serviço pode ler
sudo -u apache cat /etc/pki/tls/private/server.key >/dev/null
# Permission denied

Solução:

# Definir permissões corretas
sudo chmod 600 /etc/pki/tls/private/server.key
sudo chown apache:apache /etc/pki/tls/private/server.key

# Para serviços que necessitam propriedade específica:
# OpenLDAP:
sudo chown ldap:ldap /etc/openldap/certs/ldap.key

# PostgreSQL:
sudo chown postgres:postgres /var/lib/pgsql/data/server.key

# MySQL:
sudo chown mysql:mysql /etc/mysql/certs/server.key

28.4 Erros de Validação

Erro: “certificate verify failed”

Serviços: Todos

Erro Completo:

SSL_connect: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

Causas Comuns:

Causa 1: Certificado autoassinado não confiável

# Diagnóstico
openssl verify /etc/pki/tls/certs/server.crt
# error 18: self signed certificate

# Solução: Adicionar ao repositório de confiança
sudo cp server.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Causa 2: Certificado CA faltando

# Diagnóstico
openssl verify /etc/pki/tls/certs/server.crt
# error 20: unable to get local issuer certificate

# Solução: Adicionar certificado CA
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Causa 3: Certificado intermediário faltando

# Diagnóstico
openssl s_client -connect server.example.com:443 -showcerts
# Verify return code: 21 (unable to verify the first certificate)

# Solução: Incluir intermediário no arquivo cert
cat server.crt intermediate.crt > /etc/pki/tls/certs/server-chain.crt
# Atualizar config do serviço para usar server-chain.crt

Erro: “certificate has expired”

Serviços: Todos

Sintoma:

SSL_connect: error:14090086:SSL routines:ssl3_get_server_certificate:certificate has expired

Diagnóstico:

# Verificar expiração
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates
# notAfter=Jan 15 23:59:59 2024 GMT  ← No passado!

Soluções:

# Solução 1: Se certmonger rastreando
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/server.crt

# Solução 2: Renovação manual
# Gerar novo CSR, submeter para CA, instalar novo cert

# Solução 3: Emergência - autoassinado temporário
sudo /usr/local/bin/emergency-self-signed-cert.sh $(hostname -f)
# Veja Capítulo 33 para procedimentos de emergência

Erro: “hostname (or IP address) does not match certificate”

Serviços: Todos (especialmente navegadores)

Erro Completo:

SSL: certificate subject name 'server.example.com' does not match target host name 'www.example.com'

Diagnóstico:

# Verificar CN e SANs do certificado
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -subject -ext subjectAltName

# Saída:
# subject=CN=server.example.com
# X509v3 Subject Alternative Name:
#     DNS:server.example.com
#
# Problema: Acessando www.example.com mas cert tem apenas server.example.com

Solução:

# Reemitir certificado com SANs corretos
openssl req -new -key server.key -out server.csr \
  -subj "/CN=www.example.com" \
  -addext "subjectAltName=DNS:www.example.com,DNS:server.example.com,DNS:example.com"

# Ou usar wildcard: *.example.com

28.5 Erros de Cadeia de Confiança

Erro: “unable to get local issuer certificate”

Código Erro: 20

Sintoma:

openssl verify /etc/pki/tls/certs/server.crt
# error 20 at 0 depth lookup: unable to get local issuer certificate

Causa: A CA que assinou o certificado não está no repositório de confiança do sistema

Solução:

# Obter certificado CA (da CA ou extrair da cadeia)
# Adicionar ao repositório de confiança
sudo cp issuing-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

# Verificar
openssl verify /etc/pki/tls/certs/server.crt
# /etc/pki/tls/certs/server.crt: OK

Erro: “unable to verify the first certificate”

Código Erro: 21

Sintoma:

openssl s_client -connect server.example.com:443
# Verify return code: 21 (unable to verify the first certificate)

Causa: Servidor enviando certificado sem intermediário(s)

Diagnóstico:

# Contar certificados na cadeia
openssl s_client -connect server.example.com:443 -showcerts 2>&1 | \
  grep -c "BEGIN CERTIFICATE"
# Se mostra 1: Apenas cert servidor (intermediário faltando!)
# Deveria mostrar 2+: Servidor + intermediário(s)

Solução:

# Criar bundle de certificado com intermediário
cat server.crt intermediate.crt > /etc/pki/tls/certs/server-bundle.crt

# Atualizar config do serviço
# Apache:
SSLCertificateFile /etc/pki/tls/certs/server-bundle.crt

# Ou usar SSLCertificateChainFile (Apache):
SSLCertificateChainFile /etc/pki/tls/certs/intermediate.crt

# NGINX:
ssl_certificate /etc/pki/tls/certs/server-bundle.crt;

# Recarregar serviço

28.6 Erros de Crypto-Policy (RHEL 8/9/10)

Erro: “no shared cipher”

Serviços: Todos (RHEL 8/9/10)

Sintoma:

SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Diagnóstico:

# Verificar política atual
update-crypto-policies --show
# DEFAULT

# Testar conexão mostrando ciphers
openssl s_client -connect server:443 -cipher 'ALL'

# Verificar quais ciphers estão disponíveis sob política atual
openssl ciphers -v | head -20

Causas Comuns e Soluções:

Causa 1: Cliente muito antigo (necessita TLS 1.0)

# Teste temporário com LEGACY
sudo update-crypto-policies --set LEGACY
sudo systemctl restart httpd

# Se funciona → problema compatibilidade cliente
# Correção apropriada: Atualizar cliente ou criar módulo política customizado

Causa 2: Crypto-policy do servidor muito restritiva

# Se usando política FUTURE com clientes antigos
update-crypto-policies --show
# FUTURE

# Temporário: Usar DEFAULT
sudo update-crypto-policies --set DEFAULT
sudo systemctl restart services

Erro: “SSL routines:tls_post_process_client_hello:no shared cipher”

Serviços: Todos (RHEL 9+)

Sintoma: Cliente não consegue negociar cipher com servidor

Solução:

# RHEL 9: Verificar se cliente usando ciphers muito antigos
# Pode necessitar política LEGACY temporariamente

# Verificar configuração do servidor para overrides
grep -r "SSLCipherSuite\|ssl_ciphers" /etc/httpd/ /etc/nginx/

# Se ciphers codificados encontrados, removê-los
# Deixar crypto-policy lidar com isso

28.7 Erros Específicos por Versão RHEL

Erros Específicos RHEL 7

Erro: “dh key too small”

SSL routines:ssl3_check_cert_and_algorithm:dh key too small

Causa: Parâmetros DH padrão muito pequenos para clientes modernos

Solução:

# Gerar parâmetros DH mais fortes
openssl dhparam -out /etc/pki/tls/dhparams.pem 2048

# Apache: Adicionar a ssl.conf
SSLOpenSSLConfCmd DHParameters "/etc/pki/tls/dhparams.pem"

# NGINX: Adicionar à config
ssl_dhparam /etc/pki/tls/dhparams.pem;

Erros Específicos RHEL 8/9/10

Erro: “ca md too weak” (RHEL 9+)

error 3 at 0 depth lookup: CA md too weak

Causa: Certificado tem assinatura SHA-1 (bloqueado no RHEL 9+)

Diagnóstico:

openssl x509 -in server.crt -noout -text | grep "Signature Algorithm"
# Signature Algorithm: sha1WithRSAEncryption  ← Problema!

Solução:

# Reemitir certificado com SHA-256 ou melhor
# Sem workaround - SHA-1 é bloqueado por segurança

# Solicitar novo certificado
openssl req -new -key server.key -out server.csr -sha256 \
  -subj "/CN=server.example.com"

Erro: “Provider ‘legacy’ could not be loaded” (RHEL 9+)

openssl: error while loading shared libraries: Provider 'legacy' could not be loaded

Causa: Tentando usar algoritmo legado sem provider

Solução:

# Usar provider legado explicitamente
openssl md5 -provider legacy file.txt

# Ou atualizar para usar algoritmo moderno
openssl sha256 file.txt

28.8 Erros SELinux

Erro: SELinux Prevenindo Acesso ao Certificado

Sintoma:

audit: type=1400 audit(timestamp): avc: denied { read } for pid=1234 comm="httpd"
name="server.key" dev="sda1" ino=12345 scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0

Diagnóstico:

# Verificar negações AVC
sudo ausearch -m avc -ts recent | grep cert

# Verificar contexto SELinux
ls -Z /etc/pki/tls/certs/server.crt
ls -Z /etc/pki/tls/private/server.key

Solução:

# Corrigir contexto SELinux
sudo restorecon -Rv /etc/pki/tls/

# Verificar
ls -Z /etc/pki/tls/certs/server.crt
# system_u:object_r:cert_t:s0  ← Correto

# Se ainda houver problemas, verificar se SELinux está bloqueando
sudo ausearch -m avc -ts recent

# Gerar política se necessário
sudo ausearch -m avc -ts recent | audit2allow -M mycert
sudo semodule -i mycert.pp

28.9 Erros certmonger

Erro: CA_UNREACHABLE

Sintoma:

sudo getcert list
# status: CA_UNREACHABLE

Diagnóstico:

# Verificar conectividade IPA
ipa ping

# Verificar ticket Kerberos
klist

# Verificar serviços IPA
ssh ipa-server "sudo ipactl status"

Soluções:

# Solução 1: Renovar ticket Kerberos
kinit -k host/$(hostname -f)@REALM

# Solução 2: Verificar conectividade de rede
ping ipa.example.com

# Solução 3: Reiniciar certmonger
sudo systemctl restart certmonger

# Solução 4: Reenviar requisição
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/server.crt

Erro: CA_REJECTED

Sintoma:

sudo getcert list
# status: CA_REJECTED
# ca-error: Server unwilling to issue certificate

Causas Comuns:

Causa 1: Principal de serviço não existe

# Verificar se principal existe
ipa service-show HTTP/$(hostname -f)

# Se não encontrado, adicioná-lo
ipa service-add HTTP/$(hostname -f)

# Reenviar
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/server.crt

Causa 2: Host não registrado no IPA

# Verificar registro
ipa host-show $(hostname -f)

# Se não registrado
sudo ipa-client-install

28.10 Erros de Chaves GPG/PGP Legadas

Erro: “skipped PGP-2 keys” ao Importar

Ferramenta: GnuPG (gpg)

Sintoma:

$ gpg --allow-old-cipher-algos --import keyfile.asc
gpg: Total number processed: 2
gpg:     skipped PGP-2 keys: 2

A chave é rejeitada silenciosamente — mesmo com --allow-old-cipher-algos.

Causa: O arquivo de chave contém chaves OpenPGP versão 3 (era PGP 2.x). GnuPG moderno (2.2+) recusa completamente a importação de pacotes de chave v3. Essas chaves tipicamente usam RSA com assinaturas MD5, ambos criptograficamente obsoletos.

Diagnóstico — Inspecionar os pacotes da chave:

gpg --list-packets keyfile.asc

Saída de exemplo:

# off=0 ctb=95 tag=5 hlen=3 plen=930
:key packet: [obsolete version 3]
# off=933 ctb=b4 tag=13 hlen=2 plen=27
:user ID packet: "User Name <user@example.org>"
# off=962 ctb=89 tag=2 hlen=3 plen=277
:signature packet: algo 1, keyid A1B2C3D4E5F60789
        version 3, created 1034280585, md5len 5, sigclass 0x10
        digest algo 1, begin of digest a1 26
        data: [2047 bits]

Os indicadores críticos são:

  • :key packet: [obsolete version 3] — formato v3, rejeitado pelo GnuPG moderno
  • algo 1 — RSA (criptografar ou assinar)
  • digest algo 1 — MD5 (criptograficamente quebrado)
  • version 3 na assinatura — formato de assinatura antigo
  • sigclass 0x10 — certificação genérica de um ID de usuário

Solução: Não há como “atualizar” uma chave v3. Você deve gerar uma chave moderna nova e aposentar a antiga:

# 1. Gerar uma chave moderna (Ed25519 + Curve25519)
gpg --full-generate-key
#    Escolher: (9) ECC (assinar e criptografar)
#    Curva:    ed25519 (assinatura), cv25519 (criptografia)

# 2. Verificar a nova chave
gpg --list-keys --keyid-format long

# 3. Se ainda controla a chave antiga, assinar cruzado para continuidade de confiança
gpg --default-key OLDKEYID --sign-key NEWKEYID

# 4. Gerar um certificado de revogação para a chave antiga
gpg --output revoke-old.asc --gen-revoke OLDKEYID

# 5. Publicar a nova chave
gpg --send-keys NEWKEYID

# 6. Revogar a chave antiga
gpg --import revoke-old.asc
gpg --send-keys OLDKEYID

Após a migração, atualize todos os sistemas que referenciam a chave antiga (CI/CD, assinatura de pacotes, criptografia de e-mail).


Entendendo a Saída de gpg --list-packets

Ao depurar problemas de chaves GPG, gpg --list-packets mostra a estrutura de pacotes OpenPGP em bruto. Aqui está uma referência completa para interpretar a saída.

Campos do Cabeçalho do Pacote

Cada linha de pacote começa com:

# off=0 ctb=95 tag=5 hlen=3 plen=930
CampoSignificado
offDeslocamento em bytes no arquivo (posição inicial deste pacote)
ctbCipher Type Byte (byte de cabeçalho em hex, codifica formato + tag)
tagTipo de pacote (decodificado — ver tabela abaixo)
hlenComprimento do cabeçalho em bytes
plenComprimento do conteúdo em bytes

Tags de Pacote (tag=)

TagTipo de Pacote
1Chave de Sessão Criptografada com Chave Pública
2Assinatura
3Chave de Sessão Criptografada com Chave Simétrica
4Assinatura One-Pass
5Chave Pública
6Chave Secreta
7Subchave Secreta
8Dados Compactados
9Dados Criptografados Simetricamente
10Marcador
11Dados Literais
12Confiança
13ID de Usuário
14Subchave Pública
17Atributo de Usuário
18Dados Criptografados + Proteção de Integridade
19Código de Detecção de Modificação

IDs de Algoritmo de Chave Pública (algo)

IDAlgoritmo
1RSA (criptografar ou assinar)
2RSA (somente criptografar)
3RSA (somente assinar)
16Elgamal (somente criptografar)
17DSA
18ECDH
19ECDSA
21Diffie-Hellman
22EdDSA (Ed25519, etc.)

IDs de Algoritmo de Digest (Hash) (digest algo)

IDAlgoritmoStatus
1MD5Quebrado — não usar
2SHA-1Descontinuado — bloqueado no RHEL 9+
3RIPEMD-160Legado
8SHA-256Recomendado
9SHA-384Forte
10SHA-512Forte
11SHA-224Aceitável

Classes de Assinatura (sigclass)

CódigoSignificado
0x00Assinatura de documento binário
0x01Assinatura de texto canônico
0x02Assinatura independente
0x10Certificação genérica de chave
0x11Certificação de persona
0x12Certificação casual
0x13Certificação positiva
0x18Vinculação de subchave
0x19Vinculação de chave primária
0x1FAssinatura direta de chave
0x20Revogação de chave
0x28Revogação de subchave
0x30Revogação de certificação
0x40Marca temporal
0x50Confirmação de terceiros

Versões de Pacote de Chave

VersãoEraStatus
3PGP 2.x (1990s)Obsoleto — usa MD5 internamente, rejeitado pelo GnuPG moderno
4OpenPGP RFC 4880 (2007)Padrão atual
5Rascunho (crypto-refresh)Emergente

Campos do Pacote de Assinatura

Para uma assinatura como:

:signature packet: algo 1, keyid A1B2C3D4E5F60789
        version 3, created 1034280585, md5len 5, sigclass 0x10
        digest algo 1, begin of digest a1 26
        data: [2047 bits]
CampoSignificado
algo 1Algoritmo de chave pública utilizado (RSA)
keyidIdentificador curto da chave assinante
version 3Versão do formato de assinatura (v3 = legado)
createdTimestamp Unix da criação da assinatura
md5lenComprimento do prefixo MD5 (artefato legado v3)
sigclass 0x10Tipo de assinatura (certificação genérica de chave)
digest algo 1Algoritmo de hash (MD5)
begin of digestPrimeiros 2 bytes do hash (para verificação rápida)
data: [2047 bits]Dados de assinatura RSA (~chave de 2048 bits)

28.11 Erros de Assinatura RPM Após Atualização RHEL

Erro: “Certificate invalid: policy violation — SHA1 is not considered secure”

Ferramentas: RPM, DNF

Sintoma:

Após atualizar para o RHEL 9+ ou o RHEL 10, comandos RPM geram erros de verificação de assinatura para pacotes de terceiros:

$ rpm -qa
error: Verifying a signature using certificate
  D4E7A923F10B82C6459831AE5F6C0D9BA47E31D2
  (Third-Party Vendor (Release signing) <security@vendor.example.com>):
  1. Certificate 5F6C0D9BA47E31D2 invalid: policy violation
      because: No binding signature at time 2024-08-12T10:44:42Z
      because: Policy rejected non-revocation signature
               (PositiveCertification) requiring second pre-image resistance
      because: SHA1 is not considered secure
  2. Certificate 5F6C0D9BA47E31D2 invalid: policy violation
      because: No binding signature at time 2026-04-16T19:46:38Z
      because: Policy rejected non-revocation signature
               (PositiveCertification) requiring second pre-image resistance
      because: SHA1 is not considered secure

Os comandos RPM ainda funcionam, mas produzem saída de erro excessiva para cada pacote assinado com a chave afetada.

Causa: Chaves GPG de assinatura de terceiros que usam SHA-1 para as assinaturas vinculantes (certificações autoassinadas) são rejeitadas pelas crypto-policies do RHEL 9+ (SHA-1 bloqueado por padrão) e pelo RHEL 10 (suporte a SHA-1 removido por completo). Pacotes instalados antes da atualização retêm assinaturas SHA-1 antigas no banco de dados do RPM.

Diagnóstico:

# Listar todas as chaves GPG importadas no banco de dados do RPM
rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'

Solução:

# 1. Remover a chave de assinatura antiga do terceiro
#    O ID do certificado 5F6C0D9BA47E31D2 mapeia para a versão a47e31d2 no RPM
rpm -e --allmatches gpg-pubkey-a47e31d2-6142699d

# 2. Importar a chave atualizada do fornecedor
rpm --import https://vendor.example.com/keys/signing.asc

# 3. Verificar se os erros desapareceram
rpm -qa > /dev/null

Mapeamento do Key ID: O ID do certificado no erro (por exemplo, 5F6C0D9BA47E31D2) corresponde à versão gpg-pubkey do RPM em hexadecimal minúsculo (a47e31d2). Se rpm -e reportar “not installed”, liste todas as chaves com rpm -q gpg-pubkey --qf '...' para localizar a string exata de version-release.


28.12 Corrupção do Banco de Dados RPM Após Atualização RHEL

Erro: “Malformed MPI” / “non-conformant OpenPGP implementation”

Ferramentas: RPM

Sintoma:

Após atualizar para o RHEL 9+ ou o RHEL 10, o RPM reporta assinatura corrompida em toda consulta ao banco de dados:

error: rpmdbNextIterator: skipping h#       9
Header RSA signature: BAD (header tag 268: invalid OpenPGP signature:
  Parsing an OpenPGP packet:
  Failed to parse Signature Packet
      because: Signature appears to be created by a non-conformant
               OpenPGP implementation, see
               <https://github.com/rpm-software-management/rpm/issues/2351>.
      because: Malformed MPI: leading bit is not set: expected bit 8 to
               be set in   110010 (32))
Header SHA256 digest: OK
Header SHA1 digest: OK

Causa: Alguns pacotes de terceiros foram assinados com implementações OpenPGP não padrão que produzem valores MPI (inteiro de múltipla precisão) malformados nas assinaturas RSA. O RPM mais antigo no RHEL 7/8 tolerava isso, mas o analisador baseado em Sequoia-PGP no RHEL 9+/10 rejeita.

Diagnóstico:

# Identificar o pacote corrompido usando o número do cabeçalho do erro (h# 9)
rpm -q --nosignature --querybynumber 9

Solução:

# 1. Fazer backup do banco de dados do RPM
tar zcvf /var/preserve/rpmdb-$(date +"%d%m%Y").tar.gz /usr/lib/sysimage/rpm/
# Nota: no RHEL 8/9, o banco de dados fica em /var/lib/rpm/

# 2. Identificar o pacote danificado
rpm -q --nosignature --querybynumber <NUMERO_DO_ERRO>

# 3. Remover o pacote com a assinatura corrompida
rpm -e --nosignature --nodigest <nome-do-pacote>
# Se a remoção falhar, remova apenas a entrada do banco de dados:
rpm -e --justdb --nodeps <nome-do-pacote>

# 4. Reconstruir o banco de dados do RPM
rpm --rebuilddb

# 5. Verificar se os erros foram resolvidos
rpm -qa > /dev/null

# 6. Reinstalar a partir de um repositório atualizado
dnf install <nome-do-pacote>

Nota: No RHEL 10, o banco de dados do RPM fica em /usr/lib/sysimage/rpm/. No RHEL 8/9, fica em /var/lib/rpm/.

Referência: A issue #2351 do RPM documenta a análise MPI mais rigorosa introduzida com o backend Sequoia-PGP.


Cenário combinado: ambos os erros após a atualização

Ao atualizar do RHEL 7/8 para o RHEL 9+/10, ambos os erros costumam aparecer ao mesmo tempo. Resolva nesta ordem:

  1. Remova chaves de assinatura SHA-1 antigas e importe chaves atualizadas do fornecedor
  2. Reconstrua o banco de dados do RPM com rpm --rebuilddb
  3. Se erros de MPI malformado persistirem, identifique os pacotes afetados pelo número do header (rpm -q --nosignature --querybynumber <N>), remova-os e reinstale a partir de repositórios atualizados

28.13 Erros Navegador/Cliente

Erro: “NET::ERR_CERT_COMMON_NAME_INVALID”

Sintoma: Navegador mostra “Your connection is not private”

Causa: Hostname não coincide com CN ou SANs do certificado

Diagnóstico:

# Verificar o que você está acessando
echo "Acessando: www.example.com"

# Verificar SANs do certificado
openssl s_client -connect www.example.com:443 2>&1 | \
  openssl x509 -noout -ext subjectAltName
# X509v3 Subject Alternative Name:
#     DNS:server.example.com  ← Não inclui www.example.com!

Solução:

# Reemitir certificado com SANs corretos
openssl req -new -key server.key -out server.csr \
  -subj "/CN=www.example.com" \
  -addext "subjectAltName=DNS:www.example.com,DNS:server.example.com,DNS:example.com"

Erro: “NET::ERR_CERT_AUTHORITY_INVALID”

Sintoma: Navegador não confia no certificado

Causa: CA não está no repositório de confiança do navegador (autoassinado ou CA interna)

Para CA Interna:

# Distribuir certificado CA para clientes
# Usuários precisam instalar CA no seu navegador

# Ou adicionar ao repositório de confiança do sistema (clientes Linux)
sudo cp corporate-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Para Autoassinado (Apenas Teste):

# Não usar autoassinado em produção!
# Obter certificado apropriado da CA

28.14 Erros Firewall/Rede

Erro: Timeout de Conexão

Sintoma: Não consegue conectar à porta HTTPS

Diagnóstico:

# Verificar se serviço está escutando
ss -tlnp | grep :443

# Verificar firewall
sudo firewall-cmd --list-services | grep https

# Testar localmente
curl -vk https://localhost/

# Testar remotamente
telnet server.example.com 443

Solução:

# Abrir firewall
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

# Verificar
sudo firewall-cmd --list-all

28.15 Dicionário de Mensagens de Erro

Tabela de Consulta Rápida

Mensagem ErroCódigo ErroCausaCapítulo
“certificate has expired”-Cert expirado28.4
“unable to get local issuer”20CA faltando28.4
“unable to verify first cert”21Intermediário faltando28.4
“autoassinado certificate”18Autoassinado não confiável28.4
“certificate verify failed”-Validação geral28.4
“ca md too weak”3Assinatura SHA-128.7
“no shared cipher”-Desajuste de cifra28.6
“wrong version number”-Desajuste de versão TLS28.6
“Permission denied”-Permissões de arquivo28.3
“key values mismatch”-Cert/chave não coincidem28.3
“hostname does not match”-Desajuste de CN/SAN28.4
“CA_UNREACHABLE”-certmonger não alcança IPA28.9
“CA_REJECTED”-IPA rejeitou requisição28.9
“skipped PGP-2 keys”-Importação chave GPG v3 rejeitada28.10
“SHA1 is not considered secure”-Chave GPG de terceiros usa SHA-128.11
“Malformed MPI”-Assinatura OpenPGP não conforme28.12

28.16 Comandos de Diagnóstico Rápido

Comandos Universais de Solução de Problemas

#============================================#
# EXECUTAR ESTES PARA QUALQUER ERRO DE CERTIFICADO
#============================================#

# 1. Verificar versão RHEL
cat /etc/redhat-release

# 2. Verificar arquivo certificado
openssl x509 -in /path/to/cert.crt -noout -text

# 3. Verificar expiração
openssl x509 -in /path/to/cert.crt -noout -dates

# 4. Verificar confiança
openssl verify /path/to/cert.crt

# 5. Verificar permissões
ls -lZ /path/to/cert.crt
ls -lZ /path/to/key.key

# 6. Verificar coincidência cert/chave
openssl x509 -noout -modulus -in cert.crt | openssl md5
openssl rsa -noout -modulus -in key.key | openssl md5

# 7. Testar conexão
openssl s_client -connect server:443

# 8. Verificar logs
sudo journalctl -xe | grep -i cert
sudo tail -f /var/log/httpd/ssl_error_log

# 9. Verificar SELinux
sudo ausearch -m avc -ts recent | grep cert

# 10. Verificar crypto-policy (RHEL 8+)
update-crypto-policies --show

28.17 Fluxograma de Resolução de Erros

Erro de Certificado Ocorreu
    │
    ├─ Serviço não inicia?
    │   ├─ Verificar sintaxe config
    │   ├─ Verificar caminhos arquivo
    │   ├─ Verificar permissões (600 para chaves)
    │   └─ Verificar contexto SELinux
    │
    ├─ Conexão falha?
    │   ├─ Verificar firewall
    │   ├─ Verificar serviço escutando
    │   ├─ Testar com openssl s_client
    │   └─ Verificar roteamento rede
    │
    ├─ Erro validação certificado?
    │   ├─ Verificar expiração
    │   ├─ Verificar cadeia confiança
    │   ├─ Verificar coincidência hostname
    │   └─ Verificar certs intermediários
    │
    ├─ Erro cipher/protocolo?
    │   ├─ Verificar crypto-policy (RHEL 8+)
    │   ├─ Verificar versões TLS
    │   └─ Testar com versão TLS diferente
    │
    └─ Erro certmonger?
        ├─ CA_UNREACHABLE → Verificar conectividade IPA
        ├─ CA_REJECTED → Verificar se principal existe
        └─ Ver Capítulo 30

28.18 Principais Conclusões

  1. Maioria dos erros são previsíveis - Padrões comuns
  2. Sempre verificar expiração primeiro - Causa #1 de problemas
  3. Permissões importam - 600 para chaves, 644 para certs
  4. Cadeia de confiança crítica - CA ou intermediário faltando
  5. Versão RHEL importa - Erros diferentes por versão
  6. crypto-policies afetam tudo (RHEL 8+)
  7. SELinux pode bloquear - Verificar contextos
  8. Consulte o Capítulo 27 para abordagem sistemática

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA ERROS COMUNS CERTIFICADOS                      │
├──────────────────────────────────────────────────────────────────┤
│ Expirado:          Ver: openssl x509 -noout -dates               │
│                    Solução: Renovar certificado                  │
│                                                                  │
│ Confiança:         Ver: openssl verify cert.crt                  │
│                    Solução: Adicionar CA a /etc/pki/ca-trust/... │
│                                                                  │
│ Hostname:          Ver: openssl x509 -noout -ext subjectAltName  │
│                    Solução: Reemitir com SANs corretos           │
│                                                                  │
│ Permissões:        Ver: ls -lZ cert.crt key.key                  │
│                    Solução: chmod 600 key.key                    │
│                                                                  │
│ Coincidência:      Ver: Comparar MD5 de módulo                   │
│                    Solução: Regenerar CSR com chave correta      │
│                                                                  │
│ No shared cipher:  Ver: update-crypto-policies --show            │
│                    Solução: Atualizar política ou cliente        │
│                                                                  │
│ SELinux:           Ver: ausearch -m avc | grep cert              │
│                    Solução: restorecon -Rv /etc/pki/tls/         │
└──────────────────────────────────────────────────────────────────┘

Sempre começar com: Capítulo 27 (metodologia de 7 passos)

Navegação do Capítulo

Capítulo 29: Solução de Problemas Específica por Serviço

Serviço por Serviço: Cada serviço RHEL tem requisitos únicos de certificado e modos de falha. Este capítulo fornece solução de problemas direcionada para cada serviço principal.


29.1 Solução de Problemas Apache httpd

Apache Não Inicia

Passos de Diagnóstico:

#============================================#
# SOLUÇÃO DE PROBLEMAS CERTIFICADO APACHE
#============================================#

# Passo 1: Verificar status Apache
systemctl status httpd
sudo journalctl -xe -u httpd

# Passo 2: Testar configuração
sudo apachectl configtest
# Procurar por erros relacionados a SSL

# Passo 3: Verificar se mod_ssl carregado
sudo httpd -M | grep ssl
# Deveria mostrar: ssl_module (shared)

# Passo 4: Verificar arquivos de certificado
ls -l /etc/pki/tls/certs/*.crt
ls -l /etc/pki/tls/private/*.key

# Passo 5: Verificar permissões
ls -l /etc/pki/tls/private/server.key
# Deveria ser: -rw------- (600)

# Passo 6: Verificar coincidência cert/chave
CERT_MOD=$(openssl x509 -noout -modulus -in /etc/pki/tls/certs/server.crt | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in /etc/pki/tls/private/server.key | openssl md5)
[ "$CERT_MOD" = "$KEY_MOD" ] && echo "✅ Coincide" || echo "❌ Desajuste!"

# Passo 7: Verificar SELinux
sudo ausearch -m avc -ts recent | grep httpd | grep cert

Erros SSL Comuns do Apache

ErroCausaSolução
“SSLCertificateFile: file does not exist”Caminho erradoCorrigir caminho em ssl.conf
“key values mismatch”Cert/chave não pareiamRegenerar com chave correta
“unable to load certificate”Problema formato arquivoGarantir formato PEM
“Syntax error” em ssl.confErro de digitação configExecutar apachectl configtest
“unable to verify certificate”Problema cadeiaAdicionar cert intermediário

29.2 Solução de Problemas NGINX

Problemas SSL/TLS do NGINX

Passos de Diagnóstico:

#============================================#
# SOLUÇÃO DE PROBLEMAS CERTIFICADO NGINX
#============================================#

# Passo 1: Testar configuração
sudo nginx -t

# Passo 2: Mostrar config completa
sudo nginx -T | grep ssl_certificate

# Passo 3: Verificar arquivos de certificado
ls -l /etc/pki/tls/certs/nginx.crt
ls -l /etc/pki/tls/private/nginx.key

# Passo 4: Verificar par cert/chave
openssl x509 -noout -modulus -in /etc/pki/tls/certs/nginx.crt | openssl md5
openssl rsa -noout -modulus -in /etc/pki/tls/private/nginx.key | openssl md5

# Passo 5: Verificar log de erro NGINX
sudo tail -50 /var/log/nginx/error.log | grep -i ssl

# Passo 6: Verificar se NGINX rodando
systemctl status nginx
ss -tlnp | grep nginx

Erros SSL Comuns do NGINX

ErroCausaSolução
“SSL: error:0200100D”Permissão negada na chavechmod 600 na chave
“no "ssl" is defined”Faltando ssl em listenAdicionar listen 443 ssl;
“cannot load certificate”Arquivo não encontradoVerificar caminho
“PEM_read_bio:no start line”Formato erradoGarantir formato PEM
“nginx: [emerg] bind() failed”Porta em usoVerificar o que está na porta 443

29.3 Solução de Problemas Postfix

Problemas TLS do Postfix

Passos de Diagnóstico:

#============================================#
# SOLUÇÃO DE PROBLEMAS TLS POSTFIX
#============================================#

# Passo 1: Verificar config TLS Postfix
sudo postconf | grep -i tls

# Passo 2: Ver configurações específicas
sudo postconf smtpd_tls_cert_file smtpd_tls_key_file

# Passo 3: Testar configuração
sudo postfix check

# Passo 4: Verificar arquivos de certificado
ls -l $(sudo postconf -h smtpd_tls_cert_file)
ls -l $(sudo postconf -h smtpd_tls_key_file)

# Passo 5: Testar SMTP TLS
openssl s_client -starttls smtp -connect localhost:25

# Passo 6: Verificar logs de email
sudo tail -f /var/log/maillog | grep -i tls

# Passo 7: Verificar se STARTTLS oferecido
telnet localhost 25
# Digitar: EHLO test
# Deveria mostrar: 250-STARTTLS

Erros TLS Comuns do Postfix

ErroCausaSolução
“SSL_accept error”Problema cert/chaveVerificar par cert/chave
“TLS is required but not available”TLS não habilitadoDefinir security_level = may
“no shared cipher”Desajuste cipherVerificar crypto-policy
“certificate verify failed”Problema cadeiaInstalar intermediário
“Permission denied”Permissões chavechmod 600 na chave

29.4 Solução de Problemas OpenLDAP

Problemas LDAPS

Passos de Diagnóstico:

#============================================#
# SOLUÇÃO DE PROBLEMAS TLS OPENLDAP
#============================================#

# Passo 1: Verificar se slapd escutando na porta 636
ss -tlnp | grep 636

# Passo 2: Verificar configuração TLS
sudo slapcat -b "cn=config" | grep -i tls

# Passo 3: Verificar arquivos de certificado
ls -l /etc/openldap/certs/ldap.{crt,key}

# Passo 4: Verificar propriedade
# CRÍTICO: Deve ser de propriedade do usuário ldap!
ls -l /etc/openldap/certs/
# Deveria mostrar: ldap:ldap

# Passo 5: Testar conexão LDAPS
openssl s_client -connect localhost:636

# Passo 6: Testar com ldapsearch
ldapsearch -H ldaps://localhost:636 -x -b "" -s base

# Passo 7: Verificar logs slapd
sudo journalctl -u slapd | grep -i tls

Erros TLS Comuns do OpenLDAP

ErroCausaSolução
“TLS: can’t accept”Chave não legívelchown ldap:ldap na chave
“TLS: hostname does not match”Desajuste CN/SANReemitir com hostname correto
“certificate verify failed”CA não confiávelAdicionar CA ao repositório de confiança
“Permission denied”Propriedade erradachown ldap:ldap
“TLS engine not initialized”TLS não configuradoAdicionar diretivas TLS

29.5 Solução de Problemas PostgreSQL

Problemas SSL do PostgreSQL

Passos de Diagnóstico:

#============================================#
# SOLUÇÃO DE PROBLEMAS SSL POSTGRESQL
#============================================#

# Passo 1: Verificar se SSL habilitado
sudo -u postgres psql -c "SHOW ssl;"

# Passo 2: Ver configurações SSL
sudo -u postgres psql -c "SHOW ssl_cert_file; SHOW ssl_key_file;"

# Passo 3: Verificar arquivos de certificado
ls -l /var/lib/pgsql/data/server.{crt,key}

# Passo 4: Verificar propriedade
# Deve ser de propriedade do usuário postgres
ls -l /var/lib/pgsql/data/server.key
# -rw------- postgres postgres

# Passo 5: Testar conexão SSL
psql "host=localhost sslmode=require"

# Passo 6: Verificar logs PostgreSQL
sudo tail -f /var/lib/pgsql/data/log/postgresql-*.log | grep -i ssl

# Passo 7: Verificar permissões
sudo -u postgres stat /var/lib/pgsql/data/server.key

Erros SSL Comuns do PostgreSQL

ErroCausaSolução
“could not load server certificate”Permissão negadachown postgres:postgres, chmod 600
“private key file has wrong permissions”Muito permissivochmod 600 na chave
“SSL connection has been closed unexpectedly”Problema confiançaVerificar confiança CA do cliente
“SSL is not enabled”SSL desligado na configDefinir ssl = on

29.6 Solução de Problemas MySQL/MariaDB

Problemas SSL do Banco de Dados

Passos de Diagnóstico:

#============================================#
# SOLUÇÃO DE PROBLEMAS SSL MYSQL/MARIADB
#============================================#

# Passo 1: Verificar se SSL disponível
mysql -u root -p -e "SHOW VARIABLES LIKE 'have_ssl';"
# Deveria mostrar: YES

# Passo 2: Ver variáveis SSL
mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"

# Passo 3: Verificar arquivos de certificado
ls -l /etc/mysql/certs/{ca,server}.{crt,key}

# Passo 4: Verificar propriedade
# Deve ser legível pelo usuário mysql
ls -l /etc/mysql/certs/
# mysql:mysql

# Passo 5: Testar conexão SSL
mysql --ssl-mode=REQUIRED -h localhost -u root -p

# Passo 6: Verificar status da conexão
mysql -u root -p -e "STATUS" | grep SSL

# Passo 7: Verificar log de erro
sudo tail -f /var/log/mariadb/mariadb.log | grep -i ssl

29.7 Problemas Entre Serviços

Certificado Funciona em Um Serviço, Falha em Outro

Cenário: Mesmo certificado funciona no Apache mas falha no Postfix

Diagnóstico:

# Apache funciona
curl -v https://localhost/
# ✅ OK

# Postfix falha
openssl s_client -starttls smtp -connect localhost:25
# ❌ Erro

# Por quê? Requisitos diferentes!

Causas Comuns:

Causa 1: Propriedade de arquivo

  • Apache: Roda como root (pode ler chaves de propriedade root)
  • Postfix: Roda como postfix (necessita chave legível)
  • OpenLDAP: Roda como ldap (necessita chave de propriedade ldap)

Causa 2: Localizações de arquivo

  • Apache: /etc/pki/tls/
  • PostgreSQL: /var/lib/pgsql/data/
  • OpenLDAP: /etc/openldap/certs/

Causa 3: Requisitos de formato

  • Maioria dos serviços: Arquivos cert e chave separados
  • HAProxy: Arquivo PEM combinado
  • Cockpit: Cert+chave combinados

29.8 Kit de Ferramentas de Solução de Problemas

Comandos de Teste Específicos por Serviço

#============================================#
# TESTAR CADA SERVIÇO
#============================================#

# Apache HTTPS
curl -v https://localhost/
openssl s_client -connect localhost:443

# NGINX HTTPS
curl -v https://localhost:8443/  # Se porta customizada
openssl s_client -connect localhost:443

# Postfix SMTP
openssl s_client -starttls smtp -connect localhost:25
openssl s_client -connect localhost:465  # SMTPS

# Dovecot IMAP
openssl s_client -connect localhost:993  # IMAPS
openssl s_client -connect localhost:995  # POP3S

# OpenLDAP
openssl s_client -connect localhost:636  # LDAPS
ldapsearch -H ldaps://localhost:636 -x -b ""

# PostgreSQL
psql "host=localhost sslmode=require"

# MySQL/MariaDB
mysql --ssl-mode=REQUIRED -h localhost -u root -p

# Cockpit
openssl s_client -connect localhost:9090

29.9 Conclusões Chave

  1. Cada serviço tem requisitos únicos - Propriedade, localização, formato
  2. Sempre verificar logs específicos do serviço primeiro
  3. Testar com comandos específicos do serviço (não apenas openssl)
  4. Permissões críticas - Usuários diferentes para serviços diferentes
  5. Localizações de arquivo importam - Caminhos dependentes do serviço
  6. Sintaxe de configuração varia por serviço
  7. Referência capítulos de serviços (Cap 14-21) para config detalhada

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────┐
│ SOLUÇÃO DE PROBLEMAS ESPECÍFICO POR SERVIÇO          │
├──────────────────────────────────────────────────────┤
│ Apache:      apachectl configtest                    │
│              tail -f /var/log/httpd/ssl_error_log    │
│                                                      │
│ NGINX:       nginx -t                                │
│              tail -f /var/log/nginx/error.log        │
│                                                      │
│ Postfix:     postfix check                           │
│              tail -f /var/log/maillog | grep TLS     │
│                                                      │
│ OpenLDAP:    slapcat -b "cn=config" | grep TLS       │
│              journalctl -u slapd | grep TLS          │
│              chown ldap:ldap (CRÍTICO!)              │
│                                                      │
│ PostgreSQL:  psql -c "SHOW ssl;"                     │
│              chown postgres:postgres (CRÍTICO!)      │
│                                                      │
│ MySQL:       mysql -e "SHOW VARIABLES LIKE '%ssl%';" │
│              chown mysql:mysql (CRÍTICO!)            │
└──────────────────────────────────────────────────────┘

⚠️ Propriedade de arquivo é específica do serviço!
✅ Sempre verificar logs para cada serviço

Navegação do Capítulo

Capítulo 30: Solução de Problemas do certmonger

Problemas de Automação: certmonger é a ferramenta de automatização de certificados do RHEL. Quando falha, certificados não renovam. Este capítulo ensina você a diagnosticar e corrigir problemas do certmonger rapidamente.


30.1 Valores de Status do certmonger

Entendendo Mensagens de Status

StatusSignificadoAção Requerida
MONITORING✅ Tudo bem - cert emitido, rastreando expiraçãoNenhuma
SUBMITTING🔄 Solicitando cert da CAAguardar (usualmente segundos)
CA_UNREACHABLE❌ Não consegue contatar servidor CACorrigir conectividade
CA_REJECTED❌ CA recusou requisiçãoCorrigir principal/permissões
NEED_KEY_GEN_PIN⏸️ Aguardando PIN (HSM)Fornecer PIN
NEED_GUIDANCE⚠️ Necessita intervenção manualVerificar detalhes requisição
PRE_SAVE_COMMAND🔄 Executando script pre-saveAguardar
POST_SAVE_COMMAND🔄 Executando script post-saveAguardar
NEWLY_ADDED🆕 Recém adicionado, ainda não processadoAguardar

30.2 Solução de Problemas CA_UNREACHABLE

Problema Mais Comum do certmonger!

Sintoma:

sudo getcert list
# status: CA_UNREACHABLE

Passos de Diagnóstico

#============================================#
# DIAGNOSTICAR CA_UNREACHABLE
#============================================#

# Passo 1: Qual CA estamos tentando alcançar?
sudo getcert list -v | grep "CA:"
# CA: IPA

# Passo 2: Conseguimos alcançar IPA?
ipa ping
# Pong!  ← Bom
# ipa: ERROR: cannot connect to 'https://ipa.example.com/ipa/xml'  ← Ruim!

# Passo 3: Verificar ticket Kerberos
klist
# Ticket cache: FILE:/tmp/krb5cc_0
# Valid starting     Expires            Service principal
# ...

# Passo 4: Verificar se ticket expirou
klist | grep "host/"
# Se sem ticket host ou expirado → Problema!

# Passo 5: Verificar status servidor IPA
ssh ipa.example.com "sudo ipactl status"

# Passo 6: Verificar rede
ping ipa.example.com
curl -k https://ipa.example.com/ipa/config/ca.crt

# Passo 7: Verificar DNS
nslookup ipa.example.com

Soluções para CA_UNREACHABLE

Solução 1: Renovar Ticket Kerberos

# Obter novo ticket host
sudo kinit -k host/$(hostname -f)@REALM

# Verificar
klist

# Retentar requisição cert
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

Solução 2: Verificar Servidor IPA

# No servidor IPA
sudo ipactl status

# Se serviços desligados
sudo ipactl restart

# Verificar serviço específico
sudo systemctl status pki-tomcatd@pki-tomcat  # Serviço CA

Solução 3: Rede/Firewall

# Testar conectividade IPA
curl -vk https://ipa.example.com/ipa/xml

# Verificar firewall no servidor IPA
ssh ipa.example.com "sudo firewall-cmd --list-services | grep https"

# Verificar rotas
traceroute ipa.example.com

Solução 4: Reiniciar certmonger

sudo systemctl restart certmonger

# Aguardar um momento
sleep 10

# Verificar status
sudo getcert list

30.3 Solução de Problemas CA_REJECTED

Quando CA Recusa a Requisição

Sintoma:

sudo getcert list -v
# status: CA_REJECTED
# ca-error: Server at https://ipa.example.com/ipa/xml unwilling to issue certificate

Passos de Diagnóstico

#============================================#
# DIAGNOSTICAR CA_REJECTED
#============================================#

# Passo 1: Verificar detalhes do erro
sudo getcert list -v -f /etc/pki/tls/certs/web.crt
# Procurar campo 'ca-error'

# Passo 2: Principal de serviço existe?
ipa service-show HTTP/$(hostname -f)
# Se erro: Service not found

# Passo 3: Host está registrado?
ipa host-show $(hostname -f)

# Passo 4: Verificar se perfil certificado existe
sudo getcert list -v | grep "profile:"
ipa certprofile-show caIPAserviceCert

# Passo 5: Verificar detalhes da requisição
sudo getcert list -v | grep -A30 "Request ID"

Soluções para CA_REJECTED

Solução 1: Criar Principal de Serviço

# Adicionar principal de serviço faltando
ipa service-add HTTP/$(hostname -f)

# Adicionar SAN (se necessário)
ipa service-mod HTTP/$(hostname -f) --addattr=cn=web.example.com

# Retentar
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

Solução 2: Corrigir Entrada Host

# Re-registrar no IPA se necessário
sudo ipa-client-install --force-join

# Verificar
ipa host-show $(hostname -f)

Solução 3: Verificar Permissões

# Verificar se você tem permissão para solicitar certs
ipa permission-find --name="Request Certificate"

# Verificar ACLs
ipa aci-find --name="*cert*"

# Pode necessitar admin IPA para conceder permissões

30.4 Falhas de Renovação

Certificado Não Renovando

Sintoma: Certificado aproximando-se de expiração mas não renovando

Diagnóstico:

#============================================#
# DIAGNOSTICAR FALHA DE RENOVAÇÃO
#============================================#

# Passo 1: Verificar status atual
sudo getcert list -f /etc/pki/tls/certs/web.crt

# Passo 2: Quando deveria renovar?
# certmonger renova em 2/3 do tempo de vida cert
# cert de 365 dias → renova no dia 243 (122 dias antes expiração)

# Passo 3: Verificar logs certmonger
sudo journalctl -u certmonger --since "7 days ago" | grep -i renew

# Passo 4: Forçar tentativa de renovação
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

# Passo 5: Observar logs em tempo real
sudo journalctl -u certmonger -f

Problemas Comuns de Renovação

Problema 1: Comando post-save falha

# Verificar comando post-save
sudo getcert list -f /etc/pki/tls/certs/web.crt | grep "post-save"
# post-save command: systemctl reload httpd

# Testar comando manualmente
sudo systemctl reload httpd
# Se falha → corrigir o comando

# Atualizar comando (recriar entrada de rastreamento; não use getcert rekey)
sudo getcert stop-tracking -f /etc/pki/tls/certs/web.crt
sudo getcert start-tracking \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -C "systemctl reload httpd"

Problema 2: Servidor IPA desligado durante janela renovação

# certmonger vai retentar
# Verificar cronograma de retentativa nos logs
sudo journalctl -u certmonger | grep "will try again"

# Retentativa manual
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

30.5 Problemas de Rastreamento

Certificado Não Sendo Rastreado

Sintoma: Certificado expira porque certmonger não estava rastreando

Solução:

#============================================#
# INICIAR RASTREAMENTO CERTIFICADO EXISTENTE
#============================================#

sudo getcert start-tracking \
  -f /etc/pki/tls/certs/existing.crt \
  -k /etc/pki/tls/private/existing.key \
  -c IPA \
  -K HTTP/$(hostname -f)@REALM

Rastreamento Duplicado

Sintoma: Mesmo certificado rastreado múltiplas vezes

Diagnóstico:

# Listar todos certs rastreados
sudo getcert list | grep -E "(Request ID|certificate:)" | \
  awk -F"'" '/certificate:/{cert=$2} /Request ID/{print cert, $2}'

# Procurar por duplicados

Solução:

# Remover rastreamento duplicado
sudo getcert stop-tracking -i <duplicate-request-id>

# Manter apenas uma entrada rastreamento por certificado

30.6 Problemas de Configuração

CA Errada Configurada

Sintoma: certmonger tentando alcançar CA errada

Diagnóstico:

# Verificar CA configurada
sudo getcert list -v | grep "CA:"

# Listar CAs disponíveis
sudo getcert list-cas

Solução:

# Parar rastreamento com CA errada
sudo getcert stop-tracking -f /etc/pki/tls/certs/web.crt

# Re-solicitar com CA correta
sudo ipa-getcert request \
  -c IPA \  # Especificar CA correta
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -K HTTP/$(hostname -f)@REALM

30.7 Corrupção de Banco de Dados certmonger

Problema Raro mas Sério

Sintoma: certmonger completamente quebrado, todos certs mostram erros

Diagnóstico:

# Verificar banco de dados
ls -l /var/lib/certmonger/

# Verificar por corrupção
sudo journalctl -u certmonger | grep -i corrupt

Solução (Opção Nuclear):

# CUIDADO: Isto remove todo rastreamento!

# Passo 1: Backup estado atual
sudo tar czf certmonger-backup-$(date +%Y%m%d).tar.gz \
  /var/lib/certmonger/ \
  /etc/pki/tls/

# Passo 2: Documentar rastreamento atual
sudo getcert list > /tmp/certmonger-list-backup.txt

# Passo 3: Parar certmonger
sudo systemctl stop certmonger

# Passo 4: Remover banco de dados
sudo rm -rf /var/lib/certmonger/cas/*
sudo rm -rf /var/lib/certmonger/requests/*

# Passo 5: Iniciar certmonger
sudo systemctl start certmonger

# Passo 6: Re-adicionar certificados (da documentação backup)
# Manualmente re-solicitar cada certificado

30.8 Debugging certmonger

Habilitar Logging de Debug

#============================================#
# MODO DEBUG CERTMONGER
#============================================#

# Editar arquivo service
sudo systemctl edit certmonger

# Adicionar:
[Service]
Environment="G_MESSAGES_DEBUG=all"

# Recarregar e reiniciar
sudo systemctl daemon-reload
sudo systemctl restart certmonger

# Observar logs detalhados
sudo journalctl -u certmonger -f

# Desabilitar debug após solução de problemas
sudo systemctl revert certmonger
sudo systemctl restart certmonger

Teste Manual de Requisição Cert

#============================================#
# TESTAR REQUISIÇÃO CERTIFICADO MANUALMENTE
#============================================#

# Submeter requisição e observar
sudo ipa-getcert request \
  -f /tmp/test.crt \
  -k /tmp/test.key \
  -K HTTP/$(hostname -f)@REALM \
  -v  # Verbose

# Observar em outro terminal
sudo journalctl -u certmonger -f

# Se bem-sucedido, remover teste
sudo getcert stop-tracking -f /tmp/test.crt -r
rm -f /tmp/test.{crt,key}

30.9 Cenários Comuns

Cenário 1: Todos Certificados Mostram CA_UNREACHABLE

Causa Provável: Servidor IPA desligado ou problema de rede

Correção Rápida:

# Verificar IPA
ipa ping

# Se desligado, corrigir IPA primeiro
ssh ipa-server "sudo ipactl start"

# Se problema de rede, corrigir rede

# Reiniciar certmonger
sudo systemctl restart certmonger

Cenário 2: Um Certificado Travado

Diagnóstico:

# Verificar certificado específico
sudo getcert list -f /etc/pki/tls/certs/problem.crt

# Tentar reenviar
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/problem.crt

# Se ainda travado, recriar requisição
sudo getcert stop-tracking -f /etc/pki/tls/certs/problem.crt
sudo ipa-getcert request \
  -f /etc/pki/tls/certs/problem.crt \
  -k /etc/pki/tls/private/problem.key \
  -K HTTP/$(hostname -f)@REALM \
  -D $(hostname -f)

Cenário 3: Certificado Renovado mas Serviço Não Recarregado

Sintoma: Novo cert existe mas serviço ainda usa antigo

Causa: Comando post-save falhou ou não configurado

Solução:

# Verificar comando post-save
sudo getcert list -f /etc/pki/tls/certs/web.crt | grep "post-save"

# Se faltando, adicionar (recriar entrada de rastreamento; não use getcert rekey)
sudo getcert stop-tracking -f /etc/pki/tls/certs/web.crt
sudo getcert start-tracking \
  -f /etc/pki/tls/certs/web.crt \
  -k /etc/pki/tls/private/web.key \
  -C "systemctl reload httpd"

# Testar comando post-save funciona
sudo systemctl reload httpd

# Forçar renovação para testar
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/web.crt

30.10 Conclusões Chave

  1. CA_UNREACHABLE é problema mais comum - Verificar conectividade IPA
  2. CA_REJECTED significa problema principal - Criar principal de serviço
  3. Status MONITORING significa que está tudo bem
  4. Comandos post-save críticos - Testá-los independentemente
  5. Logs certmonger no journal - Usar journalctl -u certmonger
  6. Retentar com resubmit - Frequentemente corrige problemas transitórios
  7. Verificar tickets Kerberos - Tickets expirados causam problemas

Cartão de Referência Rápida

┌───────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA SOLUÇÃO DE PROBLEMAS CERTMONGER             │
├───────────────────────────────────────────────────────────────┤
│ Status:          getcert list                                 │
│ Verbose:         getcert list -v                              │
│ Específico:      getcert list -f /path/to/cert.crt            │
│ Logs:            journalctl -u certmonger -f                  │
│                                                               │
│ Reenviar:        ipa-getcert resubmit -f /path/to/cert.crt    │
│ Parar rastr:     getcert stop-tracking -f /path/to/cert.crt   │
│ Iniciar rastr:   getcert start-tracking -f cert -k key        │
│                                                               │
│ CA_UNREACHABLE:  Verificar: ipa ping, klist                   │
│                  Corrigir: kinit -k host/$(hostname -f)@REALM │
│                                                               │
│ CA_REJECTED:     Verificar: ipa service-show SERVICE/host     │
│                  Corrigir: ipa service-add SERVICE/host       │
│                                                               │
│ Debug:           systemctl edit certmonger                    │
│                  Environment="G_MESSAGES_DEBUG=all"           │
└───────────────────────────────────────────────────────────────┘

✅ MONITORING = Tudo bem!
❌ CA_UNREACHABLE = Verificar conectividade IPA
❌ CA_REJECTED = Verificar principal de serviço

Navegação do Capítulo

Capítulo 31: Solução de Problemas Crypto-Policy

Apenas RHEL 8/9/10: Crypto-policies são poderosas mas podem causar problemas de compatibilidade. Aprenda como diagnosticar e corrigir problemas de crypto-policy.


31.1 Visão Geral Crypto-Policy

Disponível: Apenas RHEL 8, 9, 10 (NÃO RHEL 7)

Verificação Rápida:

# Verificar se crypto-policies disponíveis
which update-crypto-policies

# Se encontrado: RHEL 8/9/10
# Se não encontrado: RHEL 7 (sem crypto-policies)

# Política atual
update-crypto-policies --show

31.2 Problemas Comuns de Crypto-Policy

Problema 1: Aplicação Falha Após Mudança de Política

Sintoma: Serviço funcionava, então você mudou crypto-policy, agora falha

Cenário:

# Antes
update-crypto-policies --show
# DEFAULT

# Você mudou
sudo update-crypto-policies --set FUTURE
sudo systemctl restart httpd

# Agora httpd não inicia ou clientes não conseguem conectar

Diagnóstico:

#============================================#
# DIAGNOSTICAR IMPACTO MUDANÇA POLÍTICA
#============================================#

# Passo 1: Verificar o que mudou
cat /etc/crypto-policies/back-ends/opensslcnf.config

# Passo 2: Verificar logs
sudo journalctl -xe -u httpd | grep -i cipher

# Passo 3: Testar conexão
openssl s_client -connect localhost:443

# Passo 4: Verificar se app sobrescrevendo política
grep -r "SSLProtocol\|SSLCipherSuite" /etc/httpd/

Solução:

# Solução 1: Reverter política
sudo update-crypto-policies --set DEFAULT
sudo systemctl restart httpd

# Solução 2: Corrigir config aplicação
# Remover especificações cipher codificadas
# Deixar crypto-policy lidar com isso

# Solução 3: Criar módulo política customizado (RHEL 9+)
# Ver Capítulo 23 para detalhes

Problema 2: “no shared cipher”

Sintoma: Clientes não conseguem conectar após mudança política

Erro Completo:

SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
no shared cipher

Diagnóstico:

#============================================#
# DIAGNOSTICAR DESAJUSTE CIPHER
#============================================#

# Passo 1: Verificar política atual
update-crypto-policies --show
# FUTURE  ← Muito restritiva!

# Passo 2: Quais ciphers estão disponíveis?
openssl ciphers -v | head -20

# Passo 3: Testar capacidades cliente
openssl s_client -connect server:443 -cipher 'ALL'

# Passo 4: Cliente é muito antigo?
# Cliente antigo pode suportar apenas ciphers fracos bloqueados por política FUTURE

Soluções:

# Solução 1: Usar política menos restritiva (temporário!)
sudo update-crypto-policies --set DEFAULT
sudo systemctl restart services

# Solução 2: Atualizar cliente para suportar ciphers modernos

# Solução 3: Criar módulo política customizado
# Permitir cipher específico para compatibilidade

Problema 3: Cliente TLS 1.0/1.1 Não Consegue Conectar

Sintoma: Clientes antigos falham ao conectar ao servidor RHEL 8+

Erro:

SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
wrong version number

Diagnóstico:

# Verificar política
update-crypto-policies --show
# DEFAULT  ← Bloqueia TLS 1.0/1.1

# Testar se TLS 1.0 funciona
openssl s_client -connect server:443 -tls1
# Deveria falhar com política DEFAULT

# Testar se TLS 1.2 funciona
openssl s_client -connect server:443 -tls1_2
# Deveria funcionar

Soluções:

# Solução 1: Política LEGACY temporária (NÃO recomendado!)
sudo update-crypto-policies --set LEGACY
sudo systemctl restart services
# Agora TLS 1.0/1.1 permitidos

# Solução 2: Atualizar cliente para suportar TLS 1.2+
# Esta é a correção APROPRIADA

# Solução 3: Override por aplicação (último recurso)
# Exemplo Apache:
# SSLProtocol all -SSLv3  # Re-habilita TLS 1.0/1.1

Problema 4: Serviço Sobrescrevendo Crypto-Policy

Sintoma: Mudanças de política não afetam serviço

Diagnóstico:

#============================================#
# VERIFICAR POR OVERRIDES DE POLÍTICA
#============================================#

# Apache
grep -r "SSLProtocol\|SSLCipherSuite" /etc/httpd/

# NGINX
grep -r "ssl_protocols\|ssl_ciphers" /etc/nginx/

# Postfix
sudo postconf | grep -E "smtp.*_tls_protocols|smtp.*_tls_ciphers"

# Se encontrado → Serviço está sobrescrevendo política!

Solução:

# Remover overrides de arquivos config
# Deixar crypto-policy lidar com ajustes TLS

# Apache: Remover ou comentar
# #SSLProtocol all -SSLv3
# #SSLCipherSuite ...

# NGINX: Remover
# #ssl_protocols ...
# #ssl_ciphers ...

# Reiniciar serviço
sudo systemctl restart httpd

31.3 Crypto-Policy Não Aplicada

Política Definida Mas Não Surtindo Efeito

Sintomas:

  • Mudou política mas serviços ainda usam ajustes antigos
  • Ciphers fracos ainda aceitos

Diagnóstico:

#============================================#
# VERIFICAR SE POLÍTICA ESTÁ ATIVA
#============================================#

# Passo 1: Confirmar política definida
update-crypto-policies --show

# Passo 2: Verificar quando política foi atualizada pela última vez
ls -l /etc/crypto-policies/back-ends/

# Passo 3: Verificar se serviços foram reiniciados
systemctl status httpd nginx postfix | grep "Active:"
# Serviços DEVEM ser reiniciados após mudança política!

# Passo 4: Testar ciphers reais em uso
openssl s_client -connect localhost:443 | grep "Cipher"

Solução:

# Reiniciar TODOS serviços
sudo systemctl restart httpd nginx postfix slapd

# Ou reiniciar (garante que tudo pega as mudanças)
sudo reboot

# Verificar após reinício
openssl s_client -connect localhost:443

31.4 Problemas de Política FIPS

Falhas de Política FIPS

Sintoma: Serviços falham em modo FIPS

Diagnóstico:

#============================================#
# DIAGNOSTICAR PROBLEMAS FIPS
#============================================#

# Passo 1: Verificar modo FIPS habilitado
fips-mode-setup --check

# Passo 2: Verificar crypto-policy
update-crypto-policies --show
# Deveria mostrar: FIPS

# Passo 3: Verificar por algoritmos não-FIPS
# Culpados comuns: MD5, SHA-1, ciphers fracos

# Passo 4: Testar com provider FIPS
openssl list -providers | grep fips

Problemas Comuns FIPS:

# Problema: Aplicação usa MD5 (não aprovado FIPS)
# Erro: "digital envelope routines:EVP_DigestInit_ex:disabled for fips"

# Solução: Atualizar aplicação para usar SHA-256

# Problema: Certificado tem assinatura SHA-1
# Erro: "ca md too weak"

# Solução: Reemitir certificado com SHA-256 ou melhor

31.5 Teste de Compatibilidade de Política

Antes de Mudar Política

#!/bin/bash
# test-crypto-policy-change.sh
# Testar mudança crypto-policy antes de produção

NEW_POLICY=$1  # DEFAULT, LEGACY, FUTURE, ou FIPS

if [ -z "$NEW_POLICY" ]; then
  echo "Uso: $0 <política>"
  exit 1
fi

echo "=== Testando Mudança Crypto-Policy para $NEW_POLICY ==="

# Salvar política atual
CURRENT=$(update-crypto-policies --show)
echo "Política atual: $CURRENT"

# Mudar política
echo "Mudando para $NEW_POLICY..."
sudo update-crypto-policies --set "$NEW_POLICY"

# Reiniciar serviços
echo "Reiniciando serviços..."
sudo systemctl restart httpd nginx postfix 2>/dev/null

# Aguardar serviços iniciarem
sleep 3

# Testar cada serviço
echo ""
echo "Testando serviços:"

# Apache
if systemctl is-active --quiet httpd; then
  curl -ks https://localhost/ >/dev/null && \
    echo "✅ Apache: OK" || echo "❌ Apache: FALHOU"
else
  echo "❌ Apache: Não rodando"
fi

# NGINX
if systemctl is-active --quiet nginx; then
  curl -ks https://localhost:8443/ >/dev/null && \
    echo "✅ NGINX: OK" || echo "❌ NGINX: FALHOU"
else
  echo "⚠️ NGINX: Não instalado"
fi

# Postfix
if systemctl is-active --quiet postfix; then
  timeout 3 openssl s_client -starttls smtp -connect localhost:25 </dev/null &>/dev/null && \
    echo "✅ Postfix: OK" || echo "❌ Postfix: FALHOU"
else
  echo "⚠️ Postfix: Não instalado"
fi

# Perguntar para manter ou reverter
echo ""
read -p "Manter política $NEW_POLICY? (y/n): " KEEP

if [ "$KEEP" != "y" ]; then
  echo "Revertendo para $CURRENT..."
  sudo update-crypto-policies --set "$CURRENT"
  sudo systemctl restart httpd nginx postfix 2>/dev/null
  echo "✅ Revertido"
else
  echo "✅ Mantendo política $NEW_POLICY"
fi

31.6 Fluxo de Trabalho de Solução de Problemas

Abordagem Sistemática

Problema Crypto-Policy?
    │
    ├─ Passo 1: Identificar política atual
    │   └─ update-crypto-policies --show
    │
    ├─ Passo 2: Verificar se política mudou recentemente
    │   └─ Verificar /var/log/messages para "crypto-policies"
    │
    ├─ Passo 3: Testar com política diferente
    │   └─ sudo update-crypto-policies --set LEGACY
    │   └─ Se funciona → política estava muito restritiva
    │
    ├─ Passo 4: Identificar incompatibilidade
    │   └─ openssl s_client -cipher 'ALL' -tls1
    │   └─ Descobrir o que cliente/servidor necessita
    │
    ├─ Passo 5: Escolher correção
    │   ├─ A) Atualizar cliente (melhor)
    │   ├─ B) Criar módulo customizado (bom)
    │   ├─ C) Usar política menos restritiva (aceitável)
    │   └─ D) Override por app (último recurso)
    │
    └─ Passo 6: Testar e documentar
        └─ Verificar que correção funciona
        └─ Documentar por que mudança necessária

31.7 Debugging Aplicação Crypto-Policy

Verificar Que Política Está Aplicada

#============================================#
# VERIFICAR APLICAÇÃO CRYPTO-POLICY
#============================================#

# Passo 1: Verificar política
update-crypto-policies --show

# Passo 2: Verificar que arquivos back-end foram atualizados
ls -l /etc/crypto-policies/back-ends/
# Arquivos devem estar modificados recentemente

# Passo 3: Ver configuração OpenSSL
cat /etc/crypto-policies/back-ends/opensslcnf.config

# Passo 4: Testar disponibilidade real de cipher
openssl ciphers -v | grep -E "TLS|SSL"

# Passo 5: Testar conexão
openssl s_client -connect localhost:443
# Procurar por: Versão protocolo, Cipher

# Passo 6: Verificar se serviço reiniciou desde mudança política
systemctl status httpd | grep "Active:"
# Deveria mostrar tempo ativação recente

31.8 Cenários Comuns

Cenário 1: Aplicação Legada Após Atualização RHEL 8

Problema: App funcionava no RHEL 7, falha no RHEL 8

Causa Raiz: RHEL 7 não tinha crypto-policies, DEFAULT do RHEL 8 bloqueia TLS 1.0/1.1

Solução:

# Correção rápida (temporária!):
sudo update-crypto-policies --set LEGACY

# Correção apropriada:
# Atualizar aplicação para suportar TLS 1.2+

# Documentar exceção
echo "Aplicação X requer política LEGACY devido a requisito TLS 1.0" > \
  /etc/crypto-policies/POLICY-EXCEPTION.txt

Cenário 2: Não Consegue Conectar ao Windows Server 2008

Problema: RHEL 9 não consegue conectar ao servidor Windows antigo

Causa: Windows Server 2008 suporta apenas TLS 1.0

Soluções:

# Opção 1: Atualizar Windows (melhor)

# Opção 2: Política LEGACY (temporário)
sudo update-crypto-policies --set LEGACY

# Opção 3: Módulo política customizado para este caso específico
# Ver Capítulo 23

31.9 Conclusões Chave

  1. Crypto-policies são apenas RHEL 8+ (não RHEL 7)
  2. Serviços DEVEM reiniciar após mudança política
  3. Mudanças política são system-wide - Afetam tudo
  4. DEFAULT é recomendado para maioria ambientes
  5. LEGACY deve ser temporária apenas
  6. Testar antes de implantar novas políticas
  7. Atualizar clientes em vez de enfraquecer política

Cartão de Referência Rápida

┌─────────────────────────────────────────────────────────────┐
│ SOLUÇÃO DE PROBLEMAS CRYPTO-POLICY                          │
├─────────────────────────────────────────────────────────────┤
│ Verificar:     update-crypto-policies --show                │
│ Definir:       sudo update-crypto-policies --set <POLÍTICA> │
│ Reverter:      sudo update-crypto-policies --set DEFAULT    │
│                                                             │
│ Back-ends:     /etc/crypto-policies/back-ends/              │
│ OpenSSL:       cat .../back-ends/opensslcnf.config          │
│                                                             │
│ Testar:        openssl ciphers -v                           │
│                openssl s_client -connect :443               │
│                                                             │
│ Após mudança:  sudo systemctl restart <todos-serviços>      │
│                OU: sudo reboot                              │
│                                                             │
│ Debug:         grep -r "SSLProtocol\|ssl_protocols" /etc/   │
│                (procurar por overrides)                     │
└─────────────────────────────────────────────────────────────┘

⚠️ RHEL 7 não tem crypto-policies
✅ Sempre reiniciar serviços após mudança política
✅ DEFAULT funciona para 95% dos casos

Navegação do Capítulo

Capítulo 32: Análise de Relatórios SOS

Essencial para Suporte: Relatórios SOS são a ferramenta de diagnóstico de sistema do RHEL. Aprenda como extrair informações de certificado de relatórios SOS para solução de problemas.


32.1 O Que é um Relatório SOS?

sosreport é a ferramenta de coleta de dados diagnósticos da Red Hat.

Contém:

  • ✅ Arquivos de configuração do sistema
  • ✅ Arquivos de log
  • ✅ Saídas de comandos
  • ✅ Listas de pacotes
  • ✅ Informações de certificado
  • ✅ Configurações de segurança
  • ❌ Chaves privadas (excluídas por segurança!)

Casos de Uso:

  • Abrir casos de suporte Red Hat
  • Análise pós-incidente
  • Auditorias pré-migração
  • Verificações de conformidade segurança

32.2 Gerando um Relatório SOS

Geração Básica de Relatório SOS

#============================================#
# GERAR RELATÓRIO SOS
#============================================#

# Instalar sos (usualmente pré-instalado)
sudo dnf install sos -y

# Gerar relatório
sudo sos report

# Prompts interativos:
# - ID do Caso (opcional)
# - Descrição
# - Confirmar

# Saída:
# /var/tmp/sosreport-hostname-YYYYMMDDHHMMSS.tar.xz

# Extrair
tar xf /var/tmp/sosreport-*.tar.xz
cd sosreport-*/

Relatório SOS com Foco em Certificados

#============================================#
# RELATÓRIO SOS COM FOCO EM CERTIFICADOS
#============================================#

# Gerar com plugins específicos
sudo sos report \
  --batch \
  --enable-plugins crypto,openssl,certmonger,freeipa \
  --case-id "CASE12345"

# Ou especificar o que incluir
sudo sos report \
  --batch \
  -o crypto \
  -o openssl \
  -o certmonger \
  -o pki

32.3 Encontrando Informações de Certificado no SOS

Localizações Chave no Relatório SOS

#============================================#
# ARQUIVOS RELACIONADOS A CERTIFICADOS NO RELATÓRIO SOS
#============================================#

# Após extrair sosreport-*.tar.xz:
cd sosreport-*/

# Arquivos de certificado (apenas públicos, sem chaves privadas!)
ls -la etc/pki/tls/certs/
ls -la etc/pki/ca-trust/source/anchors/

# Rastreamento certmonger
cat sos_commands/certmonger/getcert_list

# Versão OpenSSL
cat sos_commands/crypto/openssl_version

# Crypto-policy (RHEL 8+)
cat sos_commands/crypto/update-crypto-policies_--show

# Repositório de confiança
ls -la etc/pki/ca-trust/extracted/

# Configurações de serviços
cat etc/httpd/conf.d/ssl.conf
cat etc/nginx/nginx.conf
cat etc/postfix/main.cf | grep tls

# Verificação expiração certificado
cat sos_commands/crypto/openssl_x509_-in_*

# Info sistema
cat etc/redhat-release
cat sos_commands/kernel/uname_-a

32.4 Analisando Problemas de Certificado do SOS

Análise de Expiração de Certificado

#============================================#
# VERIFICAR EXPIRAÇÃO CERTIFICADO NO SOS
#============================================#

# Navegar para diretório relatório SOS
cd sosreport-hostname-*/

# Encontrar todas saídas de inspeção certificado
find sos_commands/crypto/ -name "*x509*" -type f

# Verificar cada certificado
for cert_output in sos_commands/crypto/openssl_x509_*.txt; do
  echo "=== $cert_output ==="
  grep -E "(Subject:|Not After)" "$cert_output"
  echo ""
done

# Ou extrair datas de expiração
grep -r "Not After" sos_commands/crypto/ | sort

Análise de Status certmonger

#============================================#
# ANALISAR CERTMONGER DO SOS
#============================================#

# Saída lista certmonger
cat sos_commands/certmonger/getcert_list

# Procurar por:
# - status: CA_UNREACHABLE  ← Problema!
# - status: CA_REJECTED     ← Problema!
# - expires: <data>         ← Verificar se em breve

# Contar certificados por status
grep "status:" sos_commands/certmonger/getcert_list | sort | uniq -c

# Encontrar certificados problemáticos
grep -B10 "CA_UNREACHABLE\|CA_REJECTED" sos_commands/certmonger/getcert_list

Análise Crypto-Policy (RHEL 8+)

#============================================#
# VERIFICAR CRYPTO-POLICY NO SOS
#============================================#

# Política atual
cat sos_commands/crypto/update-crypto-policies_--show

# Verificar por overrides
grep -r "SSLProtocol\|SSLCipherSuite" etc/httpd/
grep -r "ssl_protocols\|ssl_ciphers" etc/nginx/
grep -r "tls_protocols" etc/postfix/main.cf

# Se overrides encontrados: Documentar que serviço opta por sair de crypto-policy

32.5 Descobertas Comuns em Relatórios SOS

Descoberta 1: Certificados Expirados

No Relatório SOS:

# Verificar expirações de certificados
grep "Not After" sos_commands/crypto/* | \
  while read line; do
    # Analisar e verificar se expirado
    echo "$line"
  done

Sinais de Alerta:

  • Certificados expirados antes de geração relatório SOS
  • Certificados expirando dentro de 30 dias
  • Múltiplos certificados expirados

Descoberta 2: Problemas certmonger

No Relatório SOS:

# Verificar status certmonger
cat sos_commands/certmonger/getcert_list | grep -A15 "Request ID"

# Problemas comuns:
# - Múltiplos CA_UNREACHABLE (problema conectividade IPA)
# - CA_REJECTED (problema permissões/principal)
# - Datas expiração antigas sem renovação (certmonger não funcionando)

Descoberta 3: Certificados Intermediários Faltando

No Relatório SOS:

# Verificar cadeia certificado
# Se config serviço aponta para cert sem intermediário:
grep "SSLCertificateFile" etc/httpd/conf.d/ssl.conf
# /etc/pki/tls/certs/server.crt  ← Verificar se isto inclui cadeia

# Verificar certificado real
openssl x509 -in etc/pki/tls/certs/server.crt -noout -text
# Procurar por: Issuer (se não bem conhecido, necessita intermediário)

32.6 Lista de verificação de certificados em relatórios SOS

Análise Sistemática

## Lista de verificação de análise de certificados em relatórios SOS

### Informação Sistema
- [ ] Versão RHEL (`cat etc/redhat-release`)
- [ ] Versão OpenSSL (`cat sos_commands/crypto/openssl_version`)
- [ ] Crypto-policy (`cat sos_commands/crypto/update-crypto-policies*`)
- [ ] Modo FIPS (`grep FIPS sos_commands/crypto/*`)

### Arquivos Certificado
- [ ] Listar certificados (`ls etc/pki/tls/certs/`)
- [ ] Verificar permissões (`ls -la etc/pki/tls/private/`)
- [ ] Verificar propriedade
- [ ] Verificar contextos SELinux (`ls -Z etc/pki/tls/`)

### Validade Certificado
- [ ] Verificar expirações (`grep "Not After" sos_commands/crypto/*`)
- [ ] Identificar certificados expirados
- [ ] Identificar certificados expirando em breve (< 30 dias)
- [ ] Verificar algoritmos assinatura (SHA-1 = problema no RHEL 9+)

### Status certmonger (se usado)
- [ ] certmonger rodando? (`cat sos_commands/systemd/systemctl_list-units`)
- [ ] Certificados rastreados (`cat sos_commands/certmonger/getcert_list`)
- [ ] Algum CA_UNREACHABLE ou CA_REJECTED?
- [ ] Cronograma renovação apropriado?

### Configurações Serviço
- [ ] Config SSL Apache (`cat etc/httpd/conf.d/ssl.conf`)
- [ ] Config SSL NGINX (`cat etc/nginx/nginx.conf`)
- [ ] Config TLS Postfix (`grep tls etc/postfix/main.cf`)
- [ ] Config TLS OpenLDAP
- [ ] Caminhos certificado corretos?

### Repositório de Confiança
- [ ] CAs customizadas (`ls etc/pki/ca-trust/source/anchors/`)
- [ ] Bundle trust atualizado
- [ ] Certs na lista negra (RHEL 8+)

### Logs
- [ ] Erros certificado recentes (`grep -i cert var/log/messages`)
- [ ] Erros SSL/TLS em logs serviço
- [ ] Negações SELinux (`grep AVC var/log/audit/audit.log | grep cert`)

### Recomendações
- [ ] Listar problemas certificado encontrados
- [ ] Priorizar por severidade
- [ ] Sugerir passos de remediação

32.7 Script Análise SOS Automatizada

Localizador de Problemas de Certificado

#!/bin/bash
# analyze-sos-certificates.sh
# Detecção automatizada de problemas certificado em relatórios SOS

SOS_DIR=$1

if [ -z "$SOS_DIR" ] || [ ! -d "$SOS_DIR" ]; then
  echo "Uso: $0 /path/to/sosreport-directory"
  exit 1
fi

cd "$SOS_DIR"

echo "=== Análise Certificado Relatório SOS ==="
echo "Relatório: $(basename $SOS_DIR)"
echo ""

# Info sistema
echo "Informação Sistema:"
echo "  Versão RHEL: $(cat etc/redhat-release 2>/dev/null)"
echo "  OpenSSL: $(cat sos_commands/crypto/openssl_version 2>/dev/null | head -2)"
if [ -f sos_commands/crypto/update-crypto-policies_--show ]; then
  echo "  Crypto-Policy: $(cat sos_commands/crypto/update-crypto-policies_--show)"
fi
echo ""

# Expiração certificado
echo "Expiração Certificado:"
if [ -d sos_commands/crypto ]; then
  grep -h "Not After" sos_commands/crypto/openssl_x509_* 2>/dev/null | \
    while read line; do
      echo "  $line"
    done
else
  echo "  Nenhum dado certificado encontrado"
fi
echo ""

# Status certmonger
echo "Status certmonger:"
if [ -f sos_commands/certmonger/getcert_list ]; then
  STATUS_COUNT=$(grep "status:" sos_commands/certmonger/getcert_list | sort | uniq -c)
  echo "$STATUS_COUNT"

  # Destacar problemas
  if grep -q "CA_UNREACHABLE\|CA_REJECTED" sos_commands/certmonger/getcert_list; then
    echo "  ⚠️ Problemas encontrados:"
    grep -B5 "CA_UNREACHABLE\|CA_REJECTED" sos_commands/certmonger/getcert_list | \
      grep -E "(Request ID|status:)" | head -20
  fi
else
  echo "  certmonger não instalado ou sem dados"
fi
echo ""

# Verificar por problemas comuns
echo "Problemas Potenciais:"
ISSUES=0

# Certs expirados (verificação básica)
if grep -q "Not After.*202[0-3]" sos_commands/crypto/* 2>/dev/null; then
  echo "  ⚠️ Certificados potencialmente expirados encontrados"
  ((ISSUES++))
fi

# Problemas certmonger
if grep -q "CA_UNREACHABLE" sos_commands/certmonger/getcert_list 2>/dev/null; then
  echo "  ⚠️ Status CA_UNREACHABLE certmonger encontrado"
  ((ISSUES++))
fi

# Negações SELinux
if grep -q "avc.*denied.*cert" var/log/audit/audit.log 2>/dev/null; then
  echo "  ⚠️ Negações SELinux relacionadas a certificados"
  ((ISSUES++))
fi

if [ $ISSUES -eq 0 ]; then
  echo "  ✅ Nenhum problema óbvio detectado"
fi

echo ""
echo "=== Análise Completa ==="

32.8 Arquivos Chave para Verificar no SOS

Arquivos Críticos de Certificado

sosreport-hostname-YYYYMMDDHHMMSS/
├── etc/
│   ├── pki/
│   │   ├── tls/certs/                     ← Certificados (públicos)
│   │   ├── ca-trust/                      ← Repositório de confiança
│   │   └── nssdb/                         ← Bancos dados NSS
│   ├── httpd/conf.d/ssl.conf              ← Config Apache
│   ├── nginx/nginx.conf                   ← Config NGINX
│   └── postfix/main.cf                    ← Config Postfix
│
├── sos_commands/
│   ├── crypto/
│   │   ├── openssl_version                ← Versão OpenSSL
│   │   ├── openssl_x509_*                 ← Inspeções certificado
│   │   └── update-crypto-policies_--show  ← Política
│   │
│   ├── certmonger/
│   │   └── getcert_list                   ← Status certmonger
│   │
│   ├── systemd/
│   │   └── systemctl_list-units           ← Status serviço
│   │
│   └── networking/
│       └── ss_-tulpn                      ← Portas escutando
│
└── var/log/
    ├── messages                           ← Log sistema
    ├── httpd/ssl_error_log                ← Erros SSL Apache
    └── audit/audit.log                    ← Negações SELinux

32.9 Cenários Comuns de Relatório SOS

Cenário 1: Website Fora - Problema de Certificado?

Passos de Análise:

# 1. Verificar se httpd estava rodando
grep "httpd.service" sos_commands/systemd/systemctl_list-units
# active (running) ← Serviço estava ligado

# 2. Verificar log erro SSL
tail var/log/httpd/ssl_error_log
# Procurar por erros relacionados a certificados

# 3. Verificar expiração certificado
cat sos_commands/crypto/openssl_x509_*server.crt* | grep "Not After"

# 4. Verificar config Apache
cat etc/httpd/conf.d/ssl.conf | grep -E "SSLCertificate"

# 5. Verificar se arquivos existiam
ls -l etc/pki/tls/certs/ | grep server

Cenário 2: Falhas de Renovação certmonger

Passos de Análise:

# 1. Verificar status certmonger
cat sos_commands/certmonger/getcert_list

# 2. Procurar por CA_UNREACHABLE
grep "CA_UNREACHABLE" sos_commands/certmonger/getcert_list

# 3. Verificar conectividade IPA (se usando FreeIPA)
grep "ipa" var/log/messages | tail -50

# 4. Verificar tickets Kerberos
cat sos_commands/kerberos/klist* 2>/dev/null

# 5. Identificar quando renovação deveria ter acontecido
# Procurar por datas expiração, calcular 2/3 do tempo de vida

32.10 Conclusões Chave

  1. Relatórios SOS são inestimáveis para solução de problemas remota
  2. Sem chaves privadas incluídas (segurança!)
  3. Informações certificado SÃO incluídas (certs públicos, config, logs)
  4. Status certmonger preservado na saída getcert_list
  5. Crypto-policy registrada (RHEL 8+)
  6. Usar para análise pós-incidente e auditorias
  7. Automatizar análise com scripts

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ ANÁLISE CERTIFICADO RELATÓRIO SOS                            │
├──────────────────────────────────────────────────────────────┤
│ Gerar:           sudo sos report                             │
│ Extrair:         tar xf sosreport-*.tar.xz                   │
│                                                              │
│ Arquivos Chave:  etc/pki/tls/certs/                          │
│                  etc/httpd/conf.d/ssl.conf                   │
│                  sos_commands/certmonger/getcert_list        │
│                  sos_commands/crypto/openssl_version         │
│                  sos_commands/crypto/update-crypto-policies* │
│                  var/log/httpd/ssl_error_log                 │
│                                                              │
│ Verificações comuns:                                         │
│   - Datas expiração certificado                              │
│   - Status certmonger                                        │
│   - Configurações serviço                                    │
│   - Configuração crypto-policy                               │
│   - Negações SELinux                                         │
└──────────────────────────────────────────────────────────────┘

⚠️ Chaves privadas NÃO incluídas (segurança)
✅ Perfeito para solução de problemas remota

Navegação do Capítulo

Capítulo 33: Procedimentos de Emergência

Produção Fora do Ar: Quando certificados quebram e serviços estão offline, você precisa de procedimentos rápidos e confiáveis. Este capítulo é seu manual de emergência.


33.1 Filosofia de Resposta a Emergências

Quando produção está fora:

  • Velocidade importa - Cada minuto conta
  • 🎯 Corrigir primeiro, investigar depois - Colocar serviços funcionando
  • 📝 Documentar tudo - Para post-mortem
  • 🔄 Temporário é OK - Correção apropriada vem após recuperação

Este capítulo fornece:

  • Procedimentos de diagnóstico rápido
  • Soluções alternativas de emergência
  • Certificados temporários
  • Procedimentos de rollback
  • Templates de comunicação

33.2 Diagnóstico Rápido (Primeiros 60 Segundos)

Perguntas de Triagem

#============================================#
# TRIAGEM DE EMERGÊNCIA - 60 SEGUNDOS
#============================================#

# P1: O que está quebrado?
systemctl status httpd nginx postfix

# P2: Quando quebrou?
journalctl -xe --since "10 minutos ago" | grep -i cert

# P3: Certificado expirado?
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates

# P4: Mudanças recentes?
rpm -qa --last | head -20        # Atualizações de pacotes recentes
ausearch -m SYSCALL --start recent | grep cert  # Acesso recente a arquivo cert

# P5: Disco cheio?
df -h /etc/pki

# P6: SELinux bloqueando?
ausearch -m avc -ts recent | grep cert

Árvore de Decisão (Primeira Resposta)

Problema de Certificado Detectado
    │
    ├─ Serviço não inicia?
    │   ├─ Arquivo não encontrado → Correção Rápida #1: Restaurar do backup
    │   ├─ Permissão negada → Correção Rápida #2: Corrigir permissões
    │   └─ Cert inválido → Correção Rápida #3: Usar cert temporário
    │
    ├─ Certificado expirado?
    │   └─ Correção Rápida #4: Gerar temp autoassinado OU restaurar backup
    │
    ├─ Falha validação de cadeia?
    │   └─ Correção Rápida #5: Adicionar CA faltando OU usar política LEGACY
    │
    └─ Desconhecido/Complexo?
        └─ Escalonar + Aplicar Correção Rápida #6: Rollback para última config boa

33.3 Correção Rápida #1: Restaurar do Backup

Cenário: Arquivo de certificado/chave faltando ou corrompido

Tempo: 2-5 minutos

#!/bin/bash
# emergency-restore-cert.sh

SERVICE=$1  # apache, nginx, postfix, etc.
BACKUP_DIR="/var/backups/certificates"

echo "=== EMERGÊNCIA: Restaurando Certificado $SERVICE ==="

# Parar serviço
systemctl stop $SERVICE

# Encontrar backup mais recente
LATEST=$(ls -dt $BACKUP_DIR/*/ | head -2)
echo "Usando backup de: $LATEST"

# Restaurar certificado
if [ -f "$LATEST/${SERVICE}.crt" ]; then
  cp "$LATEST/${SERVICE}.crt" /etc/pki/tls/certs/
  chmod 644 /etc/pki/tls/certs/${SERVICE}.crt
  echo "✅ Certificado restaurado"
else
  echo "❌ Nenhum backup encontrado para $SERVICE"
  exit 1
fi

# Restaurar chave
if [ -f "$LATEST/${SERVICE}.key" ]; then
  cp "$LATEST/${SERVICE}.key" /etc/pki/tls/private/
  chmod 600 /etc/pki/tls/private/${SERVICE}.key
  echo "✅ Chave privada restaurada"
fi

# Iniciar serviço
systemctl start $SERVICE

# Testar
sleep 2
systemctl status $SERVICE

if systemctl is-active --quiet $SERVICE; then
  echo "✅ SUCESSO: $SERVICE está rodando"
  exit 0
else
  echo "❌ FALHOU: $SERVICE não iniciou"
  journalctl -xe -u $SERVICE | tail -20
  exit 1
fi

33.4 Correção Rápida #2: Corrigir Permissões de Emergência

Cenário: Serviço falha com “permissão negada” em arquivos de certificado

Tempo: 30 segundos

#!/bin/bash
# emergency-fix-permissions.sh

echo "=== EMERGÊNCIA: Corrigindo Permissões de Certificado ==="

# Corrigir diretório de certificados
chmod 755 /etc/pki/tls/certs/
chmod 644 /etc/pki/tls/certs/*.crt 2>/dev/null

# Corrigir diretório de chaves privadas
chmod 711 /etc/pki/tls/private/
chmod 600 /etc/pki/tls/private/*.key 2>/dev/null

# Corrigir propriedade (ajustar para seu serviço)
chown root:root /etc/pki/tls/certs/*.crt 2>/dev/null
chown root:root /etc/pki/tls/private/*.key 2>/dev/null

# Corrigir contextos SELinux
restorecon -Rv /etc/pki/tls/

echo "✅ Permissões corrigidas"

# Mostrar resultados
echo ""
echo "Permissões de certificados:"
ls -lZ /etc/pki/tls/certs/*.crt 2>/dev/null | head -5

echo ""
echo "Permissões de chaves:"
ls -lZ /etc/pki/tls/private/*.key 2>/dev/null | head -5

33.5 Correção Rápida #3: Gerar Certificado Autoassinado Temporário

Cenário: Certificado expirado ou inválido, necessita correção imediata

Tempo: 1-2 minutos

⚠️ AVISO: Certificados autoassinados causam avisos no navegador! Apenas para uso interno emergencial!

#!/bin/bash
# emergency-self-signed-cert.sh

HOSTNAME=${1:-$(hostname -f)}
DAYS=${2:-30}
CERT_PATH="/etc/pki/tls/certs/${HOSTNAME}-temp.crt"
KEY_PATH="/etc/pki/tls/private/${HOSTNAME}-temp.key"

echo "=== EMERGÊNCIA: Gerando Certificado Autoassinado Temporário ==="
echo "Hostname: $HOSTNAME"
echo "Válido por: $DAYS dias"

# Gerar certificado autoassinado
openssl req -x509 -nodes -days $DAYS \
  -newkey rsa:2048 \
  -keyout "$KEY_PATH" \
  -out "$CERT_PATH" \
  -subj "/C=US/ST=Emergency/L=Emergency/O=Emergency/CN=$HOSTNAME" \
  -addext "subjectAltName=DNS:$HOSTNAME,DNS:$(hostname -s)"

if [ $? -eq 0 ]; then
  # Definir permissões
  chmod 600 "$KEY_PATH"
  chmod 644 "$CERT_PATH"

  echo "✅ Certificado temporário gerado"
  echo "   Certificado: $CERT_PATH"
  echo "   Chave: $KEY_PATH"
  echo ""
  echo "⚠️ CRÍTICO: Esta é uma correção TEMPORÁRIA!"
  echo "   - Solicite certificado apropriado imediatamente"
  echo "   - Documente esta ação emergencial"
  echo "   - Planeje substituição apropriada dentro de $DAYS dias"
  echo ""
  echo "Para usar com Apache:"
  echo "  SSLCertificateFile $CERT_PATH"
  echo "  SSLCertificateKeyFile $KEY_PATH"

  # Mostrar certificado
  openssl x509 -in "$CERT_PATH" -noout -text | grep -E "(Subject:|Not After)"
else
  echo "❌ FALHOU ao gerar certificado"
  exit 1
fi

33.6 Correção Rápida #4: Renovação de Certificado de Emergência

Cenário: Certificado expirado, necessita renovação apropriada ASAP

Tempo: 5-15 minutos (depende da CA)

#!/bin/bash
# emergency-renew-cert.sh

CERT_PATH=$1
KEY_PATH=$2
HOSTNAME=$3

echo "=== EMERGÊNCIA: Renovando Certificado Expirado ==="

# Gerar novo CSR
CSR_PATH="/tmp/emergency-$(date +%s).csr"

openssl req -new -key "$KEY_PATH" -out "$CSR_PATH" \
  -subj "/CN=$HOSTNAME" \
  -addext "subjectAltName=DNS:$HOSTNAME"

if [ $? -eq 0 ]; then
  echo "✅ CSR gerado: $CSR_PATH"
  echo ""
  echo "PRÓXIMOS PASSOS:"
  echo "1. Submeta CSR para CA imediatamente:"
  echo "   cat $CSR_PATH"
  echo ""
  echo "2. Enquanto aguarda CA:"
  echo "   - Use cert autoassinado temporário (veja Correção Rápida #3)"
  echo "   - Ou restaure do backup (veja Correção Rápida #1)"
  echo ""
  echo "3. Quando CA retornar certificado:"
  echo "   cp new-cert.crt $CERT_PATH"
  echo "   systemctl reload <serviço>"

  # Se usando FreeIPA
  if command -v ipa-getcert &>/dev/null; then
    echo ""
    echo "4. Se usando FreeIPA, tente renovação automática:"
    echo "   sudo ipa-getcert resubmit -f $CERT_PATH"
  fi
else
  echo "❌ FALHOU ao gerar CSR"
  exit 1
fi

33.7 Correção Rápida #5: Emergência de Cadeia de Confiança

Cenário: Erro “Unable to get local issuer certificate”

Tempo: 1-2 minutos

#!/bin/bash
# emergency-fix-trust.sh

CA_CERT=$1  # Caminho para certificado CA

if [ -z "$CA_CERT" ] || [ ! -f "$CA_CERT" ]; then
  echo "❌ Uso: $0 /path/to/ca-cert.crt"
  exit 1
fi

echo "=== EMERGÊNCIA: Adicionando CA ao Repositório de Confiança ==="

# Copiar CA para trust anchors
cp "$CA_CERT" /etc/pki/ca-trust/source/anchors/

# Atualizar repositório de confiança
update-ca-trust extract

echo "✅ CA adicionada ao repositório de confiança do sistema"

# Verificar
if trust list | grep -q "$(basename "$CA_CERT" .crt)"; then
  echo "✅ VERIFICADO: CA agora é confiável"
else
  echo "⚠️ Aviso: Não foi possível verificar que CA foi adicionada"
fi

# Testar validação de certificado
echo ""
echo "Teste seu certificado agora:"
echo "  openssl verify /path/to/your/cert.crt"

Alternativa: Política LEGACY Temporária (RHEL 8+)

# Se problema de confiança é devido a algoritmos fracos
# TEMPORÁRIO - reverter após correção apropriada!

echo "=== EMERGÊNCIA: Definindo Política de Crypto LEGACY ==="
update-crypto-policies --show  # Salvar atual
sudo update-crypto-policies --set LEGACY
systemctl restart <serviço>

echo "⚠️ CRÍTICO: Isto é temporário!"
echo "Correção apropriada requerida dentro de 24 horas"

33.8 Correção Rápida #6: Rollback para Última Configuração Boa

Cenário: Mudança recente quebrou tudo, necessita reverter

Tempo: 2-5 minutos

#!/bin/bash
# emergency-rollback.sh

echo "=== EMERGÊNCIA: Fazendo Rollback para Última Configuração Boa ==="

# Parar serviço
systemctl stop httpd

# Backup do estado atual (quebrado)
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p /var/backups/emergency/$TIMESTAMP
cp -a /etc/pki/tls/certs/*.crt /var/backups/emergency/$TIMESTAMP/ 2>/dev/null
cp -a /etc/pki/tls/private/*.key /var/backups/emergency/$TIMESTAMP/ 2>/dev/null
cp -a /etc/httpd/conf.d/ssl.conf /var/backups/emergency/$TIMESTAMP/ 2>/dev/null

# Restaurar do último backup
LAST_GOOD="/var/backups/certificates/last-known-good"
if [ -d "$LAST_GOOD" ]; then
  cp -a "$LAST_GOOD"/*.crt /etc/pki/tls/certs/
  cp -a "$LAST_GOOD"/*.key /etc/pki/tls/private/
  cp -a "$LAST_GOOD"/ssl.conf /etc/httpd/conf.d/ 2>/dev/null

  # Corrigir permissões
  chmod 644 /etc/pki/tls/certs/*.crt
  chmod 600 /etc/pki/tls/private/*.key

  echo "✅ Rollback para última configuração boa feito"
else
  echo "❌ Nenhum backup last-known-good encontrado!"
  echo "Procurando por qualquer backup recente..."
  ls -ldt /var/backups/certificates/*/ | head -5
  exit 1
fi

# Iniciar serviço
systemctl start httpd

# Verificar
sleep 2
if systemctl is-active --quiet httpd; then
  echo "✅ SUCESSO: Serviço restaurado"
else
  echo "❌ Serviço ainda não está iniciando"
  journalctl -xe -u httpd | tail -20
  exit 1
fi

33.9 Procedimentos de Emergência Específicos por Serviço

Recuperação de Emergência Apache (httpd)

#============================================#
# RECUPERAÇÃO DE EMERGÊNCIA APACHE
#============================================#

# 1. Parar Apache
systemctl stop httpd

# 2. Verificar sintaxe de configuração
apachectl configtest
# Se falhar, corrigir ou restaurar ssl.conf do backup

# 3. Verificar se arquivos de certificado existem
ls -l /etc/pki/tls/certs/server.crt
ls -l /etc/pki/tls/private/server.key

# 4. Emergência: Desabilitar SSL temporariamente
mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.disabled
systemctl start httpd
# Serviço agora roda apenas em HTTP (porta 80)

# 5. Corrigir certificados, então re-habilitar SSL
mv /etc/httpd/conf.d/ssl.conf.disabled /etc/httpd/conf.d/ssl.conf
systemctl reload httpd

Recuperação de Emergência NGINX

#============================================#
# RECUPERAÇÃO DE EMERGÊNCIA NGINX
#============================================#

# 1. Parar NGINX
systemctl stop nginx

# 2. Testar configuração
nginx -t
# Se falhar, verificar qual linha/arquivo tem problema

# 3. Emergência: Comentar config SSL
sed -i 's/^\(\s*ssl_certificate\)/# \1/' /etc/nginx/nginx.conf
sed -i 's/^\(\s*listen.*443\)/# \1/' /etc/nginx/nginx.conf
sed -i 's/^\(\s*listen.*ssl\)/# \1/' /etc/nginx/nginx.conf

# 4. Iniciar apenas em HTTP
systemctl start nginx

# 5. Corrigir certificados, restaurar config SSL
# Descomentar linhas ou restaurar do backup
systemctl reload nginx

Emergência certmonger

#============================================#
# RECUPERAÇÃO DE EMERGÊNCIA CERTMONGER
#============================================#

# 1. Verificar status certmonger
systemctl status certmonger
getcert list

# 2. Se cert mostra CA_UNREACHABLE
# Verificar conectividade IPA
ipa ping

# 3. Emergência: Parar rastreamento, renovação manual
REQUEST_ID=$(getcert list | grep "Request ID" | head -1 | awk -F"'" '{print $2}')
getcert stop-tracking -i $REQUEST_ID

# 4. Renovação manual com IPA
ipa-getcert request -f /etc/pki/tls/certs/server.crt \
  -k /etc/pki/tls/private/server.key \
  -D $(hostname -f) \
  -K host/$(hostname -f)@REALM

# 5. Se IPA indisponível, usar autoassinado temporário
./emergency-self-signed-cert.sh

33.10 Templates de Comunicação

Notificação de Incidente (Interno)

Assunto: [URGENTE] Problema de Certificado - <Serviço> Fora do Ar

RESUMO DO INCIDENTE:
- Serviço: <Apache/NGINX/etc>
- Impacto: Site <Produção/Staging> fora do ar
- Iniciado: <Horário>
- Status: Investigando / Aplicando correção / Resolvido

CAUSA RAIZ:
- Certificado expirou em <Data>
- OU: Permissões de arquivo de certificado incorretas
- OU: Cadeia de confiança CA faltando

AÇÃO IMEDIATA TOMADA:
- Certificado autoassinado temporário aplicado
- Serviço restaurado em <Horário>

PRÓXIMOS PASSOS:
- Solicitar certificado apropriado da CA
- Substituir cert temporário até <Data/Horário>
- Post-mortem agendado para <Data>

WORKAROUND:
- Usuários podem ver avisos de segurança (esperado)
- Serviço está funcional apesar dos avisos

Comunicação com Cliente (Externo)

Assunto: Restauração de Serviço - Breve Interrupção

Prezados Clientes,

Experimentamos uma breve interrupção de serviço entre <Horário Início> e
<Horário Fim> devido a um problema de configuração de certificado. O serviço foi
totalmente restaurado.

Você pode notar um aviso de segurança temporário. Isto é esperado e
seguro para prosseguir. Estamos trabalhando para substituir o certificado temporário
por um permanente dentro das próximas horas.

Pedimos desculpas por qualquer inconveniente.

Atualizações de status: <URL>
Suporte: <Email/Telefone>

33.11 Lista de verificação pós-emergência

Após recuperação de emergência:

## Lista de verificação pós-emergência

### Imediato (Dentro de 1 Hora)
- [ ] Serviço confirmado rodando
- [ ] Monitoramento restaurado
- [ ] Stakeholders notificados
- [ ] Correção temporária documentada

### Curto-Prazo (Dentro de 24 Horas)
- [ ] Certificado apropriado obtido
- [ ] Cert temporário substituído
- [ ] Configuração validada
- [ ] Backups verificados funcionando

### Follow-Up (Dentro de 1 Semana)
- [ ] Análise de causa raiz completada
- [ ] Documento de post-mortem criado
- [ ] Medidas de prevenção identificadas
- [ ] Monitoramento/alertas melhorados
- [ ] Documentação atualizada
- [ ] Time debriefed

### Prevenção
- [ ] Adicionar monitoramento para este cenário
- [ ] Atualizar runbooks
- [ ] Agendar renovações mais cedo
- [ ] Automatizar se possível
- [ ] Testar procedimentos de recuperação

33.12 Contatos e Recursos de Emergência

Mantenha Isto à Mão

## Cartão de Resposta a Emergência de Certificado

### Comandos Rápidos
openssl x509 -in cert.crt -noout -dates      # Verificar expiração
systemctl status <serviço>                    # Status do serviço
journalctl -xe -u <serviço>                   # Logs recentes
getcert list                                  # Status certmonger

### Localização Scripts Emergência
/usr/local/bin/emergency-*.sh

### Localização Backup
/var/backups/certificates/

### Última Configuração Boa
/var/backups/certificates/last-known-good/

### Informações CA
URL CA: <URL>
Contato CA: <Email/Telefone>
Servidor FreeIPA: <Hostname>

### Escalação
Líder de Time: <Nome> <Telefone>
Gerente: <Nome> <Telefone>
Plantão: <Pager/Telefone>

### Documentação
Runbooks: <URL Wiki>
Incidentes Anteriores: <Sistema de Tickets>

33.13 Playbook de Cenários de Emergência

Cenário 1: Certificado Expirado (Produção Fora do Ar)

Impacto: ALTO - Serviço indisponível Pressão de Tempo: Crítica Resposta:

  1. Avaliar (30 segundos)

    openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates
    
  2. Correção Rápida (2 minutos)

    ./emergency-autoassinado-cert.sh $(hostname -f) 30
    # Atualizar config do serviço para usar cert temp
    systemctl restart <serviço>
    
  3. Comunicar (5 minutos)

    • Notificar stakeholders
    • Atualizar página de status
  4. Correção Apropriada (15-60 minutos)

    # Solicitar novo cert da CA
    # OU usar certmonger
    ipa-getcert resubmit -f /etc/pki/tls/certs/server.crt
    
  5. Substituir cert temp, verificar, documentar

Cenário 2: Certificado Errado Implantado

Impacto: MÉDIO - Serviço funcionando mas com erros Pressão de Tempo: Moderada Resposta:

  1. Parar sangria - Rollback

    ./emergency-rollback.sh
    
  2. Verificar serviço restaurado

  3. Identificar certificado correto

  4. Implantar cert correto com validação

  5. Documentar o que deu errado

Cenário 3: Servidor CA Fora do Ar (Não Pode Renovar)

Impacto: MÉDIO - Renovações futuras bloqueadas Pressão de Tempo: Depende da expiração do cert Resposta:

  1. Verificar timeline de expiração do cert

    openssl x509 -in cert.crt -noout -checkend $((86400*7))
    
  2. Se > 7 dias: Aguardar recuperação da CA, monitorar

  3. Se < 7 dias:

    • Gerar autoassinado temporário
    • Contatar suporte CA
    • Escalonar para gerência
  4. Alternativa: Usar CA diferente temporariamente

Cenário 4: SELinux Bloqueando Certificados

Impacto: BAIXO-MÉDIO - Serviço não inicia Pressão de Tempo: Moderada Resposta:

  1. Verificar negações

    ausearch -m avc -ts recent | grep cert
    
  2. Correção rápida - Relabeling

    restorecon -Rv /etc/pki/tls/
    
  3. Se persistir - Permissive temporário

    setenforce 0  # TEMPORÁRIO!
    systemctl restart <serviço>
    
  4. Correção apropriada - Gerar política

    audit2allow -a -M mycert
    semodule -i mycert.pp
    setenforce 1
    

33.14 Kit de Ferramentas de Emergência

Criar Kit de Resposta a Emergência

#!/bin/bash
# create-emergency-kit.sh
# Cria um kit portátil de resposta a emergências

KIT_DIR="/root/cert-emergency-kit"
mkdir -p "$KIT_DIR"

# Copiar scripts de emergência
cp emergency-*.sh "$KIT_DIR/"

# Criar referência rápida
cat > "$KIT_DIR/QUICK_REFERENCE.txt" << 'EOF'
=== REFERÊNCIA RÁPIDA EMERGÊNCIA CERTIFICADO ===

1. VERIFICAR STATUS
   systemctl status <serviço>
   openssl x509 -in cert.crt -noout -dates

2. CERT EXPIRADO
   ./emergency-self-signed-cert.sh $(hostname -f)

3. ARQUIVOS FALTANDO
   ./emergency-restore-cert.sh <serviço>

4. PERMISSÕES
   ./emergency-fix-permissions.sh

5. ROLLBACK
   ./emergency-rollback.sh

6. LOGS
   journalctl -xe -u <serviço>
   tail -f /var/log/httpd/ssl_error_log

===========================
Última Atualização: $(date)
EOF

# Definir permissões
chmod 700 "$KIT_DIR"
chmod 755 "$KIT_DIR"/*.sh

echo "✅ Kit de emergência criado: $KIT_DIR"
ls -lh "$KIT_DIR"

33.15 Conclusões Chave

  1. Velocidade sobre perfeição em emergências
  2. Correções temporárias são OK - Corrigir apropriadamente depois
  3. Comunicação é crítica - Manter stakeholders informados
  4. Documentar tudo - Para post-mortem
  5. Praticar procedimentos emergência - Não esperar incidente real
  6. Ter backups prontos - Testá-los regularmente
  7. Conhecer sua rota de escalação - Quando pedir ajuda
  8. Post-mortem é obrigatório - Aprender e melhorar

Cartão de Referência Rápida

┌───────────────────────────────────────────────────────────────┐
│ RESPOSTA A EMERGÊNCIA DE CERTIFICADO                          │
├───────────────────────────────────────────────────────────────┤
│ CERT EXPIRADO:    ./emergency-self-signed-cert.sh $(hostname) │
│ ARQUIVO FALTA:    ./emergency-restore-cert.sh <serviço>       │
│ PERMISSÕES:       ./emergency-fix-permissions.sh              │
│ PROB CONFIANÇA:   ./emergency-fix-trust.sh /path/to/ca.crt    │
│ ROLLBACK:         ./emergency-rollback.sh                     │
│                                                               │
│ DESABILITAR SSL:  mv ssl.conf ssl.conf.disabled               │
│                   systemctl restart <serviço>                 │
│                                                               │
│ VER EXPIRAÇÃO:    openssl x509 -in cert.crt -noout -dates     │
│ LOGS SERVIÇO:     journalctl -xe -u <serviço>                 │
└───────────────────────────────────────────────────────────────┘

⚠️ LEMBRAR: Corrigir primeiro, investigar depois!

🧪 Laboratório Prático

Lab 16: Procedimentos de Emergência

Aprenda técnicas rápidas de recuperação de certificados para emergências em produção

  • 📁 Localização: labs/pt_BR/16-emergency-procedures/
  • ⏱️ Tempo: 30-40 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 34: Planejamento e Preparação de Migração RHEL

Planejar para Sucesso: Migrações RHEL requerem planejamento certificado cuidadoso. Aprenda como auditar, preparar e planejar migração certificado para evitar interrupções.


34.1 Por que o planejamento de certificados importa

Sem Planejamento:

❌ Atualizar RHEL → Certificados falham validação
❌ Serviços não iniciam
❌ Interrupção produção
❌ Rollback requerido
❌ Migração falhada

Com Planejamento:

✅ Pré-auditoria identifica problemas
✅ Certificados preparados com antecedência
✅ Migração teste bem-sucedida
✅ Migração produção suave
✅ Sem interrupções relacionadas certificado

34.2 Auditoria de certificados pré-migração

Inventário Certificado Completo

#!/bin/bash
# pre-migration-cert-audit.sh
# Auditoria certificado completa antes migração RHEL

echo "=== Auditoria de certificados pré-migração ==="
echo "Sistema: $(hostname)"
echo "RHEL Atual: $(cat /etc/redhat-release)"
echo "Data: $(date)"
echo ""

# Encontrar todos certificados
echo "=== Inventário Certificados ==="
find /etc/pki/tls/certs/ /etc/httpd/ /etc/nginx/ /etc/postfix/ /etc/openldap/ \
  -name "*.crt" -o -name "*.pem" 2>/dev/null | \
  while read cert; do
    if openssl x509 -in "$cert" -noout 2>/dev/null; then
      echo "Certificado: $cert"
      echo "  Subject: $(openssl x509 -in "$cert" -noout -subject)"
      echo "  Emissor: $(openssl x509 -in "$cert" -noout -issuer)"
      echo "  Expira: $(openssl x509 -in "$cert" -noout -enddate | cut -d= -f2)"

      # Verificar algoritmo assinatura
      SIG_ALG=$(openssl x509 -in "$cert" -noout -text | grep "Signature Algorithm" | head -2)
      echo "  Assinatura: $SIG_ALG"

      # Verificar tamanho chave
      KEY_SIZE=$(openssl x509 -in "$cert" -noout -text | grep "Public-Key" | grep -oP '\d+')
      echo "  Tamanho Chave: $KEY_SIZE bits"

      # Marcar problemas
      if echo "$SIG_ALG" | grep -qi "sha1"; then
        echo "  ⚠️ AVISO: Assinatura SHA-1 (falhará no RHEL 9+)"
      fi

      if [ "$KEY_SIZE" -lt 2048 ]; then
        echo "  ⚠️ AVISO: Chave < 2048 bits (pode falhar no RHEL 8+)"
      fi

      if ! openssl x509 -in "$cert" -noout -ext subjectAltName 2>/dev/null | grep -q "DNS:"; then
        echo "  ⚠️ AVISO: Certificato não possui SAN"
      fi

      # Verificar expiração
      if ! openssl x509 -in "$cert" -noout -checkend $((86400*90)); then
        echo "  ⚠️ AVISO: Expira dentro de 90 dias"
      fi

      echo ""
    fi
  done

# Rastreamento certmonger
echo "=== Certificados Rastreados certmonger ==="
if command -v getcert &>/dev/null; then
  sudo getcert list | grep -E "(Request ID|certificate:|status:)"
else
  echo "certmonger não instalado"
fi

# CAs customizadas
echo ""
echo "=== CAs Customizadas em Repositório de Confiança ==="
ls -la /etc/pki/ca-trust/source/anchors/

# Configurações serviço
echo ""
echo "=== Configurações Certificado Serviço ==="
echo "Apache:"
grep -h "SSLCertificate" /etc/httpd/conf.d/*.conf 2>/dev/null | grep -v "^#"

echo ""
echo "NGINX:"
grep -rh "ssl_certificate" /etc/nginx/ 2>/dev/null | grep -v "^#"

echo ""
echo "Postfix:"
sudo postconf | grep -E "smtpd_tls_cert|smtp_tls_cert"

echo ""
echo "=== Auditoria Completa ==="
echo "Salve esta saída para referência migração!"

34.3 Problemas de certificados a corrigir antes da migração

Correções Pré-Migração Críticas

Correção 1: Assinaturas SHA-1 (RHEL 8→9)

# Encontrar certificados assinados SHA-1
for cert in /etc/pki/tls/certs/*.crt; do
  if openssl x509 -in "$cert" -noout -text 2>/dev/null | \
     grep -qi "Signature Algorithm.*sha1"; then
    echo "⚠️ SHA-1: $cert"
  fi
done

# Ação: Reemitir TODOS certificados SHA-1 antes migrar para RHEL 9

Correção 2: Chaves Pequenas (< 2048 bits)

# Encontrar chaves pequenas
for cert in /etc/pki/tls/certs/*.crt; do
  SIZE=$(openssl x509 -in "$cert" -noout -text 2>/dev/null | \
         grep "Public-Key" | grep -oP '\d+')
  if [ "$SIZE" -lt 2048 ] 2>/dev/null; then
    echo "⚠️ Chave pequena ($SIZE): $cert"
  fi
done

# Ação: Reemitir com chaves 2048+ bits

Correção 3: SANs Faltando

# Encontrar certificados sem SANs
for cert in /etc/pki/tls/certs/*.crt; do
  if ! openssl x509 -in "$cert" -noout -ext subjectAltName 2>/dev/null | grep -q "DNS:"; then
    echo "⚠️ Sem SANs: $cert"
  fi
done

# Ação: Reemitir com SANs apropriados (requerido para navegadores modernos)

Correção 4: Expirando Em Breve

# Encontrar certificados expirando dentro janela migração
for cert in /etc/pki/tls/certs/*.crt; do
  if ! openssl x509 -in "$cert" -noout -checkend $((86400*90)) 2>/dev/null; then
    echo "⚠️ Expirando em breve: $cert"
    openssl x509 -in "$cert" -noout -enddate
  fi
done

# Ação: Renovar antes migração para evitar expiração meio-migração

34.4 Estratégia Backup

O Que Fazer Backup

#============================================#
# BACKUP CERTIFICADO PRÉ-MIGRAÇÃO
#============================================#

BACKUP_DIR="/var/backups/pre-migration-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

# Backup certificados e chaves
sudo tar czf "$BACKUP_DIR/certificates.tar.gz" \
  /etc/pki/tls/ \
  /etc/pki/ca-trust/source/anchors/ \
  /etc/pki/nssdb/

# Backup configurações serviço
sudo tar czf "$BACKUP_DIR/service-configs.tar.gz" \
  /etc/httpd/conf.d/*.conf \
  /etc/nginx/nginx.conf \
  /etc/nginx/conf.d/ \
  /etc/postfix/main.cf \
  /etc/openldap/ \
  /var/lib/pgsql/data/postgresql.conf \
  /var/lib/pgsql/data/pg_hba.conf \
  2>/dev/null

# Backup banco dados certmonger
sudo tar czf "$BACKUP_DIR/certmonger.tar.gz" \
  /var/lib/certmonger/

# Salvar lista certmonger
sudo getcert list > "$BACKUP_DIR/certmonger-list.txt" 2>/dev/null

# Salvar crypto-policy (RHEL 8+)
update-crypto-policies --show > "$BACKUP_DIR/crypto-policy.txt" 2>/dev/null

# Criar inventário CSV
./pre-migration-cert-audit.sh > "$BACKUP_DIR/certificate-inventory.txt"

# Definir permissões
sudo chmod 700 "$BACKUP_DIR"

echo "✅ Backup completo: $BACKUP_DIR"
ls -lh "$BACKUP_DIR"

34.5 Plano Teste

Configuração Ambiente Teste

## Lista de verificação de teste de migração

### Ambiente Teste
- [ ] Clonar produção para VM/container teste
- [ ] Mesma versão RHEL que produção
- [ ] Mesmos certificados (cópias, não originais!)
- [ ] Mesmas configurações serviço
- [ ] Rede isolada de produção

### Teste Migração
- [ ] Executar migração em sistema teste
- [ ] Verificar todos serviços iniciam
- [ ] Testar validação certificado
- [ ] Verificar crypto-policy (RHEL 7→8/9)
- [ ] Testar conexões cliente
- [ ] Verificar rastreamento certmonger (se usado)
- [ ] Documentar quaisquer problemas

### Solução de Problemas
- [ ] Corrigir problemas encontrados em teste
- [ ] Atualizar plano migração
- [ ] Re-testar
- [ ] Documentar workarounds

### Prontidão Produção
- [ ] Migração teste bem-sucedida
- [ ] Problemas documentados e resolvidos
- [ ] Plano rollback pronto
- [ ] Time treinado
- [ ] Janela manutenção agendada

34.6 Timeline Migração

Cronograma Migração Exemplo

Semana 1-2: Planejamento e Auditoria
├─ Completar inventário certificados
├─ Identificar problemas (SHA-1, chaves pequenas, etc.)
├─ Planejar remediação
└─ Configurar ambiente teste

Semana 3-4: Remediação
├─ Reemitir certificados problemáticos
├─ Atualizar configurações
├─ Testar em ambiente atual
└─ Verificar automatização funciona

Semana 5-6: Teste
├─ Clonar produção para teste
├─ Executar migração teste
├─ Validar certificados pós-migração
├─ Documentar problemas e correções
└─ Atualizar runbook migração

Semana 7: Preparação Pré-Migração
├─ Auditoria certificado final
├─ Renovar certificados expirando
├─ Completar backups
├─ Briefar time
└─ Verificar plano rollback

Semana 8: Migração
├─ Janela manutenção
├─ Executar migração
├─ Validar certificados
├─ Monitorar por 24-48 horas
└─ Documentar lições aprendidas

34.7 Planejamento Rollback

Procedimento Rollback Certificado

#============================================#
# PLANO ROLLBACK CERTIFICADO
#============================================#

# Se migração falhar devido problemas certificado:

# Passo 1: Rollback RHEL (usando leapp ou snapshots)
# Ver documentação migração RHEL

# Passo 2: Restaurar certificados (se necessário)
sudo tar xzf /var/backups/pre-migration-YYYYMMDD/certificates.tar.gz -C /

# Passo 3: Restaurar configs serviço
sudo tar xzf /var/backups/pre-migration-YYYYMMDD/service-configs.tar.gz -C /

# Passo 4: Restaurar certmonger
sudo tar xzf /var/backups/pre-migration-YYYYMMDD/certmonger.tar.gz -C /

# Passo 5: Reiniciar serviços
sudo systemctl restart httpd nginx postfix slapd

# Passo 6: Verificar
curl -v https://localhost/
sudo getcert list

34.8 Plano Comunicação

Template Comunicação Stakeholder

## Migração RHEL - Avaliação Impacto Certificado

### Detalhes Migração
- **De:** RHEL X.Y
- **Para:** RHEL X.Y
- **Data:** YYYY-MM-DD
- **Janela:** XX:00 - XX:00 UTC

### Análise Impacto Certificado
- **Total Certificados:** XX
- **Certificados Requerendo Ação:** XX
- **Serviços Afetados:** Apache, NGINX, Postfix, LDAP, etc.

### Ações Pré-Migração Requeridas
- [ ] Reemitir XX certificados SHA-1
- [ ] Renovar XX certificados expirando
- [ ] Atualizar XX configurações serviço
- [ ] Testar compatibilidade crypto-policy (RHEL 8+)

### Durante Migração
- **Downtime Esperado:** X horas
- **Validação Certificado:** Pós-migração
- **Plano Rollback:** Disponível se necessário

### Validação Pós-Migração
- [ ] Todos serviços iniciam com sucesso
- [ ] Validação certificado funcionando
- [ ] crypto-policy aplicada (RHEL 8+)
- [ ] Rastreamento certmonger mantido
- [ ] Conexões cliente bem-sucedidas

### Mitigação Risco
- Backups completos completados
- Migração teste bem-sucedida
- Procedimento rollback documentado
- Time em standby

### Contato
- **Líder Migração:** Nome <email>
- **Escalação:** Gerente <email>

34.9 Lista de verificação de migração

Lista de verificação pré-migração completa

## Lista de verificação de prontidão para migração de certificados

### Auditoria e Inventário (Semana 1-3)
- [ ] Completar inventário certificados
- [ ] Documentar todas localizações certificado
- [ ] Identificar todos serviços usando certificados
- [ ] Mapear certificado para dependências serviço
- [ ] Documentar CAs customizadas em uso

### Identificação Problemas (Semana 2-4)
- [ ] Identificar certificados assinados SHA-1
- [ ] Identificar chaves pequenas (< 2048 bits)
- [ ] Identificar certificados sem SANs
- [ ] Identificar certificados expirando (< 180 dias)
- [ ] Identificar configs TLS codificadas (vs crypto-policy)

### Remediação (Semana 3-6)
- [ ] Reemitir todos certificados SHA-1
- [ ] Reemitir certificados chave pequena
- [ ] Adicionar SANs a todos certificados
- [ ] Renovar certificados expirando
- [ ] Remover configs TLS codificadas (preparar para crypto-policy)

### Teste (Semana 5-7)
- [ ] Configurar ambiente teste
- [ ] Clonar certificados produção para teste
- [ ] Executar migração teste
- [ ] Validar todos serviços iniciam
- [ ] Testar conexões cliente
- [ ] Testar crypto-policy (RHEL 7→8/9)
- [ ] Documentar problemas encontrados
- [ ] Resolver problemas em teste
- [ ] Re-testar até limpo

### Backup (Semana 7)
- [ ] Backup sistema completo
- [ ] Backup específico certificado
- [ ] Backup configuração serviço
- [ ] Backup banco dados certmonger
- [ ] Testar procedimento restore

### Documentação (Semana 7)
- [ ] Runbook migração completo
- [ ] Procedimento rollback documentado
- [ ] Workarounds problemas documentados
- [ ] Time briefado
- [ ] Stakeholders notificados

### Preparação Final (Dia antes)
- [ ] Verificar backups
- [ ] Verificar ambiente teste
- [ ] Revisar runbook
- [ ] Confirmar janela manutenção
- [ ] Papéis time atribuídos

34.10 Conclusões Chave

  1. Planejar com antecedência - Começar 6-8 semanas antes migração
  2. Auditar completamente - Conhecer cada certificado
  3. Corrigir problemas cedo - Não aguardar até dia migração
  4. Testar extensivamente - Múltiplas execuções teste
  5. Backup de tudo - Certificados, configs, BD certmonger
  6. Documentar claramente - Runbook, rollback, problemas
  7. Comunicar proativamente - Manter stakeholders informados

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA PLANEJAMENTO MIGRAÇÃO                      │
├──────────────────────────────────────────────────────────────┤
│ Timeline:     6-8 semanas antes migração                     │
│                                                              │
│ Pré-audit:    Encontrar todos certificados                   │
│               Verificar assinaturas (SHA-1 → SHA-256)        │
│               Verificar tamanhos chave (< 2048 → 2048+)      │
│               Verificar SANs (faltando → adicionar)          │
│               Verificar expiração (< 180 dias → renovar)     │
│                                                              │
│ Backup:       tar czf certs.tar.gz /etc/pki/tls/             │
│               getcert list > certmonger-list.txt             │
│               update-crypto-policies --show > policy.txt     │
│                                                              │
│ Testar:       Clonar para ambiente teste                     │
│               Executar migração teste                        │
│               Validar certificados funcionam                 │
│               Documentar e corrigir problemas                │
└──────────────────────────────────────────────────────────────┘

⚠️ Certificados SHA-1 FALHARÃO no RHEL 9+
⚠️ crypto-policies introduzidas no RHEL 8
✅ Testar múltiplas vezes antes produção

Navegação do Capítulo

Capítulo 35: Migração RHEL 7→8

Grande Salto: Migrar do RHEL 7 para RHEL 8 introduz crypto-policies - mudança revolucionária em gerenciamento de certificados. Planejar cuidadosamente!


35.1 Impacto Certificado: MODERADO-ALTO

O Que Muda

RecursoRHEL 7RHEL 8Impacto
OpenSSL1.0.2k1.1.1kModerado
Versões TLS1.0/1.1/1.21.2/1.3 (DEFAULT)ALTO
Crypto-PoliciesNenhumaNOVA!ALTO
Cifras PadrãoMistasMais RigorosasModerado
certmongerBásicoAprimoradoBaixo
GerenciamentoManualAutomatizado (crypto-policies)ALTO

Mudança Chave: crypto-policies revolucionam gerenciamento TLS!


35.2 Preparação Pré-Migração

Tarefas Pré-Migração Específicas Certificado

#============================================#
# PREPARAÇÃO CERTIFICADO RHEL 7→8
#============================================#

# Tarefa 1: Auditar todos certificados (ver Cap 34)
./pre-migration-cert-audit.sh > rhel7-cert-audit.txt

# Tarefa 2: Verificar por dependências TLS 1.0/1.1
# Revisar configs serviço
grep -r "TLSv1\|TLSv1.1" /etc/httpd/ /etc/nginx/ /etc/postfix/

# Tarefa 3: Identificar configurações cipher manuais
# Estas serão sobrescritas por crypto-policies!
grep -r "SSLCipherSuite\|ssl_ciphers\|smtp.*ciphers" /etc/httpd/ /etc/nginx/ /etc/postfix/

# Tarefa 4: Testar compatibilidade TLS 1.2
# Garantir todos clientes suportam TLS 1.2+

# Tarefa 5: Backup de tudo
sudo tar czf rhel7-complete-backup-$(date +%Y%m%d).tar.gz \
  /etc/pki/ \
  /etc/httpd/ \
  /etc/nginx/ \
  /etc/postfix/ \
  /var/lib/certmonger/

35.3 Migração Usando leapp

O Utilitário leapp

IMPORTANTE: Use leapp para migração RHEL 7→8 (NÃO redhat-upgrade-tool!)

leapp é o utilitário atualização suportado Red Hat para RHEL 7→8 e 8→9.

#============================================#
# MIGRAÇÃO RHEL 7→8 COM LEAPP
#============================================#

# Pré-requisitos
# - RHEL 7.9 (último)
# - Subscription Red Hat válida
# - Todas atualizações aplicadas
# - Backups completos

# Passo 1: Atualizar RHEL 7 para último
sudo yum update -y
sudo reboot

# Passo 2: Instalar leapp
sudo yum install leapp-upgrade -y

# Passo 3: Executar verificação pré-atualização
sudo leapp preupgrade

# Revisar relatório:
cat /var/log/leapp/leapp-report.txt

# Inibidores comuns relacionados certificado:
# - Certificados SHA-1
# - Configurações cipher fracas
# - Pacotes não suportados

# Passo 4: Corrigir problemas identificados
# Reemitir certificados SHA-1
# Atualizar configurações

# Passo 5: Executar atualização
sudo leapp upgrade

# Sistema baixa RHEL 8, prepara atualização
# Reinicia automaticamente

# Passo 6: Após reboot, sistema é RHEL 8!
cat /etc/redhat-release
# Red Hat Enterprise Linux release 8.X (Ootpa)

35.4 Validação Certificado Pós-Migração

Verificações Pós-Migração Imediatas

#============================================#
# VALIDAÇÃO CERTIFICADO PÓS-MIGRAÇÃO
#============================================#

# Verificação 1: Verificar RHEL 8
cat /etc/redhat-release
openssl version
# Deveria mostrar: OpenSSL 1.1.1k

# Verificação 2: Verificar crypto-policy
update-crypto-policies --show
# DEFAULT (deveria ser definida automaticamente)

# Verificação 3: Verificar arquivos certificado ainda presentes
ls -la /etc/pki/tls/certs/
ls -la /etc/pki/tls/private/

# Verificação 4: Verificar permissões inalteradas
ls -l /etc/pki/tls/private/*.key
# Deveriam ainda ser 600

# Verificação 5: Verificar CAs customizadas
ls -la /etc/pki/ca-trust/source/anchors/

# Verificação 6: Atualizar repositório de confiança (só por garantia)
sudo update-ca-trust

# Verificação 7: Verificar rastreamento certmonger
sudo getcert list
# Todos certificados deveriam ainda estar rastreados

# Verificação 8: Verificar configurações serviço
# crypto-policies podem tê-las atualizado
cat /etc/crypto-policies/back-ends/httpd.config

35.5 Restart e Teste Serviço

Reiniciar Todos Serviços

#============================================#
# REINICIAR SERVIÇOS APÓS MIGRAÇÃO
#============================================#

# Reiniciar serviços usando certificados
sudo systemctl restart httpd
sudo systemctl restart nginx
sudo systemctl restart postfix
sudo systemctl restart slapd
sudo systemctl restart postgresql
sudo systemctl restart mariadb

# Verificar status serviço
systemctl status httpd nginx postfix | grep "Active:"

# Testar cada serviço
curl -v https://localhost/                             # Apache/NGINX
openssl s_client -connect localhost:443                # HTTPS
openssl s_client -starttls smtp -connect localhost:25  # Postfix
openssl s_client -connect localhost:636                # LDAPS

35.6 Problemas Comuns Certificado RHEL 7→8

Problema 1: Clientes TLS 1.0/1.1 Não Conseguem Conectar

Sintoma: Clientes antigos falham após migração

Causa: Política DEFAULT crypto bloqueia TLS 1.0/1.1

Correção Rápida (Temporária):

sudo update-crypto-policies --set LEGACY
sudo systemctl restart httpd nginx postfix

Correção Apropriada:

# Atualizar clientes para suportar TLS 1.2+
# Ou criar módulo política customizado

Problema 2: Cifras Codificadas Conflitam com crypto-policy

Sintoma: Serviço não inicia ou comporta inesperadamente

Causa: Config antiga tem SSLCipherSuite que conflita

Correção:

# Remover configs cipher codificadas
# Deixar crypto-policy lidar com isso

# Apache: Remover de ssl.conf
# SSLProtocol ...
# SSLCipherSuite ...

# NGINX: Remover de nginx.conf
# ssl_protocols ...
# ssl_ciphers ...

# Postfix: Remover de main.cf
# smtpd_tls_protocols ...
# smtpd_tls_mandatory_ciphers ...

Problema 3: Rastreamento certmonger Perdido

Sintoma: getcert list mostra vazio ou certificados faltando

Raro mas possível se migração teve problemas

Correção:

# Restaurar banco dados certmonger de backup
sudo systemctl stop certmonger
sudo tar xzf /var/backups/pre-migration-*/certmonger.tar.gz -C /
sudo systemctl start certmonger

# Verificar
sudo getcert list

35.7 Transição Crypto-Policy

Adotando Crypto-Policies

RHEL 7: Sem crypto-policies, config manual por serviço RHEL 8: crypto-policies gerenciam TLS system-wide

#============================================#
# TRANSIÇÃO PARA CRYPTO-POLICIES
#============================================#

# Após migração para RHEL 8:

# Passo 1: Verificar política atual
update-crypto-policies --show
# DEFAULT

# Passo 2: Remover configs TLS manuais de serviços
# (Deixar crypto-policy lidar com isso)

# Passo 3: Testar com política DEFAULT
sudo systemctl restart httpd nginx postfix

# Passo 4: Se clientes antigos necessitam TLS 1.0/1.1 (temporário!)
sudo update-crypto-policies --set LEGACY

# Passo 5: Planejar voltar para DEFAULT
# Atualizar clientes, então:
sudo update-crypto-policies --set DEFAULT

35.8 Exemplo Runbook Migração

Execução Passo-a-Passo

## Runbook Migração RHEL 7→8 - Seção Certificado

### Pré-Migração (T-24 horas)
- [ ] Verificar backups completos e testados
- [ ] Verificar todos certificados válidos > 90 dias
- [ ] Sem certificados SHA-1 restantes
- [ ] Migração ambiente teste bem-sucedida

### Início Janela Migração (T=0)
- [ ] Anunciar janela manutenção
- [ ] Fazer backup final
- [ ] Executar: `sudo leapp upgrade`
- [ ] Sistema reinicia automaticamente

### Pós-Reboot (T+30 min)
- [ ] Verificar RHEL 8: `cat /etc/redhat-release`
- [ ] Verificar crypto-policy: `update-crypto-policies --show`
- [ ] Verificar certificados presentes: `ls /etc/pki/tls/certs/`
- [ ] Verificar certmonger: `sudo getcert list`

### Validação Serviço (T+45 min)
- [ ] Reiniciar todos serviços
- [ ] Testar Apache: `curl -v https://localhost/`
- [ ] Testar NGINX: `curl -v https://localhost:8443/`
- [ ] Testar Postfix: `openssl s_client -starttls smtp -connect localhost:25`
- [ ] Testar LDAP: `ldapsearch -H ldaps://localhost:636 -x -b ""`
- [ ] Testar bancos dados (se aplicável)

### Teste Cliente (T+60 min)
- [ ] Testar de clientes Windows
- [ ] Testar de clientes Linux
- [ ] Testar de clientes aplicação
- [ ] Verificar sem erros TLS

### Monitoramento (T+2 horas a T+48 horas)
- [ ] Monitorar logs por erros certificado
- [ ] Monitorar saúde serviço
- [ ] Verificar renovações certmonger
- [ ] Verificar sem problemas crypto-policy

### Conclusão
- [ ] Documentar quaisquer problemas encontrados
- [ ] Atualizar runbook com lições aprendidas
- [ ] Fechar janela manutenção
- [ ] Notificar stakeholders de migração bem-sucedida

35.9 Conclusões Chave

  1. Usar utilitário leapp para migração RHEL 7→8 (método suportado)
  2. crypto-policies são NOVAS no RHEL 8 - Mudança principal!
  3. TLS 1.0/1.1 desabilitados por padrão - Testar compatibilidade cliente
  4. Remover configs TLS manuais - Deixar crypto-policy gerenciar
  5. Testar extensivamente antes migração produção
  6. Política LEGACY disponível para compatibilidade (temporária!)
  7. Rastreamento certmonger deveria sobreviver migração

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ CHECKLIST CERTIFICADO MIGRAÇÃO RHEL 7→8                      │
├──────────────────────────────────────────────────────────────┤
│ Antes:         Auditar todos certificados                    │
│                Reemitir certificados SHA-1                   │
│                Testar compatibilidade TLS 1.2                │
│                Backup de tudo                                │
│                                                              │
│ Migração:      Usar leapp upgrade (NÃO redhat-upgrade-tool!) │
│                Sistema reinicia automaticamente              │
│                                                              │
│ Após:          Verificar RHEL 8                              │
│                Verificar crypto-policy (DEFAULT)             │
│                Reiniciar todos serviços                      │
│                Testar conexões cliente                       │
│                Monitorar por 48 horas                        │
│                                                              │
│ Novo Recurso:  crypto-policies (controle TLS system-wide)    │
│ Bloqueado:     TLS 1.0/1.1 (em política DEFAULT)             │
│ Fallback:      Política LEGACY (se necessário, temporário!)  │
└──────────────────────────────────────────────────────────────┘

✅ Usar leapp (oficialmente suportado)
⚠️ Mudança principal: crypto-policies introduzidas
⚠️ Testar suporte TLS 1.2 cliente antes migração

🧪 Laboratório Prático

Lab 17: Migração RHEL 7→8

Migre certificados durante atualização do SO para RHEL 8

  • 📁 Localização: labs/pt_BR/17-rhel7to8-migration/
  • ⏱️ Tempo: 40-50 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 36: Migração RHEL 8→9

Transição OpenSSL 3.x: RHEL 8→9 traz OpenSSL 3.x com arquitetura provider e validação mais rigorosa. Planejar cuidadosamente para esta mudança significativa.


36.1 Impacto Certificado: ALTO

O Que Muda

RecursoRHEL 8RHEL 9Impacto
OpenSSL1.1.1k3.5.5ALTO
ArquiteturaTradicionalBaseada ProviderALTO
TLS 1.0/1.1Política LEGACYCompletamente removidoALTO
SHA-1DepreciadoBloqueadoALTO
ValidaçãoPadrãoMais RigorosaModerado
Crypto-PoliciesBásicaSubpolíticasBaixo
certmongerAprimoradoSuporte ACMEBaixo

Mudança Chave: OpenSSL 3.x é mudança arquitetural principal!


36.2 Requisitos Pré-Migração

Correções Certificado Críticas

Requisito 1: SEM Assinaturas SHA-1

#============================================#
# VERIFICAR POR SHA-1 (FALHARÁ NO RHEL 9!)
#============================================#

# Encontrar certificados assinados SHA-1
for cert in /etc/pki/tls/certs/*.crt; do
  SIG=$(openssl x509 -in "$cert" -noout -text 2>/dev/null | \
        grep "Signature Algorithm" | head -2)
  if echo "$SIG" | grep -qi "sha1"; then
    echo "🚨 CRÍTICO: Assinatura SHA-1: $cert"
    echo "   $SIG"
    echo "   ⚠️ DEVE reemitir antes migração RHEL 9!"
  fi
done

# Ação: Reemitir TODOS certificados SHA-1 antes migração
# Sem exceções - eles FALHARÃO no RHEL 9

Requisito 2: Todos Certificados Válidos

# Garantir sem certificados expirados
for cert in /etc/pki/tls/certs/*.crt; do
  if ! openssl x509 -in "$cert" -noout -checkend 0 2>/dev/null; then
    echo "❌ Expirado: $cert"
  fi
done

Requisito 3: Testar Aplicações Customizadas

# Se você tem aplicações customizadas usando OpenSSL
# Elas podem necessitar atualizações para API OpenSSL 3.x
rpm -qa | grep -E "custom|local"

# Testar estas aplicações em ambiente RHEL 9 antes migração

36.3 Migração Usando leapp

Processo Atualização RHEL 8→9

#============================================#
# MIGRAÇÃO RHEL 8→9 COM LEAPP
#============================================#

# Pré-requisitos
# - RHEL 8.10 (último recomendado)
# - Subscription válida
# - Todas atualizações aplicadas
# - Backups completos
# - Certificados SHA-1 reemitidos!

# Passo 1: Atualizar RHEL 8 completamente
sudo dnf update -y
sudo reboot

# Passo 2: Instalar leapp
sudo dnf install leapp-upgrade -y

# Passo 3: Executar verificação pré-atualização
sudo leapp preupgrade

# Revisar relatório
cat /var/log/leapp/leapp-report.txt

# Verificações relacionadas certificado:
# - Avisos certificado SHA-1
# - Compatibilidade OpenSSL
# - Compatibilidade app customizada

# Passo 4: Abordar inibidores
# Corrigir quaisquer problemas bloqueantes

# Passo 5: Executar atualização
sudo leapp upgrade

# Baixa RHEL 9, prepara atualização
# Reinicia para executar atualização
# Reinicia novamente para RHEL 9

# Passo 6: Verificar RHEL 9
cat /etc/redhat-release
# Red Hat Enterprise Linux release 9.X (Plow)

openssl version
# OpenSSL 3.5.5

36.4 Validação Pós-Migração

Validação Específica Certificado

#============================================#
# VALIDAÇÃO CERTIFICADO PÓS-MIGRAÇÃO (RHEL 9)
#============================================#

# Verificação 1: Versão OpenSSL
openssl version
# OpenSSL 3.5.5  ← Confirmar

# Verificação 2: Verificar providers
openssl list -providers
# Deveria mostrar: default, fips, legacy, base

# Verificação 3: Verificar certificados ainda presentes
ls -la /etc/pki/tls/certs/
ls -la /etc/pki/tls/private/

# Verificação 4: Testar validação certificado
for cert in /etc/pki/tls/certs/*.crt; do
  openssl verify "$cert" 2>&1 | grep -v "OK" && echo "Problema: $cert"
done

# Verificação 5: Verificar crypto-policy
update-crypto-policies --show
# DEFAULT (deveria ser mantida)

# Verificação 6: Testar operações certificado
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -text

# Verificação 7: Verificar rastreamento certmonger
sudo getcert list
# Todos certificados deveriam ainda estar rastreados

# Verificação 8: Verificar repositório de confiança
trust list | head -20

36.5 Validação Serviço

Testar Todos Serviços

#============================================#
# VALIDAÇÃO SERVIÇO PÓS-MIGRAÇÃO
#============================================#

# Reiniciar serviços
sudo systemctl restart httpd nginx postfix slapd postgresql mariadb 2>/dev/null

# Testar cada serviço
echo "Testando Apache..."
curl -v https://localhost/ 2>&1 | grep -E "(SSL connection|subject:)"

echo "Testando com OpenSSL 3.x..."
openssl s_client -connect localhost:443 -tls1_3

echo "Testando Postfix..."
openssl s_client -starttls smtp -connect localhost:25 </dev/null

echo "Testando LDAPS..."
openssl s_client -connect localhost:636 </dev/null

# Verificar por erros provider
sudo journalctl --since "1 hour ago" | grep -i "provider\|unsupported"

36.6 Problemas Comuns RHEL 8→9

Problema 1: Certificados SHA-1 Rejeitados

Sintoma:

openssl verify server.crt
# error 3 at 0 depth lookup: CA md too weak

Causa: Certificado tem assinatura SHA-1 (bloqueado no RHEL 9)

Solução:

# SEM WORKAROUND - Deve reemitir
# Isto deveria ter sido feito pré-migração!

# Emergência: Reemitir imediatamente
openssl req -new -key server.key -out server.csr -sha256
# Submeter para CA, instalar novo certificado

Problema 2: Erros Algoritmo Legado

Sintoma:

openssl md5 file.txt
# Erro: unsupported

Causa: MD5 e outros algoritmos legados requerem provider explícito

Solução:

# Usar provider legado
openssl md5 -provider legacy file.txt

# Melhor: Atualizar para usar SHA-256
openssl sha256 file.txt

Problema 3: Incompatibilidade OpenSSL 3.x Aplicação Customizada

Sintoma: Aplicação customizada falha com erros OpenSSL

Causa: Aplicação compilada contra OpenSSL 1.1.1, API mudou no 3.x

Solução:

# Recompilar aplicação contra OpenSSL 3.x
# Ou atualizar código aplicação para nova API

# Workaround temporário (se disponível):
# Usar biblioteca compat (se fornecida)

36.7 Considerações crypto-policy

Crypto-Policy Após Migração

#============================================#
# CRYPTO-POLICY PÓS-MIGRAÇÃO
#============================================#

# Verificar política atual (deveria ser mantida)
update-crypto-policies --show

# RHEL 9 suporta subpolíticas!
# Exemplo: Desabilitar completamente SHA-1
sudo update-crypto-policies --set DEFAULT:NO-SHA1

# Listar módulos disponíveis
ls /usr/share/crypto-policies/policies/modules/

# Testar política
sudo systemctl restart httpd
curl -v https://localhost/

36.8 certmonger Após Migração

Verificar Funcionalidade certmonger

#============================================#
# CERTMONGER PÓS-MIGRAÇÃO
#============================================#

# Verificar status certmonger
systemctl status certmonger

# Listar certificados rastreados
sudo getcert list

# Verificar por problemas
sudo getcert list | grep "status:" | grep -v "MONITORING"

# Se usando FreeIPA, testar conectividade
ipa ping

# Forçar teste renovação
sudo ipa-getcert resubmit -f /etc/pki/tls/certs/test.crt

# RHEL 9 NOVO: Suporte ACME disponível
# Pode agora usar certmonger com Let's Encrypt nativamente!

36.9 Runbook Migração

Runbook Focado Certificado

## Migração RHEL 8→9 - Seção Certificado

### Pré-Migração (T-24 horas)
- [ ] Verificar SEM certificados SHA-1 (crítico!)
- [ ] Todos certificados válidos > 90 dias
- [ ] Backups completos e testados
- [ ] Migração teste bem-sucedida
- [ ] Apps customizadas testadas no RHEL 9

### Início Janela Migração (T=0)
- [ ] Backup final
- [ ] Executar: `sudo leapp upgrade`
- [ ] Sistema reinicia (duas vezes)

### Validação Pós-Reboot (T+45 min)
- [ ] Verificar RHEL 9: `cat /etc/redhat-release`
- [ ] Verificar OpenSSL 3.5.5: `openssl version`
- [ ] Verificar providers: `openssl list -providers`
- [ ] Verificar certificados: `ls /etc/pki/tls/certs/`
- [ ] Verificar crypto-policy: `update-crypto-policies --show`
- [ ] Verificar certmonger: `sudo getcert list`

### Restart Serviço (T+60 min)
- [ ] Reiniciar todos serviços usando certificados
- [ ] Testar Apache/NGINX
- [ ] Testar Postfix
- [ ] Testar LDAP
- [ ] Testar bancos dados

### Validação Certificado (T+90 min)
- [ ] Sem rejeições SHA-1
- [ ] Todos certificados validam: `openssl verify`
- [ ] TLS 1.3 funcionando: `openssl s_client -tls1_3`
- [ ] Sem erros provider em logs
- [ ] Status certmonger tudo MONITORING

### Teste Cliente (T+2 horas)
- [ ] Testar de todos tipos cliente
- [ ] Verificar sem problemas compatibilidade
- [ ] Verificar funcionalidade aplicação

### Pós-Migração (24-48 horas)
- [ ] Monitorar por problemas OpenSSL 3.x
- [ ] Verificar renovações certmonger
- [ ] Monitorar logs serviço
- [ ] Documentar quaisquer problemas

36.10 Conclusões Chave

  1. OpenSSL 3.x é mudança principal - Arquitetura provider é nova
  2. SHA-1 DEVE ser eliminado antes migração - Sem exceções!
  3. Usar leapp para migração (oficialmente suportado)
  4. Testar aplicações customizadas no RHEL 9 primeiro
  5. Validação mais rigorosa captura mais problemas (bom para segurança!)
  6. certmonger ganha suporte ACME no RHEL 9
  7. Subpolíticas disponíveis para ajuste fino

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────────┐
│ CHECKLIST CERTIFICADO MIGRAÇÃO RHEL 8→9                          │
├──────────────────────────────────────────────────────────────────┤
│ CRÍTICO:   SEM certificados SHA-1! (serão rejeitados)            │
│            Reemitir todos certs SHA-1 antes migração             │
│                                                                  │
│ Antes:     Verificar SEM assinaturas SHA-1                       │
│            Testar apps customizadas no RHEL 9                    │
│            Backup de tudo                                        │
│                                                                  │
│ Migração:  Usar leapp upgrade                                    │
│            Sistema reinicia duas vezes                           │
│                                                                  │
│ Após:      Verificar OpenSSL 3.5.5                               │
│            Verificar providers: openssl list -providers          │
│            Testar algoritmos legados necessitam -provider legacy │
│            Reiniciar todos serviços                              │
│            Verificar rastreamento certmonger mantido             │
│                                                                  │
│ Novo:      Arquitetura provider                                  │
│            Subpolíticas (DEFAULT:NO-SHA1)                        │
│            Suporte ACME certmonger                               │
└──────────────────────────────────────────────────────────────────┘

🚨 SHA-1 está BLOQUEADO - reemitir antes migração!
✅ OpenSSL 3.x traz segurança mais rigorosa
✅ certmonger funciona com Let's Encrypt nativamente

🧪 Laboratório Prático

Lab 18: Migração RHEL 8→9

Lide com OpenSSL 3.x e segurança mais rígida no RHEL 9

  • 📁 Localização: labs/pt_BR/18-rhel8to9-migration/
  • ⏱️ Tempo: 40-50 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 37: Solução de Problemas e Recuperação de Migração

Quando Coisas Dão Errado: Migrações nem sempre vão suavemente. Este capítulo cobre problemas migração comuns e procedimentos recuperação.


37.1 Problemas Migração Comuns

Top 10 Problemas Certificado Migração

ProblemaSintomasCausaCorreção Rápida
1. Serviços não iniciamsystemctl status falhaSintaxe config mudouRestaurar config, atualizar sintaxe
2. Rejeição SHA-1 (RHEL 9)“ca md too weak”Assinatura SHA-1Reemitir certificado
3. Desajuste versão TLSClientes não conectamTLS 1.0/1.1 bloqueadosPolítica LEGACY (temp)
4. Problemas crypto-policyVários errosNovo sistema políticaEntender e configurar
5. certmonger perdeu rastreamentogetcert list vazioCorrupção BDRestaurar de backup
6. CAs faltandoCert verify failedRepositório de confiança resetadoRe-adicionar CAs
7. Mudanças permissãoPermission deniedPropriedade mudouCorrigir permissões
8. Negações SELinuxServiço bloqueadoContexto mudouRelabeling arquivos
9. Erros provider (RHEL 9)Algoritmo unsupportedMudança OpenSSL 3.xUsar -provider legacy
10. Degradação desempenhoConexões lentasCrypto mais rigorosoEsperado, ou ajustar

37.2 Procedimentos Rollback

Quando Fazer Rollback

Rollback se:

  • Serviços críticos não conseguem iniciar
  • Problemas certificado não podem ser corrigidos rapidamente
  • Impacto negócio é severo
  • Dentro janela rollback (usualmente 24-48 horas)

Rollback leapp

#============================================#
# ROLLBACK MIGRAÇÃO RHEL
#============================================#

# leapp cria snapshot durante atualização
# Rollback ANTES de reiniciar para nova versão

# Durante atualização (se problemas detectados):
# Não reiniciar - investigar e corrigir

# Após atualização mas problemas encontrados:
# Verificar se dentro janela rollback

# leapp não tem rollback automático
# Usar snapshot/backup para restaurar

# Com snapshot LVM (se criado pré-migração):
# Boot do snapshot
# Ou restaurar de backup

Rollback Específico Certificado

#============================================#
# RESTAURAR CERTIFICADOS APÓS MIGRAÇÃO FALHADA
#============================================#

# Cenário: Migrado, mas problemas certificado
# Necessita restaurar estado certificado

# Passo 1: Parar serviços
sudo systemctl stop httpd nginx postfix slapd

# Passo 2: Restaurar certificados
sudo tar xzf /var/backups/pre-migration-*/certificates.tar.gz -C /

# Passo 3: Restaurar configs serviço
sudo tar xzf /var/backups/pre-migration-*/service-configs.tar.gz -C /

# Passo 4: Restaurar certmonger
sudo systemctl stop certmonger
sudo tar xzf /var/backups/pre-migration-*/certmonger.tar.gz -C /
sudo systemctl start certmonger

# Passo 5: Restaurar crypto-policy (se RHEL 8+)
POLICY=$(cat /var/backups/pre-migration-*/crypto-policy.txt)
sudo update-crypto-policies --set $POLICY

# Passo 6: Iniciar serviços
sudo systemctl start httpd nginx postfix slapd

# Passo 7: Verificar
curl -v https://localhost/
sudo getcert list

37.3 Serviço Não Inicia Após Migração

Diagnóstico

#============================================#
# SOLUÇÃO DE PROBLEMAS STARTUP SERVIÇO
#============================================#

# Verificar status serviço
systemctl status httpd

# Ver erros detalhados
sudo journalctl -xe -u httpd

# Testar configuração
# Apache:
sudo apachectl configtest

# NGINX:
sudo nginx -t

# Postfix:
sudo postfix check

# Erros comuns relacionados certificado:
# - Arquivo não encontrado
# - Permissão negada
# - Formato certificado inválido
# - ca md too weak (SHA-1)

Soluções

Problema: Sintaxe Configuração Mudou

# Algumas diretivas mudaram entre versões
# Verificar notas lançamento para mudanças

# Temporariamente restaurar config antiga
sudo cp /var/backups/pre-migration-*/ssl.conf /etc/httpd/conf.d/

# Atualizar para nova sintaxe
# Pesquisar sintaxe correta para nova versão

Problema: Permissão Mudou Durante Migração

# Corrigir permissões
sudo chmod 600 /etc/pki/tls/private/*.key
sudo chmod 644 /etc/pki/tls/certs/*.crt

# Corrigir propriedade
sudo chown root:root /etc/pki/tls/private/*.key

# Corrigir contextos SELinux
sudo restorecon -Rv /etc/pki/tls/

37.4 Falhas Conexão Cliente Pós-Migração

Incompatibilidade Versão TLS

Sintoma: Clientes não conseguem conectar após migração para RHEL 8/9

Diagnóstico:

# Testar do servidor
openssl s_client -connect localhost:443 -tls1_2
# Funciona

openssl s_client -connect localhost:443 -tls1
# Falha (esperado no RHEL 8/9 DEFAULT)

# Verificar crypto-policy
update-crypto-policies --show
# DEFAULT  ← Bloqueia TLS 1.0/1.1

Solução Temporária:

# Permitir TLS 1.0/1.1 temporariamente
sudo update-crypto-policies --set LEGACY
sudo systemctl restart httpd nginx postfix

# Testar clientes
# Documentar quais clientes necessitam TLS 1.0/1.1

# Planejar atualizar aqueles clientes, então reverter para DEFAULT

Solução Apropriada:

# Atualizar clientes para suportar TLS 1.2+
# Então usar política DEFAULT

sudo update-crypto-policies --set DEFAULT

37.5 Problemas certmonger Pós-Migração

Rastreamento certmonger Perdido

Sintoma:

sudo getcert list
# (vazio ou certificados faltando)

Solução:

# Restaurar banco dados certmonger
sudo systemctl stop certmonger
sudo tar xzf /var/backups/pre-migration-*/certmonger.tar.gz -C /
sudo systemctl start certmonger

# Verificar
sudo getcert list

# Se ainda problemas, re-adicionar certificados manualmente

certmonger CA_UNREACHABLE Após Migração

Comum após atualização RHEL

Solução:

# Renovar ticket Kerberos
sudo kinit -k host/$(hostname -f)@REALM

# Reiniciar certmonger
sudo systemctl restart certmonger

# Reenviar requisições
for cert in $(sudo getcert list | grep "certificate:" | sed -n "s/.*location='\\([^']*\\)'.*/\\1/p"); do
  sudo ipa-getcert resubmit -f "$cert"
done

37.6 Procedimentos Recuperação Emergência

Emergência: Todos Serviços Fora

Situação: Migração completa mas nada funciona

Recuperação Rápida:

#!/bin/bash
# emergency-post-migration-recovery.sh

echo "=== EMERGÊNCIA: Recuperação Certificado Pós-Migração ==="

# 1. Verificar versão RHEL (confirmar migração aconteceu)
cat /etc/redhat-release

# 2. Emergência: Desabilitar SSL temporariamente
# Apache
sudo mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.disabled
sudo systemctl start httpd
# Agora Apache roda apenas em HTTP (porta 80)

# 3. Identificar problemas certificado
sudo journalctl -xe | grep -i cert | tail -50

# 4. Para RHEL 9: Verificar por rejeições SHA-1
grep "ca md too weak" /var/log/messages

# 5. Gerar certificados autoassinados temporários
/usr/local/bin/emergency-self-signed-cert.sh $(hostname -f) 90

# 6. Re-habilitar SSL com cert temp
sudo mv /etc/httpd/conf.d/ssl.conf.disabled /etc/httpd/conf.d/ssl.conf
# Atualizar para usar cert temp
sudo systemctl restart httpd

# 7. Serviços restaurados (com avisos)
# Planejar correções certificado apropriadas

echo "✅ Recuperação emergência completa"
echo "⚠️ Usando certificados temporários - corrigir ASAP!"

37.7 Script Validação Pós-Migração

Validação Abrangente

#!/bin/bash
# post-migration-cert-validation.sh

echo "=== Validação Certificado Pós-Migração ==="

ISSUES=0

# Verificar versão RHEL
echo "1. Versão RHEL:"
cat /etc/redhat-release

# Verificar OpenSSL
echo ""
echo "2. Versão OpenSSL:"
openssl version

# Verificar crypto-policy (RHEL 8+)
if command -v update-crypto-policies &>/dev/null; then
  echo ""
  echo "3. Crypto-Policy:"
  update-crypto-policies --show
fi

# Verificar certificados
echo ""
echo "4. Status Certificado:"
CERT_COUNT=0
EXPIRED=0
for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue
  ((CERT_COUNT++))

  if ! openssl x509 -in "$cert" -noout -checkend 0 2>/dev/null; then
    echo "  ❌ EXPIRADO: $cert"
    ((EXPIRED++))
    ((ISSUES++))
  fi

  # Verificar por SHA-1 (RHEL 9)
  if [ "$(cat /etc/redhat-release)" =~ "release 9" ]; then
    if openssl x509 -in "$cert" -noout -text | grep -qi "sha1.*Signature"; then
      echo "  ❌ SHA-1: $cert"
      ((ISSUES++))
    fi
  fi
done

echo "  Total certificados: $CERT_COUNT"
echo "  Expirados: $EXPIRED"

# Verificar certmonger
echo ""
echo "5. Status certmonger:"
if command -v getcert &>/dev/null; then
  sudo getcert list | grep "status:" | sort | uniq -c

  UNREACHABLE=$(sudo getcert list | grep -c "CA_UNREACHABLE")
  if [ $UNREACHABLE -gt 0 ]; then
    echo "  ⚠️ $UNREACHABLE certificados CA_UNREACHABLE"
    ((ISSUES++))
  fi
else
  echo "  certmonger não instalado"
fi

# Verificar serviços
echo ""
echo "6. Status Serviço:"
for svc in httpd nginx postfix slapd; do
  if systemctl is-active --quiet $svc 2>/dev/null; then
    echo "  ✅ $svc: rodando"
  elif systemctl is-enabled --quiet $svc 2>/dev/null; then
    echo "  ❌ $svc: não rodando (deveria estar)"
    ((ISSUES++))
  fi
done

# Testar conexões
echo ""
echo "7. Testes Conexão:"
timeout 3 curl -ks https://localhost/ &>/dev/null && \
  echo "  ✅ HTTPS: OK" || echo "  ❌ HTTPS: FALHOU"

# Resumo
echo ""
echo "==================================="
if [ $ISSUES -eq 0 ]; then
  echo "✅ Validação migração PASSOU!"
  exit 0
else
  echo "⚠️ $ISSUES problemas encontrados - revisar acima"
  exit 1
fi

37.8 Conclusões Chave

  1. Ter plano rollback pronto antes migração
  2. Maioria problemas são corrigíveis sem rollback
  3. Mudanças Crypto-policy causam maioria problemas compatibilidade
  4. Rejeição SHA-1 é inegociável no RHEL 9
  5. Testar, testar, testar antes migração produção
  6. Documentar tudo durante a solução de problemas
  7. Procedimentos emergência (Cap 33) aplicam durante migração também

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ SOLUÇÃO DE PROBLEMAS MIGRAÇÃO QUICK REFERENCE                │
├──────────────────────────────────────────────────────────────┤
│ Serviço falha:   Verificar: journalctl -xe -u <serviço>      │
│                  Tentar: Restaurar config de backup          │
│                                                              │
│ Cert rejeitado:  Verificar: Algoritmo assinatura (SHA-1?)    │
│                  Corrigir: Reemitir com SHA-256+             │
│                                                              │
│ Cliente falha:   Verificar: Suporte versão TLS               │
│                  Temp: update-crypto-policies --set LEGACY   │
│                  Corrigir: Atualizar cliente                 │
│                                                              │
│ certmonger:      Verificar: getcert list                     │
│                  Corrigir: Restaurar /var/lib/certmonger/    │
│                                                              │
│ Emergência:      Desabilitar SSL temporariamente             │
│                  Gerar temp autoassinado                     │
│                  Restaurar de backup                         │
│                                                              │
│ Rollback:        Usar snapshot/backup                        │
│                  Restaurar certificados                      │
│                  Restaurar configs                           │
└──────────────────────────────────────────────────────────────┘

✅ Maioria problemas são corrigíveis sem rollback completo
⚠️ Ter backups prontos
⚠️ Testar em não-produção primeiro

Navegação do Capítulo

Capítulo 38: Guia Completo do Modo FIPS

Conformidade Federal: Conformidade FIPS 140-2/140-3 é requerida para sistemas federais EUA e muitas indústrias regulamentadas. Aprenda como habilitar e gerenciar modo FIPS no RHEL.


38.1 O Que é FIPS?

FIPS = Federal Information Processing Standards

FIPS 140-2/140-3 = Programa Validação Módulo Criptográfico

Propósito:

  • ✅ Validar módulos criptográficos cumprem requisitos segurança
  • ✅ Garantir implementação apropriada de algoritmos aprovados
  • ✅ Requerido para sistemas governo federal EUA
  • ✅ Frequentemente requerido para: Bancário, planos de saúde, contratados defesa

Estado da Validação FIPS por Versão RHEL

Versão RHELEstado FIPSPadrãoNotas
RHEL 7ValidadoFIPS 140-2Módulos OpenSSL 1.0.2 validados
RHEL 8ValidadoFIPS 140-2OpenSSL 1.1.1, NSS, libgcrypt validados
RHEL 9ValidadoFIPS 140-2Provider OpenSSL 3.x, transição para 140-3 em progresso
RHEL 10Em processoFIPS 140-2/140-3Transição contínua, verificar estado atual

Importante: Em 2025, RHEL 9 usa módulos validados FIPS 140-2. Transição para FIPS 140-3 está em progresso mas ainda não completa. Sempre verificar estado validação atual em https://csrc.nist.gov/projects/cryptographic-module-validation-program


38.2 Habilitando Modo FIPS

FIPS Tempo-Instalação (Recomendado)

Melhor Prática: Habilitar FIPS durante instalação RHEL

# No prompt boot instalação, adicionar:
fips=1

# Sistema instala em modo FIPS desde início
# Todas operações criptográficas são conformes FIPS desde boot

Por Que Tempo-Instalação é Melhor:

  • Kernel apropriadamente configurado
  • Todos pacotes instalados em modo FIPS
  • Sem necessidade migração pós-instalação
  • Estado FIPS mais limpo

FIPS Pós-Instalação (RHEL 8/9/10)

#============================================#
# HABILITAR MODO FIPS PÓS-INSTALAÇÃO
#============================================#

# Verificar estado FIPS atual
fips-mode-setup --check
# FIPS mode is disabled.

# Habilitar modo FIPS
sudo fips-mode-setup --enable

# Saída mostra o que mudará:
# - Parâmetros boot kernel
# - Crypto policy
# - Reconfiguração sistema

# DEVE REINICIAR!
sudo reboot

# Após reboot, verificar
fips-mode-setup --check
# FIPS mode is enabled.

# Verificar crypto-policy
update-crypto-policies --show
# FIPS

# Verificar provider FIPS carregado (RHEL 9+)
openssl list -providers | grep fips
#   fips
#     name: OpenSSL FIPS Provider
#     version: 3.5.5
#     status: active

38.3 Requisitos FIPS para Certificados

Algoritmos Aprovados

Aprovados FIPS para Certificados:

✅ RSA: 2048, 3072, 4096 bits
✅ ECC: P-256 (secp256r1), P-384 (secp384r1), P-521 (secp521r1)
✅ Assinaturas: SHA-256, SHA-384, SHA-512
✅ TLS: Apenas 1.2, 1.3

Bloqueados em Modo FIPS:

❌ RSA < 2048 bits
❌ MD5, SHA-1
❌ TLS 1.0, 1.1
❌ 3DES, RC4, DES
❌ Chaves DSA
❌ Curvas elípticas não aprovadas

38.4 Gerando Certificados Conformes FIPS

Geração Chave Conforme FIPS

#============================================#
# GERAR CHAVES CONFORMES FIPS
#============================================#

# Verificar modo FIPS habilitado
fips-mode-setup --check

# Gerar chave RSA 2048 (conforme FIPS)
openssl genpkey -algorithm RSA -out fips-server.key \
  -pkeyopt rsa_keygen_bits:2048

# RSA 3072 (mais forte, ainda conforme FIPS)
openssl genpkey -algorithm RSA -out fips-server.key \
  -pkeyopt rsa_keygen_bits:3072

# EC P-256 (curva aprovada FIPS)
openssl genpkey -algorithm EC -out fips-ec.key \
  -pkeyopt ec_paramgen_curve:P-256

# EC P-384 (mais forte, aprovada FIPS)
openssl genpkey -algorithm EC -out fips-ec.key \
  -pkeyopt ec_paramgen_curve:P-384

# Verificar chave gerada em modo FIPS
openssl pkey -in fips-server.key -check

CSR Conforme FIPS

#============================================#
# GERAR CSR CONFORME FIPS
#============================================#

# CSR com SHA-256 (aprovado FIPS)
openssl req -new -key fips-server.key -out fips-server.csr \
  -sha256 \
  -subj "/C=US/O=Federal Agency/CN=secure.example.gov" \
  -addext "subjectAltName=DNS:secure.example.gov"

# SHA-384 (mais forte, aprovado FIPS)
openssl req -new -key fips-server.key -out fips-server.csr \
  -sha384 \
  -subj "/C=US/O=Federal Agency/CN=secure.example.gov"

# ❌ NUNCA usar SHA-1 ou MD5 em modo FIPS
# Eles serão rejeitados!

38.5 Verificação Modo FIPS

Verificação FIPS Completa

#============================================#
# VERIFICAR MODO FIPS ESTÁ ATIVO
#============================================#

# Verificação 1: fips-mode-setup
fips-mode-setup --check
# FIPS mode is enabled.

# Verificação 2: Parâmetro kernel
cat /proc/cmdline | grep fips
# Deveria mostrar: fips=1

# Verificação 3: Crypto-policy
update-crypto-policies --show
# FIPS

# Verificação 4: Provider FIPS OpenSSL (RHEL 9+)
openssl list -providers
# Deveria mostrar provider fips como ativo

# Verificação 5: Testar operação apenas-FIPS
# Tentar algoritmo não-FIPS (deveria falhar)
echo "test" | openssl md5
# Erro: disabled for FIPS  ← Bom!

# Verificação 6: Verificar operações certificado usam FIPS
openssl version -a | grep FIPS

38.6 Crypto-Policy FIPS

Entendendo Política FIPS

#============================================#
# DETALHES CRYPTO-POLICY FIPS
#============================================#

# Política é automaticamente definida para FIPS quando modo FIPS habilitado
update-crypto-policies --show
# FIPS

# O que política FIPS força:
cat /etc/crypto-policies/back-ends/opensslcnf.config

# Configurações chave:
# - TLS 1.2 mínimo
# - Apenas cifras aprovadas FIPS
# - Apenas algoritmos assinatura aprovados FIPS
# - Chaves mínimo 2048 bits

Não pode mudar de política FIPS enquanto em modo FIPS!


38.7 Serviços em Modo FIPS

Apache em Modo FIPS

#============================================#
# APACHE EM MODO FIPS
#============================================#

# Apache automaticamente usa política FIPS
# Sem configuração manual necessária!

# Verificar
sudo systemctl restart httpd

# Testar
openssl s_client -connect localhost:443

# Deveria mostrar:
# - TLS 1.2 ou 1.3
# - Cipher aprovado FIPS
# - Sem algoritmos fracos

# Ver config FIPS Apache real
cat /etc/crypto-policies/back-ends/httpd.config

Outros Serviços

Todos serviços automaticamente cumprem política FIPS:

  • NGINX → Usa cifras/protocolos FIPS
  • Postfix → TLS conforme FIPS
  • OpenSSH → Apenas algoritmos FIPS
  • Bancos dados → SSL aprovado FIPS

38.8 Problemas FIPS Comuns

Problema 1: Tentativa Algoritmo Não-FIPS

Sintoma:

Error: disabled for FIPS

Exemplos:

# MD5 (não aprovado FIPS)
openssl md5 file.txt
# Erro: digital envelope routines:EVP_DigestInit_ex:disabled for fips

# Assinatura SHA-1 (não aprovada FIPS para assinar)
openssl dgst -sha1 -sign key.pem file.txt
# Erro: disabled for fips

Solução:

# Usar algoritmos aprovados FIPS
openssl sha256 file.txt  # Usar SHA-256 em vez de MD5
openssl dgst -sha256 -sign key.pem file.txt  # Usar SHA-256 para assinar

Problema 2: Aplicação Legada Incompatível

Sintoma: Aplicação falha em modo FIPS

Causa: Aplicação usa algoritmos não-FIPS (MD5, SHA-1, cifras fracas)

Soluções:

# Solução 1: Atualizar aplicação para usar algoritmos FIPS

# Solução 2: Se aplicação não pode ser atualizada:
# Pode não conseguir executar em modo FIPS
# Considerar se FIPS é realmente requerido

# Solução 3: Isolamento container (avançado)
# Executar app não-FIPS em container sem FIPS

38.9 Desabilitando Modo FIPS

Quando e Como Desabilitar

#============================================#
# DESABILITAR MODO FIPS (se necessário)
#============================================#

# Verificar estado atual
fips-mode-setup --check

# Desabilitar FIPS
sudo fips-mode-setup --disable

# DEVE REINICIAR
sudo reboot

# Após reboot
fips-mode-setup --check
# FIPS mode is disabled.

# Crypto-policy reverte para DEFAULT
update-crypto-policies --show
# DEFAULT

Nota: Desabilitar FIPS pode ter implicações conformidade!


38.10 Conclusões Chave

  1. FIPS 140-2 é padrão atual no RHEL (transição 140-3 em progresso)
  2. Habilitar na instalação para estado FIPS mais limpo
  3. Habilitação pós-instalação requer reboot
  4. Apenas algoritmos aprovados FIPS permitidos
  5. Crypto-policy automaticamente definida para FIPS
  6. Serviços automaticamente cumprem
  7. Testar aplicações antes habilitar FIPS em produção

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA MODO FIPS                                  │
├──────────────────────────────────────────────────────────────┤
│ Estado:       fips-mode-setup --check                        │
│ Habilitar:    sudo fips-mode-setup --enable && reboot        │
│ Desabilitar:  sudo fips-mode-setup --disable && reboot       │
│                                                              │
│ Padrão:       FIPS 140-2 (validado)                          │
│               FIPS 140-3 (transição em progresso)            │
│                                                              │
│ Aprovado:     RSA 2048+, ECC P-256/384/521                   │
│               SHA-256/384/512                                │
│               TLS 1.2/1.3                                    │
│                                                              │
│ Bloqueado:    MD5, SHA-1, TLS 1.0/1.1                        │
│               RSA < 2048, 3DES, RC4                          │
│                                                              │
│ Política:     Automaticamente definida para FIPS             │
│ Verificar:    openssl list -providers | grep fips            │
└──────────────────────────────────────────────────────────────┘

⚠️ FIPS 140-2 é atual (transição 140-3 contínua)
⚠️ Requer reboot para habilitar/desabilitar
✅ Todos serviços RHEL automaticamente cumprem

🧪 Laboratório Prático

Lab 19: Configuração do Modo FIPS

Habilite e configure modo de conformidade FIPS 140-2

  • 📁 Localização: labs/pt_BR/19-fips-mode/
  • ⏱️ Tempo: 40-50 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 39: Certificados Conformes FIPS

Pronto Conformidade: Aprenda como gerar, validar e gerenciar certificados conformes FIPS no RHEL para ambientes federais e regulamentados.


39.1 Requisitos Certificado FIPS

Requisitos Obrigatórios

Para Conformidade FIPS 140-2/140-3:

✅ Algoritmo Chave: RSA 2048+ ou ECC P-256/384/521
✅ Assinatura: SHA-256, SHA-384 ou SHA-512
✅ Protocolos TLS: Apenas 1.2 ou 1.3
✅ Gerado em modo FIPS (para chaves novas)
✅ Módulo validado usado para operações

❌ SEM MD5, SHA-1
❌ SEM RSA < 2048 bits
❌ SEM TLS 1.0/1.1
❌ SEM 3DES, RC4, DES
❌ SEM algoritmos não aprovados

39.2 Gerando Certificados FIPS

Fluxo de Trabalho Certificado FIPS Completo

#============================================#
# GERAÇÃO CERTIFICADO FIPS COMPLETA
#============================================#

# Pré-requisitos: Modo FIPS deve estar habilitado
fips-mode-setup --check
# FIPS mode is enabled.

# Passo 1: Gerar chave RSA conforme FIPS
openssl genpkey -algorithm RSA \
  -out /etc/pki/tls/private/fips-server.key \
  -pkeyopt rsa_keygen_bits:2048

# Ou mais forte (3072/4096)
openssl genpkey -algorithm RSA \
  -out /etc/pki/tls/private/fips-server.key \
  -pkeyopt rsa_keygen_bits:3072

# Passo 2: Definir permissões
sudo chmod 600 /etc/pki/tls/private/fips-server.key

# Passo 3: Gerar CSR com SHA-256
openssl req -new \
  -key /etc/pki/tls/private/fips-server.key \
  -out /tmp/fips-server.csr \
  -sha256 \
  -subj "/C=US/O=Federal Agency/OU=IT/CN=secure.example.gov" \
  -addext "subjectAltName=DNS:secure.example.gov,DNS:www.secure.example.gov"

# Passo 4: Verificar CSR
openssl req -in /tmp/fips-server.csr -noout -text | grep -E "(Signature Algorithm|Public-Key)"
# Signature Algorithm: sha256WithRSAEncryption  ← Deve ser SHA-256+
# Public-Key: (2048 bit)  ← Deve ser 2048+

# Passo 5: Submeter para CA conforme FIPS
# Receber certificado de volta

# Passo 6: Verificar conformidade certificado
openssl x509 -in fips-server.crt -noout -text | grep "Signature Algorithm"
# Signature Algorithm: sha256WithRSAEncryption  ← Bom!

Chaves EC Conformes FIPS

#============================================#
# CHAVES ELLIPTIC CURVE PARA FIPS
#============================================#

# P-256 (aprovada FIPS)
openssl genpkey -algorithm EC \
  -out /etc/pki/tls/private/fips-ec.key \
  -pkeyopt ec_paramgen_curve:P-256

# P-384 (mais forte, aprovada FIPS)
openssl genpkey -algorithm EC \
  -out /etc/pki/tls/private/fips-ec.key \
  -pkeyopt ec_paramgen_curve:P-384

# Gerar CSR
openssl req -new -key /etc/pki/tls/private/fips-ec.key \
  -out /tmp/fips-ec.csr \
  -sha256 \
  -subj "/CN=secure.example.gov"

39.3 Validando Conformidade FIPS

Verificação Conformidade Certificado

#!/bin/bash
# check-fips-compliance.sh
# Verificar certificado é conforme FIPS

CERT=$1

if [ -z "$CERT" ] || [ ! -f "$CERT" ]; then
  echo "Uso: $0 /path/to/certificate.crt"
  exit 1
fi

echo "=== Verificação Conformidade FIPS ==="
echo "Certificado: $CERT"
echo ""

COMPLIANT=true

# Verificar algoritmo assinatura
SIG_ALG=$(openssl x509 -in "$CERT" -noout -text | grep "Signature Algorithm" | head -2)
echo "Algoritmo Assinatura: $SIG_ALG"

if echo "$SIG_ALG" | grep -Eqi "md5|sha1"; then
  echo "  ❌ FALHA: MD5/SHA-1 não aprovados FIPS"
  COMPLIANT=false
else
  echo "  ✅ PASSOU: Assinatura aprovada FIPS"
fi

# Verificar tamanho chave
KEY_SIZE=$(openssl x509 -in "$CERT" -noout -text | grep "Public-Key" | grep -oP '\d+')
echo ""
echo "Tamanho Chave: $KEY_SIZE bits"

if [ "$KEY_SIZE" -lt 2048 ]; then
  echo "  ❌ FALHA: Tamanho chave < 2048 bits"
  COMPLIANT=false
else
  echo "  ✅ PASSOU: Tamanho chave adequado"
fi

# Verificar algoritmo chave
KEY_ALG=$(openssl x509 -in "$CERT" -noout -text | grep "Public Key Algorithm")
echo ""
echo "Algoritmo Chave: $KEY_ALG"

if echo "$KEY_ALG" | grep -qi "dsa"; then
  echo "  ❌ FALHA: DSA não aprovado FIPS"
  COMPLIANT=false
fi

# Resultado final
echo ""
echo "================================"
if [ "$COMPLIANT" = true ]; then
  echo "✅ Certificado é CONFORME FIPS"
  exit 0
else
  echo "❌ Certificado NÃO é conforme FIPS"
  echo "   Reemitir com parâmetros aprovados FIPS"
  exit 1
fi

39.4 Seleção CA FIPS

CA Deve Ser Validada FIPS

CA Interna:

  • Usar FreeIPA em modo FIPS
  • Dogtag PKI (CA FreeIPA) tem validação FIPS

CA Externa:

  • Verificar CA é validada FIPS 140-2/140-3
  • Solicitar documentação conformidade FIPS
  • CAs FIPS comuns: DigiCert Federal, Entrust, IdenTrust

39.5 Configuração Serviço para FIPS

Serviços Automaticamente Conformes FIPS

Quando modo FIPS habilitado, todos serviços automaticamente usam crypto-policy FIPS:

# Apache - sem config especial necessária
# Apenas garantir certificado é conforme FIPS

# NGINX - automaticamente usa política FIPS

# Postfix - conforme FIPS automaticamente

# Verificar cada serviço
openssl s_client -connect localhost:443
# Verificar cipher usado - deveria ser aprovado FIPS

39.6 Conclusões Chave

  1. FIPS 140-2 é padrão atual validado no RHEL
  2. Transição FIPS 140-3 está em progresso
  3. Habilitar na instalação para melhores resultados
  4. Apenas RSA 2048+ ou ECC P-256/384
  5. Assinaturas SHA-256+ requeridas
  6. Serviços automaticamente cumprem com política FIPS
  7. Testar aplicações antes habilitar FIPS em produção

Cartão de Referência Rápida

┌────────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CERTIFICADOS CONFORMES FIPS                  │
├────────────────────────────────────────────────────────────────┤
│ Padrão:      FIPS 140-2 (atual validado)                       │
│              FIPS 140-3 (transição em progresso)               │
│                                                                │
│ Chaves:      RSA 2048/3072/4096                                │
│              ECC P-256/384/521                                 │
│                                                                │
│ Assinatura:  SHA-256, SHA-384, SHA-512                         │
│              (SEM MD5, SEM SHA-1)                              │
│                                                                │
│ Gerar:       openssl genpkey -algorithm RSA ... (em modo FIPS) │
│ CSR:         openssl req -new -sha256 ...                      │
│ Verificar:   Verificar alg assinatura, tamanho chave           │
│                                                                │
│ Testar:      echo test | openssl md5                           │
│              (deveria falhar se FIPS funcionando)              │
└────────────────────────────────────────────────────────────────┘

✅ Modo FIPS deve estar habilitado para conformidade
✅ Todas operações usam módulos criptográficos validados
⚠️ Verificar status atual 140-2/140-3 para suas necessidades

Navegação do Capítulo

Capítulo 40: Fortalecimento de Segurança de Certificados no RHEL

Defesa em Profundidade: Além de FIPS, aprenda como fortalecer segurança certificado no RHEL usando SELinux, TPM, smart cards e ferramentas scan segurança.


40.1 Visão geral do fortalecimento de segurança

Camadas de Segurança Certificado:

  1. Permissões Arquivo - Proteger chaves privadas
  2. SELinux - Controle acesso obrigatório
  3. Firewall - Limitar exposição
  4. Auditoria - Rastrear acesso
  5. TPM - Proteção chave hardware
  6. Smart Cards - Tokens físicos
  7. Monitoramento - Detectar problemas
  8. Scanning Conformidade - Verificar configuração

40.2 SELinux para Certificados

Contextos SELinux Apropriados

#============================================#
# CONTEXTOS CERTIFICADO SELINUX
#============================================#

# Verificar contextos atuais
ls -Z /etc/pki/tls/certs/*.crt
ls -Z /etc/pki/tls/private/*.key

# Contextos corretos:
# Certificados: system_u:object_r:cert_t:s0
# Chaves privadas: system_u:object_r:cert_t:s0

# Corrigir contextos se errados
sudo restorecon -Rv /etc/pki/tls/

# Verificar
ls -Z /etc/pki/tls/certs/server.crt
# system_u:object_r:cert_t:s0  ← Correto

Política Certificado SELinux

#============================================#
# FORTALECIMENTO CERTIFICADO SELINUX
#============================================#

# Garantir SELinux enforcing
getenforce
# Enforcing  ← Bom

# Se permissive, habilitar enforcing
sudo setenforce 1

# Tornar permanente
sudo sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config

# Verificar por negações relacionadas certificado
sudo ausearch -m avc -ts recent | grep cert

# Se negações encontradas, gerar política
sudo ausearch -m avc -ts recent | audit2allow -M mycert-policy
sudo semodule -i mycert-policy.pp

40.3 Fortalecimento de permissões de arquivos

Modelo Permissão Rigoroso

#============================================#
# PERMISSÕES ARQUIVO FORTALECIDAS
#============================================#

# Certificados (públicos) - acesso mínimo
sudo chmod 444 /etc/pki/tls/certs/*.crt
sudo chown root:root /etc/pki/tls/certs/*.crt

# Chaves privadas (secretas!) - apenas proprietário
sudo chmod 400 /etc/pki/tls/private/*.key
sudo chown root:root /etc/pki/tls/private/*.key

# Ainda mais rigoroso: Imutável (não pode ser modificado mesmo por root sem remover flag)
sudo chattr +i /etc/pki/tls/certs/critical.crt
sudo chattr +i /etc/pki/tls/private/critical.key

# Remover imutável quando necessitar atualizar
# sudo chattr -i /etc/pki/tls/private/critical.key

# Verificar
ls -l /etc/pki/tls/private/
# -r--------. 1 root root  ← 400, muito restritivo

40.4 TPM (Trusted Platform Module)

Usando TPM para Armazenamento Chave

Benefícios TPM:

  • ✅ Chaves protegidas hardware
  • ✅ Chaves nunca saem TPM
  • ✅ Resistente adulteração
  • ✅ Atestação plataforma
#============================================#
# TPM PARA CHAVES CERTIFICADO (AVANÇADO)
#============================================#

# Verificar se TPM disponível
ls /dev/tpm*

# Instalar ferramentas TPM
sudo dnf install tpm2-tools -y

# Gerar chave em TPM
tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx
tpm2_create -G rsa -u rsa.pub -r rsa.priv -C primary.ctx

# Usar chave TPM com OpenSSL requer setup adicional
# (Complexo, caso uso empresarial)

# Para certmonger com TPM:
# Experimental/avançado - verificar docs Red Hat

40.5 Smart Cards e PIV

Usando Smart Cards para Autenticação

#============================================#
# SETUP SMART CARD (PIV/CAC)
#============================================#

# Instalar suporte smart card
sudo dnf install opensc pcsc-lite -y

# Iniciar daemon PC/SC
sudo systemctl enable --now pcscd

# Verificar se cartão legível
pkcs11-tool --list-slots

# Listar certificados no cartão
pkcs11-tool --list-objects

# Usar smart card com SSH
# /etc/ssh/sshd_config:
# PubkeyAuthentication yes

# Extrair chave pública do cartão
ssh-keygen -D /usr/lib64/opensc-pkcs11.so > ~/.ssh/authorized_keys

40.6 Auditoria e Monitoramento

auditd para Acesso Certificado

#============================================#
# AUDITAR ACESSO CERTIFICADO
#============================================#

# Adicionar regras audit para acesso chave privada
sudo auditctl -w /etc/pki/tls/private/ -p war -k certificate-access

# Tornar permanente
echo "-w /etc/pki/tls/private/ -p war -k certificate-access" | \
  sudo tee -a /etc/audit/rules.d/certificate.rules

# Recarregar regras
sudo augenrules --load

# Monitorar acesso
sudo ausearch -k certificate-access

# Monitoramento tempo real
sudo ausearch -k certificate-access -ts recent -i

40.7 Scanning OpenSCAP

Scanning Conformidade Segurança

#============================================#
# SCANNING CERTIFICADO OPENSCAP
#============================================#

# Instalar OpenSCAP
sudo dnf install openscap-scanner scap-security-guide -y

# Scan por problemas certificado
sudo oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_pci-dss \
  --results scan-results.xml \
  --report scan-report.html \
  /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

# Ver relatório
firefox scan-report.html

# Verificações relacionadas certificado:
# - Permissões arquivo
# - Contextos SELinux
# - Algoritmos fracos
# - Expiração

40.8 Lista de verificação de fortalecimento de segurança

## Lista de verificação de fortalecimento de segurança de certificados

### Segurança Arquivo
- [ ] Chaves privadas modo 400 ou 600 (nunca 644!)
- [ ] Certificados modo 444 ou 644
- [ ] Propriedade: root:root ou usuário serviço
- [ ] Contextos SELinux: cert_t
- [ ] Considerar flag imutável (+i) para certs críticos

### Controle Acesso
- [ ] SELinux enforcing
- [ ] Regras audit para acesso chave privada
- [ ] Firewall limitando portas TLS
- [ ] Princípio menor privilégio aplicado

### Segurança Algoritmo
- [ ] Apenas assinaturas SHA-256+
- [ ] Chaves RSA 2048+ ou ECC P-256+
- [ ] Apenas TLS 1.2+ (sem 1.0/1.1)
- [ ] Cifras fortes (via crypto-policy)
- [ ] Modo FIPS se requerido

### Segurança Operacional
- [ ] Certificados monitorados para expiração
- [ ] Renovação automática habilitada (certmonger)
- [ ] Backups criptografados
- [ ] Chaves nunca emailadas ou em tickets
- [ ] Acesso logado e revisado
- [ ] Scans segurança regulares

### Segurança Rede
- [ ] Regras firewall restritivas
- [ ] Apenas portas necessárias abertas
- [ ] Certificate pinning (onde aplicável)
- [ ] HSTS habilitado para servidores web
- [ ] OCSP stapling habilitado

### Conformidade
- [ ] Scans OpenSCAP passando
- [ ] Conformidade STIG verificada
- [ ] Benchmarks CIS cumpridos
- [ ] Documentação atual
- [ ] Trilha auditoria mantida

40.9 Conclusões Chave

  1. Defesa em profundidade - Múltiplas camadas segurança
  2. SELinux enforcing - Obrigatório para produção
  3. Permissões arquivo críticas - 400/600 para chaves
  4. Auditar tudo - Rastrear acesso chave
  5. TPM para alta segurança - Proteção hardware
  6. OpenSCAP para conformidade - Scanning automatizado
  7. Monitorar continuamente - Segurança é contínua

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ FORTALECIMENTO DE SEGURANÇA DE CERTIFICADOS                  │
├──────────────────────────────────────────────────────────────┤
│ Permissões:   chmod 400 /etc/pki/tls/private/*.key           │
│               chmod 444 /etc/pki/tls/certs/*.crt             │
│                                                              │
│ SELinux:      getenforce (deve ser Enforcing)                │
│               restorecon -Rv /etc/pki/tls/                   │
│               ls -Z (verificar contextos)                    │
│                                                              │
│ Auditoria:    auditctl -w /etc/pki/tls/private/ -p war       │
│               ausearch -k certificate-access                 │
│                                                              │
│ Scan:         oscap xccdf eval --profile pci-dss ...         │
│                                                              │
│ Imutável:     chattr +i /etc/pki/tls/private/key.key         │
│               chattr -i (para modificar)                     │
└──────────────────────────────────────────────────────────────┘

✅ SELinux enforcing é obrigatório
✅ Auditar acesso chave privada
✅ Usar 400 (não 600) para segurança máxima

🧪 Laboratório Prático

Lab 20: Fortalecimento de Segurança

Aplique melhores práticas de segurança às configurações de certificados

  • 📁 Localização: labs/pt_BR/20-security-hardening/
  • ⏱️ Tempo: 30-40 minutos
  • 🎯 Nível: Avançado

Navegação do Capítulo

Capítulo 41: Conformidade e Auditoria

Cumprir Requisitos: Aprenda como cumprir requisitos conformidade segurança (STIG, CIS, PCI-DSS) e auditar configurações certificado no RHEL.


41.1 Frameworks Conformidade

Requisitos Comuns Relacionados Certificado

FrameworkFocoRequisitos Certificado
STIGSegurança DoDFIPS, algoritmos fortes, auditoria
CIS BenchmarkMelhores práticas indústriaTLS 1.2+, cifras fortes, permissões
PCI-DSSIndústria cartão pagamentoCrypto forte, sem TLS/cifras fracas
HIPAAHealthcareCriptografia, controle acesso, auditoria
NIST 800-53Sistemas federaisFIPS, algoritmos aprovados, monitoramento

41.2 Conformidade STIG

Requisitos DISA STIG para Certificados

Requisitos STIG Chave:

## Controles STIG Certificado

### V-238200: SSH deve usar cifras fortes
- Requisito: Apenas algoritmos aprovados FIPS
- Verificar: /etc/ssh/sshd_config
- Corrigir: Usar crypto-policies (RHEL 8+)

### V-238201: Servidor web deve usar TLS forte
- Requisito: Apenas TLS 1.2+
- Verificar: Configuração Apache/NGINX
- Corrigir: Desabilitar TLS 1.0/1.1

### V-238202: Certificados devem ser de CA aprovada DoD
- Requisito: Usar CA aprovada
- Verificar: Emissor certificado
- Corrigir: Obter de fonte aprovada

### V-238203: Chaves privadas devem ser protegidas
- Requisito: Modo 600 ou mais rigoroso
- Verificar: ls -l /etc/pki/tls/private/
- Corrigir: chmod 600

### V-238204: Expiração certificado deve ser monitorada
- Requisito: Monitoramento automatizado
- Verificar: Sistema monitoramento em vigor
- Corrigir: Implementar (ver Capítulo 26)

Scanning Conformidade STIG

#============================================#
# SCAN CONFORMIDADE STIG PARA CERTIFICADOS
#============================================#

# Instalar SCAP Security Guide
sudo dnf install scap-security-guide openscap-scanner -y

# Executar scan STIG
sudo oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_stig \
  --results stig-results.xml \
  --report stig-report.html \
  /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

# Ver relatório
firefox stig-report.html

# Verificar descobertas específicas certificado
grep -i "cert\|tls\|ssl" stig-report.html

41.3 Conformidade CIS Benchmark

Controles CIS para Certificados

Recomendações CIS RHEL Benchmark:

## Controles Certificado CIS

### 5.2.14: Garantir apenas cifras fortes usadas
- Verificar: Crypto-policy DEFAULT ou FUTURE
- Comando: `update-crypto-policies --show`

### 5.2.15: Garantir apenas algoritmos fortes usados
- Verificar: Sem MD5, SHA-1, chaves fracas
- Scan: Verificar todos certificados

### 5.2.16: Garantir TLS 1.2 mínimo
- Verificar: Crypto-policy ou config serviço
- Testar: `openssl s_client -tls1_2`

### 5.3.1: Garantir permissões em chaves privadas
- Requisito: 600 ou mais rigoroso
- Verificar: `ls -l /etc/pki/tls/private/`

### 5.3.2: Garantir monitoramento expiração certificado
- Requisito: Verificações automatizadas
- Implementação: certmonger ou script monitoramento

Scan Conformidade CIS

#============================================#
# SCAN CIS BENCHMARK
#============================================#

# Executar scan CIS
sudo oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_cis \
  --results cis-results.xml \
  --report cis-report.html \
  /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

# Gerar script remediação
sudo oscap xccdf generate fix \
  --profile xccdf_org.ssgproject.content_profile_cis \
  --fix-type bash \
  cis-results.xml > remediation.sh

# Revisar e executar remediação
chmod +x remediation.sh
sudo ./remediation.sh

41.4 Conformidade PCI-DSS

Requisitos Certificado PCI-DSS

Requisitos PCI-DSS v4.0:

## Controles Certificado PCI-DSS

### Requisito 4.2.1: Criptografia forte
- TLS 1.2 mínimo (1.3 recomendado)
- Apenas suites cipher fortes
- Verificar: crypto-policy DEFAULT ou FUTURE

### Requisito 4.2.1.1: Protocolos inseguros desabilitados
- SEM SSL, TLS 1.0, TLS 1.1
- Verificar: `openssl s_client -tls1`
- Deveria falhar em sistema conforme

### Requisito 4.2.1.2: Algoritmos criptografia fortes
- AES-128 mínimo
- SEM 3DES, DES, RC4
- Verificar: `openssl ciphers -v`

### Requisito 8.3.2: Autenticação baseada certificado
- Para acesso administrativo
- Implementação: Certificados cliente, smart cards

### Requisito 10: Auditar acesso certificado
- Logar todo acesso chave privada
- Implementação: Regras auditd

Script Validação PCI-DSS

#!/bin/bash
# pci-dss-cert-check.sh

echo "=== Verificação Conformidade Certificado PCI-DSS ==="

# Verificação 1: Apenas TLS 1.2+
echo "1. Verificação Versão TLS:"
if openssl s_client -connect localhost:443 -tls1 &>/dev/null; then
  echo "  ❌ FALHA: TLS 1.0 está habilitado"
else
  echo "  ✅ PASSOU: TLS 1.0 desabilitado"
fi

# Verificação 2: Cifras fortes
echo ""
echo "2. Força Cipher:"
WEAK=$(openssl ciphers -v | grep -Ei "3des|rc4|des-cbc" | wc -l)
if [ $WEAK -gt 0 ]; then
  echo "  ❌ FALHA: Cifras fracas disponíveis"
else
  echo "  ✅ PASSOU: Sem cifras fracas"
fi

# Verificação 3: Monitoramento expiração certificado
echo ""
echo "3. Monitoramento Expiração:"
if systemctl is-active --quiet certmonger || \
   systemctl list-timers | grep -q cert-monitor; then
  echo "  ✅ PASSOU: Monitoramento habilitado"
else
  echo "  ⚠️ AVISO: Nenhum monitoramento automatizado detectado"
fi

# Verificação 4: Permissões chave privada
echo ""
echo "4. Permissões Chave Privada:"
BAD_PERMS=$(find /etc/pki/tls/private/ -name "*.key" -not -perm 600 2>/dev/null | wc -l)
if [ $BAD_PERMS -gt 0 ]; then
  echo "  ❌ FALHA: $BAD_PERMS chaves com permissões erradas"
else
  echo "  ✅ PASSOU: Todas chaves apropriadamente protegidas"
fi

echo ""
echo "=== Verificação Completa ==="

41.5 Procedimentos Auditoria

Lista de verificação de auditoria de certificados

## Lista de verificação trimestral de auditoria de certificados

### Revisão Inventário
- [ ] Todos certificados documentados
- [ ] Inventário certificados atual
- [ ] Propriedade documentada
- [ ] Propósito documentado

### Revisão Expiração
- [ ] Sem certificados expirados
- [ ] Sem certificados expirando < 30 dias
- [ ] Processo renovação documentado
- [ ] Alertas monitoramento funcionando

### Revisão Segurança
- [ ] Apenas assinaturas SHA-256+ (sem SHA-1 e MD5)
- [ ] Chaves RSA 2048+ ou ECC P-256+
- [ ] Apenas TLS 1.2+ (sem 1.0/1.1)
- [ ] Permissões chave privada corretas (600)
- [ ] Contextos SELinux corretos
- [ ] Sem certificados desnecessários

### Revisão Configuração
- [ ] Configurações serviço revisadas
- [ ] Crypto-policy apropriada
- [ ] Sem overrides cipher fracos
- [ ] HSTS habilitado (servidores web)
- [ ] Certificate pinning documentado

### Revisão Acesso
- [ ] Logs audit revisados
- [ ] Acesso não autorizado investigado
- [ ] Acesso chave limitado a pessoal autorizado
- [ ] Acesso backup controlado

### Revisão Conformidade
- [ ] Conformidade STIG/CIS/PCI verificada
- [ ] Scans segurança passando
- [ ] Remediação completa
- [ ] Documentação atualizada

41.6 Relatório Conformidade Automatizado

Gerar Relatório Conformidade

#!/bin/bash
# generate-compliance-report.sh

REPORT_FILE="compliance-report-$(date +%Y%m%d).txt"

cat > "$REPORT_FILE" << EOF
=== Relatório Conformidade Certificado ===
Gerado: $(date)
Sistema: $(hostname)
Versão RHEL: $(cat /etc/redhat-release)

=== Configuração ===
Versão OpenSSL: $(openssl version)
Crypto-Policy: $(update-crypto-policies --show 2>/dev/null || echo "N/A (RHEL 7)")
Modo FIPS: $(fips-mode-setup --check 2>/dev/null || echo "N/A")
SELinux: $(getenforce)

=== Inventário Certificados ===
EOF

# Contar certificados
TOTAL=$(find /etc/pki/tls/certs/ -name "*.crt" -type f 2>/dev/null | wc -l)
echo "Total Certificados: $TOTAL" >> "$REPORT_FILE"

# Verificar expirações
echo "" >> "$REPORT_FILE"
echo "Status Expiração:" >> "$REPORT_FILE"
EXPIRING=0
for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue
  if ! openssl x509 -in "$cert" -noout -checkend $((86400*30)) 2>/dev/null; then
    echo "  ⚠️ Expira dentro 30 dias: $cert" >> "$REPORT_FILE"
    ((EXPIRING++))
  fi
done
echo "Certificados expirando < 30 dias: $EXPIRING" >> "$REPORT_FILE"

# Verificar algoritmos
echo "" >> "$REPORT_FILE"
echo "Conformidade Algoritmo:" >> "$REPORT_FILE"
SHA1_COUNT=0
for cert in /etc/pki/tls/certs/*.crt; do
  [ -f "$cert" ] || continue
  if openssl x509 -in "$cert" -noout -text 2>/dev/null | grep -qi "sha1.*signature"; then
    echo "  ❌ Assinatura SHA-1: $cert" >> "$REPORT_FILE"
    ((SHA1_COUNT++))
  fi
done
echo "Certificados SHA-1: $SHA1_COUNT (deveria ser 0)" >> "$REPORT_FILE"

# Verificar permissões
echo "" >> "$REPORT_FILE"
echo "Conformidade Permissão:" >> "$REPORT_FILE"
BAD_PERMS=$(find /etc/pki/tls/private/ -name "*.key" -not -perm 600 2>/dev/null | wc -l)
echo "Chaves com permissões incorretas: $BAD_PERMS (deveria ser 0)" >> "$REPORT_FILE"

# Status certmonger
if command -v getcert &>/dev/null; then
  echo "" >> "$REPORT_FILE"
  echo "Status certmonger:" >> "$REPORT_FILE"
  sudo getcert list | grep "status:" | sort | uniq -c >> "$REPORT_FILE"
fi

echo "" >> "$REPORT_FILE"
echo "=== Relatório Completo ===" >> "$REPORT_FILE"

cat "$REPORT_FILE"
echo ""
echo "Relatório salvo em: $REPORT_FILE"

41.7 Conclusões Chave

  1. Conformidade é contínua - Não única vez
  2. Múltiplos frameworks existem - STIG, CIS, PCI, HIPAA
  3. OpenSCAP automatiza scanning no RHEL
  4. Documentar tudo - Requerido para auditorias
  5. Auditorias regulares essenciais - Trimestral mínimo
  6. Remediação deve ser rastreada - Corrigir e verificar
  7. Monitoramento é conformidade - Validação contínua

Cartão de Referência Rápida

┌──────────────────────────────────────────────────────────────┐
│ REFERÊNCIA RÁPIDA CONFORMIDADE E AUDITORIA                   │
├──────────────────────────────────────────────────────────────┤
│ STIG:         oscap ... --profile stig                       │
│ CIS:          oscap ... --profile cis                        │
│ PCI-DSS:      oscap ... --profile pci-dss                    │
│                                                              │
│ Requisitos Comuns:                                           │
│   - Apenas TLS 1.2+                                          │
│   - Algoritmos fortes (SHA-256+, RSA 2048+)                  │
│   - Sem cifras fracas (3DES, RC4)                            │
│   - Chaves privadas protegidas (modo 600)                    │
│   - Monitoramento expiração                                  │
│   - Logging auditoria habilitado                             │
│   - Modo FIPS (para federal)                                 │
│                                                              │
│ Ferramentas:  OpenSCAP, aide, auditd                         │
│ Scan:         oscap xccdf eval --profile <profile> ...       │
│ Remediar:     oscap xccdf generate fix ...                   │
└──────────────────────────────────────────────────────────────┘

✅ Conformidade é contínua, não única vez
✅ Automatizar scanning com OpenSCAP
✅ Documentar todas configurações e exceções

Navegação do Capítulo

Guia de Trilha de Aprendizado

Como usar este tutorial de forma eficaz com base no seu papel e nível de experiência.


🎯 Para Iniciantes Completos

Objetivo: Aprender certificados do zero

Caminho: Ler em ordem (8 semanas)

Semana 1: Fundamentos (Cap 1-7)

  • Cap 1: Criptografia, Estrutura PKI e Fundamentos
  • Cap 2: Introdução aos Certificados no RHEL
  • Cap 3: Visão Geral das Ferramentas de Certificados do RHEL
  • Cap 4: Criptografia Básica para Administradores RHEL
  • Cap 5: Certificados X.509 no RHEL
  • Cap 6: Mergulho Profundo no Repositório de Confiança RHEL
  • Cap 7: Assinaturas Digitais e Verificação no RHEL
  • Resultado: Entender certificados, cadeias de confiança e ferramentas RHEL

Semana 2: Domínio das Versões (Cap 8-13)

  • Cap 8: Diferenças entre versões
  • Cap 9: RHEL 7
  • Cap 10: RHEL 8
  • Cap 11: RHEL 9
  • Cap 12: RHEL 10
  • Cap 13: Compatibilidade
  • Resultado: Conhecer as diferenças entre versões

Semana 3-4: Serviços (Cap 14-21)

  • Configurar Apache, NGINX, Postfix, LDAP, bancos de dados, FreeIPA
  • Resultado: Poder configurar qualquer serviço

Semana 5: Automatização (Cap 22-26)

  • certmonger, crypto-policies, Ansible, monitoramento
  • Resultado: Automatizar o ciclo de vida dos certificados

Semana 6: Solução de Problemas (Cap 27-33)

  • Dominar a solução de problemas sistemática
  • Resultado: Poder corrigir qualquer problema de certificado! ⭐

Semana 7: Migração (Cap 34-37)

  • Procedimentos de atualização do RHEL
  • Resultado: Migrar versões do RHEL com segurança

Semana 8: Segurança (Cap 38-41)

  • FIPS, fortalecimento, conformidade
  • Resultado: Cumprir os requisitos de segurança

🔧 Para Administradores de Sistema

Objetivo: Configurar e manter certificados

Caminho Recomendado:

  1. Início Rápido (3-5 horas)

    • Cap 1: Criptografia e Fundamentos de PKI
    • Cap 3: Ferramentas
    • Cap 27: Metodologia de Solução de Problemas de Certificados RHEL
  2. Sua Versão do RHEL (1-2 horas)

    • Cap 9 (RHEL 7), Cap 10 (RHEL 8), Cap 11 (RHEL 9) ou Cap 12 (RHEL 10)
  3. Seus Serviços (3-4 horas)

    • Cap 14-21: escolher capítulos para os serviços que você usa
  4. Automatização (2-3 horas)

    • Cap 22: certmonger
    • Cap 23: Crypto-policies (se RHEL 8+)
  5. Referência

    • Manter Cap 27-33 à mão para solução de problemas

Tempo Total: ~10-15 horas para proficiência


🚨 Para Engenheiros de Suporte

Objetivo: Resolver problemas de certificado rapidamente

Caminho Rápido:

  1. Começar Aqui (1 hora)

  2. Problemas Comuns (2 horas)

    • Cap 28: Erros Comuns de Certificados no RHEL
    • Cap 29: Solução de Problemas Específica por Serviço
    • Cap 30: Solução de Problemas do certmonger
    • Cap 31: Solução de Problemas de Crypto-Policy
  3. Ferramentas (1 hora)

    • Cap 3: Ferramentas RHEL
    • Cap 32: Relatórios SOS
  4. Emergência (30 min)

    • Cap 33: Procedimentos de Emergência
  5. Referência Conforme Necessário

    • Cap 9-12: capítulos específicos por versão
    • Cap 14-21: capítulos por serviço

Tempo Total: 5-8 horas para proficiência em solução de problemas

Depois: Usar capítulos como referência durante incidentes


🏢 Para Arquitetos Empresariais

Objetivo: Projetar infraestrutura de certificados

Caminho Estratégico:

  1. Visão Geral (1 hora)

    • Cap 1-2: Fundamentos e introdução
  2. CA Empresarial (2 horas)

    • Cap 19: Serviços de Certificados do FreeIPA
  3. Automatização (3 horas)

    • Cap 22: certmonger
    • Cap 23: Crypto-policies
    • Cap 25: Automatização Ansible para Certificados
  4. Melhores Práticas (2 horas)

    • Cap 21: Melhores Práticas de Certificados de Serviço
    • Cap 26: Monitoramento e Alertas no RHEL
  5. Segurança (3 horas)

    • Cap 38-41: FIPS, fortalecimento, conformidade
  6. Migração (2 horas)

    • Cap 34-37: se estiver planejando atualizações

Tempo Total: ~13 horas para conhecimento de arquitetura


🔒 Para Times de Segurança/Conformidade

Objetivo: Garantir conformidade e segurança

Caminho de Conformidade:

  1. Fundação (1 hora)

    • Cap 1: Criptografia e Fundamentos de PKI
    • Cap 2: Introdução a Certificados no RHEL
  2. Foco em Segurança (4 horas)

    • Cap 38: Modo FIPS
    • Cap 39: Certificados Conformes FIPS
    • Cap 40: Fortalecimento de Segurança de Certificados no RHEL
    • Cap 41: Conformidade e Auditoria ⭐
  3. Crypto-Policies (1 hora)

    • Cap 23: entendendo controles em todo o sistema
  4. Monitoramento (1 hora)

    • Cap 26: Monitoramento e Alertas no RHEL
  5. Procedimentos de Auditoria (1 hora)

    • Cap 32: Relatórios SOS
    • Cap 41: procedimentos de auditoria

Tempo Total: ~8-10 horas para expertise em conformidade


🎓 Para Preparação de Treinamento/Certificação

Objetivo: Domínio completo

Caminho Completo: Todos os capítulos em ordem

Investimento de Tempo: 40-50 horas

Resultado: Conhecimento em nível expert de gerenciamento de certificados no RHEL


📚 Pontos de Entrada

Por Tipo de Problema:

“Serviço não inicia” → Cap 28 (Erros Comuns), Cap 29 (Solução de Problemas Específica por Serviço)

“Clientes não conseguem conectar” → Cap 13 (Compatibilidade), Cap 31 (Solução de Problemas de Crypto-Policy)

“certmonger não está renovando” → Cap 30 (Solução de Problemas do certmonger)

“Planejando atualização do RHEL” → Cap 34-37 (Migração)

“Precisa de conformidade FIPS” → Cap 38-39 (FIPS)

“Configurando novo serviço” → Cap 14-21 (capítulos por serviço)

Por Versão do RHEL:

Usando RHEL 7 → Cap 9 (Gerenciamento no RHEL 7)

Usando RHEL 8 → Cap 10 (Crypto-Policies são a chave!)

Usando RHEL 9 → Cap 11 (OpenSSL 3.x, SHA-1 bloqueado)

Usando RHEL 10 → Cap 12 (recursos mais recentes)

Ambiente misto → Cap 13 (Compatibilidade Entre Versões)


🗺️ Mapa do Tutorial

COMEÇAR AQUI
    │
    ├─ Novo em certificados?
    │   └─ Cap 1 → Cap 2 → Cap 3 → Continuar em ordem
    │
    ├─ Precisa de solução de problemas AGORA?
    │   └─ Cap 27 → Cap 28 → Cap 29 → Cap 33
    │
    ├─ Configurando um serviço?
    │   └─ Cap 14-21 (escolher seu serviço)
    │
    ├─ Planejando migração?
    │   └─ Cap 34 → Cap 35/36 → Cap 37
    │
    ├─ Precisa de automatização?
    │   └─ Cap 22 (certmonger) → Cap 23 (crypto-policies)
    │
    └─ Conformidade exigida?
        └─ Cap 38-41 (FIPS, segurança, auditoria)

⏱️ Estimativas de Tempo

CaminhoTempoCapítulos
Início Rápido3-5 horas1, 3, 27
Solução de Problemas5-8 horas27-33
Iniciante Completo40-50 horasTodos em ordem
Administrador de sistemas10-15 horasCapítulos selecionados
Engenheiro de Suporte5-8 horasFoco em solução de problemas
Conformidade8-10 horasCapítulos de segurança

💡 Dicas de Estudo

  1. Prática é essencial — praticar em uma VM RHEL
  2. Seguir exemplos — copiar, colar e entender
  3. Usar referências rápidas — no final de cada capítulo
  4. Marcar solução de problemas — Capítulos 27-33
  5. Conhecer sua versão do RHEL — focar nos capítulos relevantes
  6. Montar um lab — usar FreeIPA para prática

Começar Aprendizado: Capítulo 1: Criptografia, Estrutura PKI e Fundamentos →

Precisa de Ajuda Rápida: Início Rápido de Solução de Problemas →

Referência de Versão: Folha de Referência de Versões RHEL para Certificados →

Início Rápido de Solução de Problemas

Quando você tiver um problema de certificado, comece aqui!


🚨 Emergência? Pule para o Capítulo 33!

Se a produção estiver fora do ar, vá imediatamente para Capítulo 33: Procedimentos de Emergência


📋 O Método de 7 Passos (Capítulo 27)

1. Identificar: versão do RHEL, OpenSSL e crypto-policy
2. Verificar: expiração, hostname, correspondência chave-certificado e algoritmo
3. Confiança: validação da CA, cadeia e intermediários
4. Configuração: arquivos do serviço, caminhos e permissões
5. Sistema: crypto-policy, FIPS, SELinux e firewall
6. Testar: conexões ao vivo, curl e openssl s_client
7. Logs: logs do serviço, journal e auditoria SELinux

Metodologia completa: Capítulo 27


⚡ Diagnóstico Rápido

Primeiros 60 Segundos

# Qual versão do RHEL?
cat /etc/redhat-release

# Certificado expirado?
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -checkend 0

# Serviço em execução?
systemctl status httpd

# Erros recentes?
journalctl -xe | grep -i cert | tail -20

# Crypto-policy? (RHEL 8+)
update-crypto-policies --show

🔍 Problemas Comuns

Certificado Expirado

# Verificar
openssl x509 -in cert.crt -noout -dates

# Corrigir
sudo getcert resubmit -f cert.crt  # Se estiver usando certmonger
# Ou renovar manualmente, ou usar os procedimentos de emergência do Capítulo 33

Cadeia de Confiança Quebrada

# Verificar
openssl verify cert.crt

# Corrigir
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Permissão Negada

# Verificar
ls -l /etc/pki/tls/private/server.key

# Corrigir
sudo chmod 600 /etc/pki/tls/private/server.key
sudo chown root:root /etc/pki/tls/private/server.key

Desajuste de Hostname

# Verificar
openssl x509 -in cert.crt -noout -ext subjectAltName

# Corrigir
# Reemitir certificado com SANs corretos

Nenhuma Cifra em Comum (RHEL 8+)

# Verificar
update-crypto-policies --show

# Correção temporária
sudo update-crypto-policies --set LEGACY
sudo systemctl restart httpd

# Correção apropriada: atualizar o cliente para suportar TLS 1.2+

SHA-1 Rejeitado (RHEL 9+)

# Verificar
openssl x509 -in cert.crt -noout -text | grep "Signature Algorithm"

# Corrigir
# Deve reemitir com SHA-256+ (sem contorno alternativo)

📖 Onde Procurar

Tipo de ProblemaIr para o Capítulo
Solução de problemas geralCapítulo 27
Erros comunsCapítulo 28
Problemas Apache/NGINX/PostfixCapítulo 29
Problemas do certmongerCapítulo 30
Problemas de crypto-policyCapítulo 31
Análise de relatórios SOSCapítulo 32
Emergência em produçãoCapítulo 33
Específico para RHEL 7Capítulo 9
Específico para RHEL 8Capítulo 10
Específico para RHEL 9Capítulo 11
Específico para RHEL 10Capítulo 12
Após migraçãoCapítulos 35-36

⚙️ Comandos Específicos por Serviço

# Apache
apachectl configtest
tail -f /var/log/httpd/ssl_error_log

# NGINX
nginx -t
tail -f /var/log/nginx/error.log

# Postfix
postfix check
tail -f /var/log/maillog | grep TLS

# OpenLDAP
slapcat -b "cn=config" | grep TLS
# Nota: as chaves devem pertencer a ldap:ldap!

# PostgreSQL
sudo -u postgres psql -c "SHOW ssl;"
# Nota: as chaves devem pertencer a postgres:postgres!

# certmonger
getcert list
journalctl -u certmonger -f

🎯 Referência Rápida

Problemas Mais Comuns:

  1. Certificado expirado → Renovar
  2. CA faltando → Adicionar ao repositório de confiança
  3. Permissões erradas → chmod 600
  4. Desajuste cert/chave → Regenerar CSR
  5. Desajuste de hostname → Reemitir com SANs
  6. Versão TLS → Verificar crypto-policy
  7. SELinux negando → restorecon
  8. certmonger CA_UNREACHABLE → Verificar IPA/Kerberos

Emergência: Capítulo 33

Metodologia: Capítulo 27

Folha de Referência de Versões RHEL para Certificados

Referência rápida para diferenças de certificados entre as versões do RHEL.


Visão Geral das Versões

RHELLançadoOpenSSLSuporte TLSCrypto-PoliciesRecurso Principal
720141.0.2k-261.0/1.1/1.2❌ NãoConfiguração manual
820191.1.1k-141.2/1.3NOVO!Políticas em todo o sistema
920223.5.5-21.2/1.3✅ AprimoradoOpenSSL 3.x, rigoroso
1020253.5.5-21.3 pref✅ AprimoradoPreparação PQC, moderno

Detecção Rápida

# Verificar versão do RHEL
cat /etc/redhat-release

# Verificar OpenSSL (verificação indireta da versão)
openssl version
# 1.0.2k = RHEL 7
# 1.1.1k = RHEL 8
# 3.5.5  = RHEL 9 ou 10

# Verificar crypto-policies (apenas RHEL 8+)
update-crypto-policies --show 2>/dev/null || echo "RHEL 7 (sem crypto-policies)"

Configuração TLS por Versão

RHEL 7

# Configuração manual necessária em todo lugar
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES

RHEL 8/9/10

# crypto-policies lidam com isso automaticamente!
# Sem necessidade de SSLProtocol ou SSLCipherSuite
# Apenas incluir os caminhos do certificado

Comandos Comuns por Versão

TarefaRHEL 7RHEL 8/9/10
Gerar Chaveopenssl genrsa -out key 2048openssl genpkey -algorithm RSA -out key
Verificar PolíticaN/Aupdate-crypto-policies --show
Config TLSManual por serviçoAutomática via crypto-policies
certmongerBásicoAprimorado (RHEL 9: suporte ACME)

Solução de Problemas por Versão

RHEL 7

  • Verificar problemas com TLS 1.0/1.1
  • Configurações manuais de cifra
  • Sem crypto-policies

RHEL 8

  • Verificar crypto-policy primeiro!
  • TLS 1.0/1.1 desabilitados em DEFAULT
  • Política LEGACY para compatibilidade

RHEL 9

  • Problemas com o provider OpenSSL 3.x
  • SHA-1 BLOQUEADO
  • Usar -provider legacy para algoritmos antigos

RHEL 10

  • Mesmo que RHEL 9
  • Padrões ainda mais rigorosos
  • Verificar documentação da versão menor

Impacto da Migração

MigraçãoImpacto em CertificadosMudanças Principais
7→8Moderado-Altocrypto-policies, TLS 1.0/1.1 bloqueados
8→9AltoOpenSSL 3.x, SHA-1 bloqueado, mais rigoroso
9→10BaixoMesmo OpenSSL, fortalecimento incremental

Correções Rápidas por Versão

Erro “no shared cipher”

  • RHEL 7: Atualizar a configuração de cifra manualmente
  • RHEL 8/9/10: sudo update-crypto-policies --set LEGACY (temp!)

Certificado SHA-1

  • RHEL 7/8: Funciona (depreciado)
  • RHEL 9/10: BLOQUEADO — deve reemitir

Cliente TLS 1.0

  • RHEL 7: Funciona por padrão
  • RHEL 8/9/10: Bloqueado em DEFAULT, usar LEGACY (temp!)

Detalhes Completos: Ver Capítulos 9-12

Apêndice A: cert-manager do Kubernetes

cert-manager é um projeto CNCF que automatiza emissão de certificados dentro de clusters Kubernetes.

1. Arquitetura

  • Emissor / EmissorCluster – Define CA ou servidor ACME.
  • Certificado – Estado desejado para um cert (nomes DNS, duração).
  • Controlador – Reconcilia recursos, armazena segredos.
graph LR
  subgraph K8s
    A[Certificado] --> B[Segredo TLS]
    A --> C(Emissor)
  end
  C -->|ACME| LE[Let's Encrypt]

2. Instalação

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.1/cert-manager.yaml

3. Exemplo: TLS Ingress

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: le-key
    solvers:
    - http01:
        ingress:
          class: nginx
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: web-tls
  namespace: default
spec:
  secretName: web-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: example.com
  dnsNames:
  - example.com
  - www.example.com

4. Renovação e Status

kubectl describe certificate web-tls mostra condição Ready e próximo tempo de renovação.


🧪 Laboratório Prático

Lab 21: cert-manager do Kubernetes

Automatize gerenciamento de certificados no Kubernetes

  • 📁 Localização: labs/pt_BR/21-kubernetes-cert-manager/
  • ⏱️ Tempo: 50-60 minutos
  • 🎯 Nível: Avançado

Apêndice B: PKI do HashiCorp Vault

Vault fornece uma PKI dinâmica onde certificados são emitidos sob demanda com TTLs curtos.

1. Por Que Vault?

  • Aplicação centralizada de políticas
  • Certs dinâmicos de curta duração reduzem necessidades de revogação
  • Impulsado por API (REST + CLI)

2. Habilitar Motor PKI

vault secrets enable pki
vault secrets tune -max-lease-ttl=87600h pki
vault write pki/root/generate/internal common_name="corp.example" ttl=87600h
vault write pki/config/urls issuing_certificates="https://vault.corp/v1/pki/ca" \
                                    crl_distribution_points="https://vault.corp/v1/pki/crl"

3. Roles e Emissão

vault write pki/roles/web allowed_domains="web.corp" allow_subdomains=true max_ttl=72h
vault write pki/issue/web common_name=app01.web.corp ttl=24h

4. Renovação Automática Sidecar do Agente

# vault-agent.hcl
pid_file = "/var/run/agent.pid"
auto_auth {
  method "kubernetes" {
    mount_path = "auth/k8s"
    role       = "web"
  }
  sink "file" {
    config = {
      path = "/etc/tls/web.pem"
    }
  }
}

🧪 Laboratório Prático

Lab 22: PKI do HashiCorp Vault

Emissão dinâmica de certificados com Vault

  • 📁 Localização: labs/pt_BR/22-vault-pki/
  • ⏱️ Tempo: 45-55 minutos
  • 🎯 Nível: Avançado

Apêndice C: Arquitetura Zero Trust

PKI em Arquitetura Zero Trust

Zero Trust (ZT) assume nenhuma confiança implícita baseada em localização de rede. Cada solicitação deve ser autenticada e autorizada.

1. Google BeyondCorp e NIST SP 800-207

Estes frameworks recomendam identidade forte, criptografia de transporte e avaliação contínua.

2. Papel da PKI

  • Identidade de dispositivo via certificados.
  • mTLS para tráfego leste-oeste.
  • Credenciais de curta duração auto-rotacionadas.

3. Perfil de Certificado para ZT

ExtensãoPropósito
SAN: URI:spiffe://ID de Carga Trabalho
Key Usage: digitalSignatureAuthN
EKU: clientAuth, serverAuthTLS Mútuo
Validity ≤ 24hLimitar raio de explosão

4. Pontos de Aplicação de Política

  1. Gateways terminam TLS e verificam certs de cliente.
  2. Service Mesh sidecars realizam mTLS transparentemente.
  3. Agentes de Endpoint mantêm certificados de dispositivo.

5. Lab: Emitir Certificados SPIFFE com cert-manager

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: spiffe-workload
spec:
  duration: 24h
  commonName: spiffe://prod/web/api
  uriSANs:
  - spiffe://prod/web/api
  issuerRef:
    name: mesh-issuer
    kind: ClusterIssuer

Apêndice D: Integração DevSecOps

PKI em DevSecOps e CI/CD

Integrar gerenciamento de certificados em pipelines CI/CD garante que cada artefato de build e ambiente use identidades confiáveis.

1. Assinar Artefatos de Build

  • Contêineres – cosign, Notary v2.
  • Pacotes – Assinaturas GPG RPM/DEB.
  • Binários – Windows Authenticode.

2. TLS Automatizado para Ambientes de Prévia

Pipelines acionam cert-manager para emitir certs efêmeros para branches de curta duração.

3. Exemplo: GitHub Actions com cosign

name: Build & Sign
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Build image
      run: docker build -t ghcr.io/org/app:${{ github.sha }} .
    - name: Login registry
      run: echo ${{ secrets.GH_TOKEN }} | docker login ghcr.io -u user --password-stdin
    - name: Push image
      run: docker push ghcr.io/org/app:${{ github.sha }}
    - name: Sign image
      env:
        COSIGN_EXPERIMENTAL: "1"
        COSIGN_KEY: ${{ secrets.COSIGN_KEY }}
      run: cosign sign -key env://COSIGN_KEY ghcr.io/org/app:${{ github.sha }}

4. Portas de Política

Scanners de segurança de cadeia de suprimento verificam assinaturas e aplicam política antes de implantar.

5. Gerenciamento de Segredos

Armazenar chaves privadas para assinatura no HashiCorp Vault ou AWS KMS, não em segredos de repo.

Apêndice E: Teoria de Políticas PKI

Políticas, Linhas de Base e Auditorias

1. Por Que Políticas Importam

Políticas formalizam como certificados podem ser emitidos e usados, garantindo consistência e defensibilidade legal.

2. Requisitos de Linha de Base (CAB Forum)

Requisitos que CAs publicamente confiáveis devem seguir, incluindo:

  • Métodos de validação de domínio
  • Tamanhos de chave ≥ RSA 2048 bits / ECC 256 bits
  • Validade máxima 398 dias

3. Política de Certificado (CP) vs CPS

DocumentoAudiênciaConteúdo
CPPartes confiantesQue garantia a PKI fornece
CPSAuditores, operadoresComo a CA cumpre a CP

4. Auditorias e Conformidade

  • Auditorias WebTrust / ETSI para CAs públicas.
  • PKIs internas podem alinhar com NIST SP 800-53 ou ISO 27001.

5. Estudo de Caso RHEL

O certmonger do RHEL pode renovar automaticamente certificados de host de acordo com diretrizes CP/CPS empresariais.

Apêndice F: Certificados IoT

Certificados de Dispositivos IoT

Dispositivos Internet das Coisas requerem identidades únicas para comunicação segura. Certificados fornecem prova criptográfica de autenticidade dispositivo.

1. Por Que Certificados para IoT?

  • Identidade Dispositivo – Cada sensor, gateway ou atuador recebe cert único.
  • Redes Zero-Trust – Dispositivos autenticam mutuamente com nuvem/borda.
  • Segurança Cadeia Fornecimento – Certificados provisionados na fabricação previnem clonagem.
  • Atualizações OTA – Code-signing garante integridade firmware.

2. Modelos Provisionamento Certificado

Provisionamento Fábrica

Certificados gravados em armazenamento seguro dispositivo (TPM, elemento seguro) antes envio.

sequenceDiagram
    Factory->>HSM: Gerar par de chaves
    HSM->>Factory: Retorna CSR
    Factory->>CA: Assina CSR
    CA-->>Factory: Certifica
    Factory->>Device: Injeta cert. + chave privada

Provisionamento Just-in-Time

Dispositivo gera chave no primeiro boot, submete CSR para serviço registro.

# Dispositivo gera chave
openssl ecparam -genkey -name prime256v1 -out device.key

# Criar CSR com serial dispositivo
openssl req -new -key device.key -out device.csr -subj "/CN=device-12345/serialNumber=12345"

# Submeter para API enrollment
curl -X POST https://enroll.iot.example.com/csr \
  -H "Authorization: Bearer $ENROLL_TOKEN" \
  --data-binary @device.csr -o device.crt

3. AWS IoT Core

Registrar Certificado Dispositivo

# Gerar chave e CSR
openssl ecparam -genkey -name prime256v1 -out iot-device.key
openssl req -new -key iot-device.key -out iot-device.csr -subj "/CN=iot-device-001"

# Usar AWS CLI para assinar
aws iot create-certificate-from-csr --certificate-signing-request file://iot-device.csr \
  --set-as-active > cert-response.json

# Extrair certificado
jq -r '.certificatePem' cert-response.json > iot-device.crt

Anexar Política

aws iot attach-policy --policy-name IoTDevicePolicy --target arn:aws:iot:region:account:cert/certId

Conectar MQTT

import paho.mqtt.client as mqtt
import ssl

client = mqtt.Client()
client.tls_set(
    ca_certs="AmazonRootCA1.pem",
    certfile="iot-device.crt",
    keyfile="iot-device.key",
    tls_version=ssl.PROTOCOL_TLSv1_2
)
client.connect("xxxxxx.iot.us-east-1.amazonaws.com", 8883)
client.publish("device/telemetry", "{'temp': 22.5}")

4. Azure IoT Hub

Autenticação Dispositivo X.509

# Gerar cert dispositivo assinado por CA customizada
openssl req -new -key device.key -out device.csr -subj "/CN=device-001"
openssl x509 -req -in device.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out device.crt -days 365 -sha256

# Upload CA para Azure IoT Hub (portal ou CLI)
az iot hub certificate create --hub-name MyIoTHub --name MyCACert --path ca.crt

# Conectar dispositivo
from azure.iot.device import IoTHubDeviceClient

device_client = IoTHubDeviceClient.create_from_x509_certificate(
    hostname="MyIoTHub.azure-devices.net",
    device_id="device-001",
    x509=X509(cert_file="device.crt", key_file="device.key")
)
device_client.connect()
device_client.send_message("Hello from device-001")

5. Microchip ATECC608 Elemento Seguro

Chip crypto hardware armazena chaves privadas que nunca saem do silício.

Fluxo Provisionamento

  1. Dispositivo gera par chaves dentro ATECC608.
  2. CSR criado usando chave on-chip.
  3. CA assina CSR, certificado armazenado em EEPROM dispositivo.
// Exemplo Arduino com biblioteca ATECC
#include <ArduinoECCX08.h>

void setup() {
  ECCX08.begin();

  // Gerar CSR
  byte csr[256];
  ECCX08.getCSR(csr);

  // Enviar CSR para CA via HTTP/MQTT
  // Receber certificado assinado
  // Armazenar em EEPROM
}

6. Rotação Certificado para Dispositivos Restritos

Certificados Vida-Curta

Emitir certs 7 dias com renovação automatizada via protocolos leves como EST (RFC 7030).

# EST simple enroll
curl --cacert ca.crt --cert current-device.crt --key device.key \
  https://est.example.com/.well-known/est/simpleenroll \
  --data-binary @new-device.csr -o renewed-device.crt

Certificados Bootstrap

Cert inicial longa-vida usado apenas para enrollment, então substituído por certs operacionais vida-curta.

7. LoRaWAN e Secure Join

LoRaWAN 1.1+ suporta secure join com chaves específicas dispositivo derivadas de certificados:

Device → JoinRequest (assinado com cert DevEUI)
Network Server → JoinAccept (chaves sessão criptografadas)

8. Resumo Melhores Práticas

PráticaJustificativa
Usar ECC (P-256, P-384)Chaves menores, menor consumo energia
Hardware Root of TrustTPM, ATECC ou TrustZone previnem extração chave
Validade Certificado ≤ 1 anoLimitar raio explosão de compromisso
Revogação via OCSP/CRLDesabilitar dispositivos comprometidos remotamente
PKI Separada para IoTIsolar CA dispositivo de TI empresarial

9. Implantações Mundo Real

  • Automotivo – ECUs veículo usam certificados para comunicação V2X (IEEE 1609.2).
  • IoT Industrial – PLCs e dispositivos SCADA autenticados via IEC 62351.
  • Smart Home – Protocolo Matter exige certificados X.509 para comissionamento dispositivo.

Dica Segurança: Nunca embuta mesma chave privada em múltiplos dispositivos. Cada dispositivo deve ter certificado único para habilitar revogação seletiva.

Apêndice G: Certificados VPN

Certificados VPN — OpenVPN, WireGuard e IPsec

Redes Privadas Virtuais usam certificados para autenticar endpoints e estabelecer túneis criptografados.

1. OpenVPN com PKI

Configuração Easy-RSA

git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
./easyrsa gen-dh
openvpn --genkey secret ta.key

Configuração Servidor

/etc/openvpn/server.conf:

port 1194
proto udp
dev tun

ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/server.crt
key /etc/openvpn/pki/private/server.key
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/ta.key 0

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"

cipher AES-256-GCM
auth SHA256
user nobody
group nobody
persist-key
persist-tun

status /var/log/openvpn-status.log
verb 3

Iniciar:

sudo systemctl enable --now openvpn-server@server

Configuração Cliente

client1.ovpn:

client
dev tun
proto udp
remote vpn.example.com 1194

ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

cipher AES-256-GCM
auth SHA256
verb 3

Conectar:

sudo openvpn --config client1.ovpn

2. WireGuard (Sem Certificado mas Baseado em Chave)

WireGuard usa chaves públicas Curve25519 em vez de certificados X.509. No entanto, você pode envolver chaves WireGuard em certificados para gerenciamento identidade empresarial.

Gerar Chaves

wg genkey | tee privatekey | wg pubkey > publickey

Config Servidor

/etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <server-private-key>
Address = 10.9.0.1/24
ListenPort = 51820

[Peer]
PublicKey = <client-public-key>
AllowedIPs = 10.9.0.2/32

Habilitar:

sudo systemctl enable --now wg-quick@wg0

Config Cliente

[Interface]
PrivateKey = <client-private-key>
Address = 10.9.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = <server-public-key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Conectar:

sudo wg-quick up wg0

3. IPsec (strongSwan) com X.509

Instalar strongSwan

sudo dnf install strongswan -y

Gerar Certificados

# CA
ipsec pki --gen --type rsa --size 4096 --outform pem > ca.key.pem
ipsec pki --self --ca --lifetime 3650 --in ca.key.pem --type rsa \
  --dn "CN=VPN CA" --outform pem > ca.crt.pem

# Cert servidor
ipsec pki --gen --type rsa --size 2048 --outform pem > server.key.pem
ipsec pki --req --type priv --in server.key.pem --dn "CN=vpn.example.com" \
  --san vpn.example.com --outform pem > server.req.pem
ipsec pki --issue --cacert ca.crt.pem --cakey ca.key.pem --type pkcs10 \
  --in server.req.pem --lifetime 365 --outform pem > server.crt.pem

# Cert cliente
ipsec pki --gen --type rsa --size 2048 --outform pem > client.key.pem
ipsec pki --req --type priv --in client.key.pem --dn "CN=client@example.com" \
  --outform pem > client.req.pem
ipsec pki --issue --cacert ca.crt.pem --cakey ca.key.pem --type pkcs10 \
  --in client.req.pem --lifetime 365 --outform pem > client.crt.pem

Copiar para /etc/ipsec.d/:

sudo cp ca.crt.pem /etc/ipsec.d/cacerts/
sudo cp server.crt.pem /etc/ipsec.d/certs/
sudo cp server.key.pem /etc/ipsec.d/private/

Configuração Servidor

/etc/ipsec.conf:

config setup
    charondebug="ike 2, knl 2, cfg 2"

conn %default
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    keyexchange=ikev2
    authby=pubkey

conn rw
    leftcert=server.crt.pem
    leftid=@vpn.example.com
    leftsubnet=0.0.0.0/0
    leftfirewall=yes
    right=%any
    rightid=%any
    rightsourceip=10.10.10.0/24
    auto=add

Iniciar:

sudo systemctl enable --now strongswan

Configuração Cliente

Instalar cert/chave cliente, então conectar via NetworkManager ou linha comando.

4. Revogação Certificado em VPNs

CRL OpenVPN

./easyrsa revoke client1
./easyrsa gen-crl

Atualizar server.conf:

crl-verify /etc/openvpn/pki/crl.pem

OCSP strongSwan

Em /etc/ipsec.conf:

conn rw
    leftcert=server.crt.pem
    leftsendcert=always
    rightca="CN=VPN CA"
    rightcert=*
    ocsp_uri=http://ocsp.example.com

5. Comparação

VPNSuporte CertificadoGerenciamento ChaveCaso de Uso
OpenVPNPKI X.509 completaEasy-RSA, manualSite-to-site empresarial e acesso remoto
WireGuardChaves públicas (sem X.509 por padrão)Pares chave simplesModerno, alto desempenho, IoT
IPsec (strongSwan)PKI X.509 completaFerramentas ipsec pkiConforme padrões, interop com Cisco/Juniper

6. Melhores Práticas

  1. CA Separada para VPN – Isolar certs VPN de certs TLS web.
  2. Validade Curta – Emitir certs cliente VPN com expiração 30-90 dias.
  3. CRL/OCSP – Habilitar verificação revogação no servidor.
  4. Tokens Hardware – Armazenar chaves cliente em YubiKeys ou smartcards para trabalhadores remotos.

Mundo Real: Muitas organizações migram de OpenVPN para WireGuard para desempenho mas envolvem chaves WireGuard em X.509 para integração com sistemas IAM existentes.

Apêndice H: Secure Boot e Uso de Certificados

Secure Boot, Cadeias de Confiança e Operações com Certificados no RHEL

Secure Boot é onde firmware, carregadores de inicialização, kernels e código carregado pelo kernel deixam de ser “apenas arquivos em disco” e se tornam objetos de código autenticados. Se você entende certificados TLS, mas não entende Secure Boot, está ignorando uma grande parte de como a confiança realmente começa em um sistema moderno.

Este apêndice foca em três pontos:

  1. O que o Secure Boot realmente faz.
  2. Onde certificados e chaves são usados na cadeia de inicialização.
  3. Como o RHEL usa shim, GRUB, mokutil, pesign, keyrings do kernel e assinatura de módulos em implantações reais.

1. O Que é Secure Boot

UEFI Secure Boot é um modelo de verificação de assinatura respaldado por firmware para o caminho de inicialização. O firmware verifica se um executável EFI foi assinado por uma chave ou certificado confiável antes de permitir sua execução.

Isso significa que Secure Boot não é a mesma coisa que:

  • Criptografia de disco completo
  • Segredos selados por TPM
  • Measured Boot
  • Monitoramento de integridade de arquivos
  • Controle de execução de aplicações em espaço de usuário
  • Confiança TLS para serviços web

Secure Boot é especificamente sobre autorizar código durante o caminho de inicialização e para extensões do espaço do kernel, como módulos de kernel carregáveis.

Em termos simples, a pergunta que o Secure Boot faz é:

“Este componente de firmware, binário EFI, carregador de inicialização, kernel ou módulo deve ser confiável para execução?”

2. Por Que Certificados São Importantes no Secure Boot

Certificados são o mecanismo de transporte da confiança. Eles vinculam uma chave pública a uma identidade ou contexto de política, para que um verificador possa decidir se uma assinatura deve ser aceita.

No ecossistema do Secure Boot, certificados e chaves são usados em diferentes lugares:

LocalizaçãoFinalidade
Variáveis de firmware UEFIArmazenam âncoras de confiança da plataforma e revogações
shimCarrega confiança embarcada do fornecedor para verificação do próximo estágio
Keyrings do kernelMantêm chaves confiáveis usadas para autenticar módulos e artefatos relacionados
Lista MOKAdiciona confiança controlada pelo proprietário sem reescrever bancos de dados de firmware
Blocos de assinatura em binários EFIProvam que componentes de inicialização foram assinados por uma chave privada confiável

Este é um domínio de confiança diferente do repositório de confiança TLS do RHEL em /etc/pki/ca-trust/. Esse repositório é para operações PKI de espaço de usuário, como HTTPS, LDAPS, SMTP TLS, obtenção de pacotes e validação de aplicações. Ele não decide qual binário EFI o firmware inicializa.

3. O Modelo de Confiança do UEFI Secure Boot

3.1 Bancos de Dados Centrais do Firmware

O UEFI Secure Boot comumente gira em torno de quatro bancos de dados importantes respaldados por variáveis:

Banco de DadosSignificadoFunção Típica
PKPlatform KeyProprietário de nível superior da política de Secure Boot da plataforma
KEKKey Exchange Key databaseAutoriza atualizações nos bancos de dados de assinaturas permitidas e revogadas
dbAssinaturas / certificados permitidosLista de confiança para executáveis e drivers EFI
dbxAssinaturas / certificados / hashes proibidosLista de revogação usada para bloquear binários ou certificados reconhecidamente problemáticos

Esses são conceitualmente simples, mas administradores rotineiramente os confundem:

  • PK controla a autoridade do Secure Boot da plataforma.
  • KEK controla atualizações na lista de permissões e na lista de negações.
  • db define o que é permitido inicializar.
  • dbx define o que nunca deve ser aceito, mesmo que já tenha sido confiável no passado.

3.2 Modo de Configuração vs Modo de Usuário

O firmware UEFI geralmente possui diferentes estados operacionais:

  • Modo de Configuração (Setup Mode): a propriedade da plataforma não está finalizada; alterações no registro de chaves são possíveis.
  • Modo de Usuário (User Mode): a política de Secure Boot é ativamente aplicada usando as chaves instaladas.
  • Modo Personalizado (Custom Mode): modo específico do fornecedor que pode permitir gerenciamento manual de chaves.

Isso importa porque as pessoas frequentemente confundem “Secure Boot habilitado nos menus de firmware” com “Secure Boot totalmente aplicado com a política de confiança esperada.” Esses nem sempre são o mesmo estado.

4. O Que Realmente é Assinado

Secure Boot não é uma única assinatura sobre “o sistema.” É uma cadeia de objetos assinados separadamente ou confiáveis separadamente.

Objetos autenticados comuns incluem:

  • Aplicações EFI
  • Carregadores de inicialização EFI
  • Binários EFI do GRUB
  • Kernels Linux
  • Módulos de kernel carregáveis
  • Às vezes, executáveis de atualização de firmware do fornecedor

O simples fato de um componente participar da inicialização não significa que ele é assinado independentemente da mesma forma. Por exemplo:

  • Binários EFI são tipicamente autenticados como executáveis PE/COFF com assinaturas embarcadas.
  • Módulos de kernel são assinados de uma forma específica do Linux e verificados pelo kernel contra chaves X.509 confiáveis.
  • O initramfs faz parte do fluxo de inicialização, mas no modelo clássico de Secure Boot do RHEL ele não é simplesmente “outro executável EFI assinado independentemente no formato PE.”

Essa distinção importa. Documentações descuidadas misturam tudo em “toda a cadeia de inicialização é assinada.” Isso não é preciso o suficiente para solucionar problemas ou projetar políticas.

5. Cadeia de Confiança do Secure Boot no RHEL

5.1 Fluxo de Alto Nível

Em um sistema RHEL típico com UEFI Secure Boot habilitado:

  1. O firmware valida o carregador de inicialização EFI de primeiro estágio contra chaves confiáveis nos bancos de dados de firmware.
  2. O carregador de primeiro estágio é tipicamente o shim.
  3. O shim carrega uma âncora de confiança embarcada da Red Hat usada para autenticar o próximo estágio.
  4. O shim valida o binário EFI do GRUB do RHEL.
  5. O GRUB valida o kernel que carrega usando a chave pública embarcada no shim (o GRUB não carrega suas próprias chaves de confiança).
  6. O kernel usa seus keyrings confiáveis para validar módulos de kernel carregáveis e código relacionado ao espaço do kernel.

Isso fornece uma cadeia de autorização do firmware até a extensibilidade do espaço do kernel.

5.2 Por Que o shim Existe

O shim existe porque fabricantes de hardware amplamente distribuem sistemas com raízes de assinatura UEFI confiáveis pela Microsoft já registradas. A Red Hat pode, portanto, ter o carregador de primeiro estágio assinado de forma que seja aceito por hardware comum, sem pedir a cada fabricante de hardware que pré-instale uma âncora de confiança de firmware exclusiva da Red Hat.

Depois que o firmware aceita o shim, o shim se torna a ponte entre a confiança do firmware e a confiança do sistema operacional do fornecedor.

Na prática no RHEL:

  • O firmware confia no caminho de assinatura reconhecido pela Microsoft para o shim.
  • O shim contém um certificado CA de Secure Boot da Red Hat embarcado.
  • Esse certificado embarcado da Red Hat é usado para validar o GRUB e o kernel.

5.3 Por Que o RHEL Não Depende de Carregamento Arbitrário de Módulos do GRUB

Sob Secure Boot, o RHEL não quer que código arbitrário não assinado seja carregado dentro do perímetro de segurança do carregador de inicialização. A documentação da Red Hat explica que o carregamento de módulos do GRUB é desabilitado em contextos de Secure Boot porque não existe um modelo amplo de assinatura e verificação para módulos arbitrários do GRUB equivalente ao caminho assinado controlado que a Red Hat distribui.

O ponto operacional é simples:

  • Se você está em um sistema com Secure Boot, não assuma que “o GRUB pode simplesmente carregar qualquer coisa do disco.”
  • Todo o design está tentando manter código não assinado fora do caminho de inicialização.

6. Certificados e Chaves Usados pelo Secure Boot do RHEL

6.1 Certificados do Firmware

A confiança do firmware vem de chaves e certificados armazenados em variáveis UEFI (PK, KEK, db, dbx) conforme descrito na seção 3.1. Esses não são gerenciados com update-ca-trust.

6.2 Certificado Embarcado do shim

A documentação da Red Hat para RHEL 8/9/10 descreve o shim como contendo um certificado público da Red Hat usado para autenticar o GRUB e o kernel. Essa confiança embarcada é uma das razões pelas quais o shim é central no design do Secure Boot do RHEL.

6.3 Machine Owner Key (MOK)

O recurso Machine Owner Key é a válvula de escape prática que mantém o Secure Boot utilizável no mundo real.

Sem MOK, você ficaria preso entre duas opções ruins:

  1. Desabilitar o Secure Boot sempre que precisar de código personalizado.
  2. Convencer o fabricante do seu hardware a adicionar permanentemente o seu certificado público aos bancos de dados de firmware.

O MOK fornece uma terceira opção:

  • Você registra seu próprio certificado público no sistema.
  • O shim e o MokManager gerenciam esse registro.
  • Na inicialização, a chave é propagada para um keyring confiável do kernel para que seus componentes personalizados assinados possam ser aceitos.

6.4 Keyrings do Kernel

No RHEL moderno, a verificação de assinatura de módulos de kernel depende de keyrings do kernel, principalmente:

KeyringFunção
.builtin_trusted_keysChaves confiáveis embutidas no kernel ou carregadas como parte do caminho de inicialização confiável
.platformConfiança derivada da plataforma, incluindo chaves provenientes de bancos de dados do Secure Boot e MOK
.blacklistChaves e hashes revogados que devem ser rejeitados

A documentação do RHEL para assinatura de módulos observa explicitamente:

  • assinaturas de módulos são verificadas contra chaves X.509 confiáveis de .builtin_trusted_keys e .platform
  • entradas revogadas da blacklist são excluídas da verificação
  • chaves MOK são propagadas para .platform em inicializações com Secure Boot habilitado

Isso significa que a confiança é aditiva, mas a revogação ainda prevalece.

7. O Que o Secure Boot Protege e o Que Não Protege

7.1 O Que Ele Protege

O Secure Boot é projetado para reduzir a chance de que o sistema execute código não autorizado no caminho de inicialização, como:

  • binários EFI adulterados
  • carregadores de inicialização maliciosos
  • kernels modificados
  • módulos de kernel não assinados ou não confiáveis

7.2 O Que Ele Não Resolve Automaticamente

O Secure Boot não protege automaticamente:

  • binários de espaço de usuário
  • scripts de shell
  • arquivos de configuração
  • segredos em repouso
  • adulteração de memória em tempo de execução após o sistema já ter sido comprometido
  • identidade de servidor TLS para serviços
  • escalação de privilégios local por meio de código assinado mas vulnerável

Secure Boot é um controle de autorização de inicialização. Não é um framework completo de integridade do host.

7.3 Secure Boot vs Measured Boot vs TPM

As pessoas misturam esses conceitos porque todos tocam a confiança na inicialização. Isso é pensamento preguiçoso.

Eles estão relacionados, mas são diferentes:

RecursoFunção Principal
Secure BootBloqueia execução de código não autorizado no caminho de inicialização
Measured BootRegistra medições de inicialização em PCRs do TPM
TPMArmazena segredos protegidos e medições; pode selar dados ao estado de inicialização
IMA appraisalEstende a política de integridade além da inicialização para decisões de avaliação de arquivos e carregamento em tempo de execução

Uma implicação prática no RHEL:

  • O Secure Boot decide se o código é aceito para inicializar ou carregar.
  • Fluxos de trabalho baseados em TPM podem depender de valores de PCR que refletem a política de Secure Boot e o estado do banco de dados de firmware.

Se chaves de firmware ou bancos de dados de revogação mudarem, medições do TPM também podem mudar. Isso importa para desbloqueio automático de LUKS, atestação e fluxos de trabalho com segredos selados.

8. Kernel Lockdown no RHEL

No RHEL, inicializar no modo EFI Secure Boot ativa o comportamento de kernel lockdown. Isso é importante porque o Secure Boot sozinho não é suficiente se o kernel em execução ainda expõe interfaces que permitem a usuários privilegiados adulterar a memória do kernel ou contornar decisões de confiança.

O lockdown tem como objetivo fechar essa lacuna.

Restrições típicas incluem limites ou bloqueios completos em coisas como:

  • carregamento de módulos não assinados
  • caminhos de modificação direta da imagem do kernel
  • interfaces de acesso direto como /dev/mem
  • alguns caminhos de kexec não assinados
  • interfaces que poderiam enfraquecer o limite de confiança da inicialização

É por isso que administradores às vezes veem mensagens como:

Lockdown: X: Y is restricted; see man kernel_lockdown.7

Isso não é drama aleatório do kernel. É a política de Secure Boot se estendendo para aplicação em tempo de execução.

9. O Modelo Mental do Administrador RHEL

Se você for manter apenas um modelo na cabeça, mantenha este:

  1. O firmware confia em chaves no db e rejeita chaves ou hashes no dbx.
  2. O firmware autoriza o shim.
  3. O shim autoriza os componentes de inicialização de próximo estágio da Red Hat e também suporta operações MOK.
  4. O MOK permite adicionar certificados públicos controlados pelo proprietário.
  5. O kernel confia em chaves embutidas e derivadas da plataforma/MOK para verificação de módulos.
  6. O lockdown previne contornos óbvios em tempo de execução.

Se qualquer um desses passos estiver quebrado, seu fluxo de trabalho personalizado de inicialização ou módulo falha.

10. Secure Boot no RHEL: Verificações Operacionais Diárias

10.1 Verificar se o Secure Boot Está Habilitado

sudo mokutil --sb-state

A saída típica é algo como:

SecureBoot enabled

10.2 Verificar Mensagens de Secure Boot e Integridade no Log do Kernel

sudo dmesg | grep -Ei 'secure boot|integrity|lockdown|EFI: Loaded cert'

Em sistemas RHEL, mensagens de log de integridade frequentemente mostram de onde as chaves vieram, como:

  • UEFI:db
  • shim embarcado
  • UEFI:MokListRT

10.3 Listar Chaves Confiáveis da Plataforma

sudo keyctl list %:.platform
sudo keyctl list %:.builtin_trusted_keys
sudo keyctl list %:.blacklist

O que você deve procurar:

  • certificados derivados do firmware
  • certificados registrados via MOK
  • hashes ou chaves revogados em .blacklist

10.4 Inspecionar Assinaturas em Binários EFI

No RHEL, pesign é o caminho de ferramenta suportado para inspecionar e adicionar assinaturas a binários EFI relevantes:

sudo pesign --show-signature --in /boot/efi/EFI/redhat/shimx64.efi
sudo pesign --show-signature --in /boot/efi/EFI/redhat/grubx64.efi

Em sistemas AArch64, os nomes comumente mudam para shimaa64.efi e grubaa64.efi.

11. Pacotes e Ferramentas Principais do RHEL

Ao trabalhar com assinatura personalizada de Secure Boot no RHEL 8/9/10, a documentação da Red Hat se concentra nestas ferramentas:

sudo dnf install pesign openssl kernel-devel mokutil keyutils

Funções principais:

FerramentaFinalidade
pesignAssinar e inspecionar binários EFI e kernels
efikeygenGerar um par de chaves X.509 orientado a Secure Boot no banco de dados do pesign
mokutilRegistrar e inspecionar Machine Owner Keys e o estado do Secure Boot
keyctlInspecionar keyrings do kernel
sign-fileAnexar assinaturas a módulos de kernel Linux
certutil / pk12utilExportar chaves e certificados do banco de dados NSS usado pelo pesign
opensslExtrair ou transformar material de chave quando necessário

12. Gerando uma Chave de Secure Boot Personalizada no RHEL

12.1 Gerar uma Chave para Assinatura de Módulos

A documentação da Red Hat descreve o efikeygen como a forma padrão de criar um par X.509 autoassinado para fluxos de trabalho de Secure Boot:

sudo efikeygen \
  --dbdir /etc/pki/pesign \
  --self-sign \
  --module \
  --common-name 'CN=Organization signing key' \
  --nickname 'Custom Secure Boot key'

12.2 Gerar uma Chave para Assinatura de Kernel

sudo efikeygen \
  --dbdir /etc/pki/pesign \
  --self-sign \
  --kernel \
  --common-name 'CN=Organization signing key' \
  --nickname 'Custom Secure Boot key'

12.3 Observação Sobre FIPS

A documentação da Red Hat observa que no modo FIPS pode ser necessário especificar o token NSS explicitamente:

sudo efikeygen \
  --dbdir /etc/pki/pesign \
  --self-sign \
  --kernel \
  --common-name 'CN=Organization signing key' \
  --nickname 'Custom Secure Boot key' \
  --token 'NSS FIPS 140-2 Certificate DB'

O material gerado é armazenado em /etc/pki/pesign/.

13. Registrando o Certificado Público com MOK

Este é o passo que as pessoas pulam, e depois perdem horas culpando o Secure Boot ao invés de seu próprio processo.

Gerar uma chave não é suficiente. O sistema de destino deve confiar no certificado público correspondente.

13.1 Exportar o Certificado Público

sudo certutil -d /etc/pki/pesign \
  -n 'Custom Secure Boot key' \
  -Lr > sb_cert.cer

13.2 Importá-lo no MOK

sudo mokutil --import sb_cert.cer

Será solicitada a definição de uma senha temporária de registro.

13.3 Reiniciar e Completar o Registro

Na próxima inicialização:

  1. O shim detecta o registro pendente.
  2. O MokManager.efi inicia.
  3. Você escolhe Enroll MOK.
  4. Você insere a senha definida durante o mokutil --import.
  5. O certificado é adicionado à lista MOK persistente.

Uma vez registrado em um sistema com Secure Boot habilitado, a chave é propagada para o keyring .platform nas inicializações subsequentes.

14. Assinando Módulos de Kernel Personalizados no RHEL

Esta é uma das tarefas de Secure Boot mais comuns no mundo real. Drivers fora da árvore, módulos de fornecedores, agentes HBA, probes de monitoramento ou produtos de segurança frequentemente falham aqui.

14.1 Exportar o Certificado Público

Exporte o certificado público conforme descrito na seção 13.1 para produzir sb_cert.cer.

14.2 Exportar a Chave Privada do Banco de Dados NSS

sudo pk12util -o sb_cert.p12 \
  -n 'Custom Secure Boot key' \
  -d /etc/pki/pesign

Em seguida, extraia a chave privada:

openssl pkcs12 \
  -in sb_cert.p12 \
  -out sb_cert.priv \
  -nocerts \
  -noenc

Isso produz uma chave privada não criptografada. Trate esse arquivo como uma arma carregada, porque é exatamente isso que ele é.

14.3 Assinar o Módulo

sudo /usr/src/kernels/$(uname -r)/scripts/sign-file \
  sha256 \
  sb_cert.priv \
  sb_cert.cer \
  my_module.ko

Isso anexa a assinatura do módulo diretamente ao arquivo do módulo de kernel.

14.4 Verificar o Assinante

modinfo my_module.ko | grep signer

14.5 Carregar o Módulo

sudo insmod my_module.ko

ou após colocá-lo na árvore de módulos:

sudo cp my_module.ko /lib/modules/$(uname -r)/extra/
sudo depmod -a
sudo modprobe my_module

14.6 Aviso Operacional sobre Data de Validade

A documentação da Red Hat alerta os administradores a assinarem kernels e módulos dentro do período de validade do certificado e também observa que o sign-file não avisa sobre decisões de temporização inadequadas. Não trate a ausência de um aviso da ferramenta como prova de que seu fluxo de trabalho de assinatura está correto.

15. Assinando Kernels e Binários EFI no RHEL

15.1 Assinar um Kernel em x86_64

sudo pesign \
  --certificate 'Custom Secure Boot key' \
  --in vmlinuz-version \
  --sign \
  --out vmlinuz-version.signed

Inspecione o resultado:

sudo pesign --show-signature --in vmlinuz-version.signed

Substitua a imagem não assinada pela assinada:

sudo mv vmlinuz-version.signed vmlinuz-version

Se você pular este passo, o sistema ainda inicializa o original não assinado.

15.2 Assinar um Binário EFI do GRUB em x86_64

sudo pesign \
  --in /boot/efi/EFI/redhat/grubx64.efi \
  --out /boot/efi/EFI/redhat/grubx64.efi.signed \
  --certificate 'Custom Secure Boot key' \
  --sign

Inspecione o resultado:

sudo pesign --in /boot/efi/EFI/redhat/grubx64.efi.signed --show-signature

Substitua o binário não assinado pelo assinado:

sudo mv /boot/efi/EFI/redhat/grubx64.efi.signed /boot/efi/EFI/redhat/grubx64.efi

15.3 Observação sobre AArch64

Em sistemas AArch64, você normalmente trabalhará com:

  • /boot/efi/EFI/redhat/shimaa64.efi
  • /boot/efi/EFI/redhat/grubaa64.efi

A documentação do RHEL também cobre o fluxo de trabalho de descompressão/recompressão para assinar imagens de kernel em ARM de 64 bits.

16. Onde a Confiança do Secure Boot Aparece Dentro do Kernel RHEL em Execução

A documentação do RHEL mostra que um sistema com Secure Boot habilitado pode expor evidências de fontes de confiança carregadas tanto em logs do kernel quanto em keyrings.

Exemplos do que você pode ver:

  • Entradas de certificados Microsoft provenientes do UEFI db
  • Chaves de Secure Boot da Red Hat provenientes do shim embarcado
  • Chaves registradas pelo proprietário provenientes do MokListRT
  • Revogações refletidas em .blacklist

Isso fornece três fontes de confiança diferentes em jogo:

  1. Confiança do firmware
  2. Confiança embarcada do fornecedor
  3. Confiança adicionada pelo proprietário

Se você não sabe qual das três o seu sistema está usando para um determinado módulo ou binário EFI, você está solucionando problemas às cegas.

17. Revogação do Secure Boot e dbx

A revogação é de onde vêm muitos incidentes do tipo “mas costumava funcionar.”

O banco de dados dbx contém assinaturas, certificados ou hashes revogados. Se um objeto encadeia a uma entrada revogada, o sistema o rejeita mesmo que tenha sido confiável anteriormente.

Consequências operacionais:

  • carregadores de inicialização antigos podem parar de funcionar após atualizações de revogação
  • assinaturas vulneráveis ou obsoletas podem se tornar inaceitáveis
  • sistemas de laboratório que nunca recebem atualizações de firmware se desviam para estados de compatibilidade estranhos
  • cadeias de inicialização personalizadas quebram se você as ancorou em algo que posteriormente foi incluído em dados de revogação

Dentro do Linux, entradas revogadas são representadas através do keyring blacklist. É por isso que confiança sozinha não é suficiente; o objeto também não pode estar revogado.

18. Expiração do Certificado de Secure Boot Microsoft 2011

O certificado de assinatura Microsoft UEFI CA 2011, que tem sido a principal âncora de confiança usada pelo firmware para validar o shim em virtualmente todo hardware commodity x86_64, está programado para expirar em 27 de junho de 2026.

Isso não significa que sistemas existentes param de inicializar imediatamente. Sistemas que já possuem o certificado de 2011 registrado no firmware db continuarão a aceitar binários assinados com esse certificado após a data de expiração. No entanto, a Microsoft não assinará mais novos binários com a chave de 2011 após a expiração, então futuras atualizações do shim devem ser assinadas com o certificado de substituição Microsoft UEFI CA 2023.

18.1 O Que a Red Hat Fez

A Red Hat lançou novos binários shim para todas as versões suportadas do RHEL 8, RHEL 9 e RHEL 10 em x86_64 que são duplamente assinados com ambos os certificados de assinatura de Secure Boot Microsoft 2011 e Microsoft 2023. Isso significa que o novo shim inicializará em sistemas que tenham um ou ambos os certificados registrados no firmware.

Em AArch64, a partir do RHEL 9.7 e RHEL 10.0, o binário shim é assinado apenas com o certificado Microsoft 2023.

18.2 Verificando Qual Certificado Assinou Seu shim

sudo pesign -S -i /boot/efi/EFI/redhat/shimx64.efi

Se você vir Microsoft Windows UEFI Driver Publisher, esse é o caminho do certificado de 2011. Se você vir referências ao certificado de 2023, o sistema está usando o caminho de assinatura atualizado.

18.3 O Que os Administradores Devem Fazer

  1. Atualizar o shim em todos os sistemas RHEL suportados para obter a versão com dupla assinatura antes de depender de atualizações de firmware que adicionem o certificado de 2023.
  2. Ficar atento a atualizações de firmware dos fabricantes de hardware que registrem o certificado Microsoft 2023 no UEFI db. Sem o certificado de 2023 no firmware, futuros binários shim assinados apenas com a chave de 2023 não serão aceitos.
  3. Estar ciente do impacto no TPM: atualizações no UEFI db alterarão valores do TPM Platform Configuration Register (PCR), particularmente o PCR7. Se você usa desbloqueio automático baseado em TPM para volumes criptografados com LUKS, atestação Measured Boot, ou segredos selados contra o PCR7, essas vinculações serão quebradas após alterações no db. A abordagem recomendada é primeiro selar novamente contra um valor de PCR que não mudou (como o PCR0), reiniciar e depois selar novamente contra o novo valor do PCR7.
  4. Sistemas legados (servidores físicos antigos, appliances ou sistemas que nunca recebem atualizações de firmware) que não podem registrar o certificado de 2023 permanecerão limitados a inicializar binários shim assinados com o certificado de 2011.

18.4 Por Que Isso Importa para Este Livro

Este é um exemplo concreto e real de cada conceito que este apêndice cobre: bancos de dados de confiança de firmware, ciclo de vida de certificados, risco de revogação, sensibilidade de medições do TPM e o custo operacional de ignorar o gerenciamento de certificados de assinatura. Se sua organização não sabia que isso estava chegando, seu gerenciamento de ciclo de vida do Secure Boot tem uma lacuna.

19. Secure Boot e Notas de Versão do RHEL

19.1 RHEL 7

O RHEL 7 estabeleceu o modelo básico de Secure Boot da Red Hat:

  • shim como carregador de primeiro estágio
  • Chave embarcada da Red Hat no shim
  • GRUB e kernel assinados
  • MOK para confiança adicionada pelo proprietário
  • Módulos de kernel assinados obrigatórios em sistemas com Secure Boot habilitado

A documentação do RHEL 7 também faz um ponto importante que muitas pessoas não percebem: o Secure Boot clássico é sobre integridade de código no espaço do kernel, não validação generalizada de todo o conteúdo do espaço de usuário.

19.2 RHEL 8

O RHEL 8 mantém o mesmo modelo geral, com documentação pública aprimorada sobre:

  • .builtin_trusted_keys
  • .platform
  • .blacklist
  • efikeygen
  • pesign
  • Procedimentos de registro MOK

A documentação do RHEL 8 também mostra explicitamente que chaves registradas via MOK são propagadas para .platform.

19.3 RHEL 9

O RHEL 9 documenta o mesmo caminho de confiança central e é mais rigoroso e claro operacionalmente em relação a:

  • validação de assinatura de módulos contra keyrings confiáveis
  • confiança de plataforma baseada em MOK
  • assinatura de kernels e módulos personalizados
  • comportamento de lockdown em sistemas com Secure Boot

O RHEL 9 é a linha de base prática se você está projetando um fluxo de trabalho moderno de Secure Boot no RHEL hoje.

19.4 RHEL 10

A documentação do RHEL 10 continua com o mesmo conjunto de ferramentas e modelo de confiança para assinatura personalizada de kernels e módulos com pesign, mokutil, efikeygen, keyctl e keyrings do kernel.

O ponto importante é a continuidade: esse não é um recurso aleatório que muda de forma a cada versão. Os nomes de ferramentas e conceitos de confiança permanecem reconhecíveis entre as gerações suportadas do RHEL.

20. Casos de Uso Comuns no RHEL

20.1 Implantação de Drivers de Terceiros

Exemplos comuns:

  • drivers de controladora de armazenamento
  • agentes de monitoramento com módulos de kernel
  • módulos de segurança de endpoint
  • drivers de rede personalizados
  • módulos de gerenciamento de hardware do fornecedor

Se o módulo não está assinado ou está assinado por uma chave não confiável, o sistema o recusa em um host com Secure Boot habilitado.

20.2 Builds de Kernel Personalizados

Se você constrói seu próprio kernel, o firmware e a cadeia de inicialização não se importam que ele veio do seu pipeline de CI. Eles só se importam se a imagem está assinada por uma chave confiável e se o sistema tem essa âncora de confiança registrada.

20.3 Ambientes que Removem Âncoras de Confiança do Fornecedor

Algumas organizações querem controle mais rigoroso e reduzir a dependência de âncoras de confiança padrão de terceiros. Isso é possível, mas significa que você é dono de toda a cadeia:

  • política de assinatura
  • proteção da chave privada
  • gerenciamento de confiança de firmware
  • assinatura de GRUB/kernel
  • estratégia de revogação
  • caminho de recuperação se sua infraestrutura de assinatura falhar

A maioria das equipes subestima essa carga operacional.

20.4 Máquinas Virtuais

O Secure Boot também importa em ambientes virtualizados se o firmware do convidado expõe suporte a UEFI Secure Boot. Não assuma que “é apenas uma VM” significa que a confiança de inicialização é irrelevante. Infraestrutura virtual é um dos lugares mais fáceis para imagens personalizadas não assinadas proliferarem.

21. Solução de Problemas do Secure Boot no RHEL

21.1 Verificações Rápidas

sudo mokutil --sb-state
sudo mokutil --list-enrolled
sudo keyctl list %:.platform
sudo keyctl list %:.blacklist
sudo dmesg | grep -Ei 'secure boot|lockdown|integrity|module|cert'

21.2 Padrões Típicos de Falha

SintomaCausa Provável
Módulo não carregaMódulo não assinado ou assinante não confiável
Módulo mostra assinante mas ainda falhaChave não registrada no sistema de destino, caminho de keyring incorreto ou assinante revogado
Importação MOK foi executada mas confiança não está visívelRegistro não completado no MokManager após reinicialização
Binário EFI falha ao inicializarAssinatura confiável ausente, fluxo de trabalho de substituição incorreto ou certificado/hash revogado
Comportamento mudou após atualização de firmwareAlterações em db/dbx modificaram o estado de confiança ou revogação
Fluxo de trabalho de desbloqueio TPM quebra após atualizações de chaveMedições de PCR mudaram após atualizações de bancos de dados do Secure Boot

21.3 Pistas no Log do Kernel

Procure por mensagens mencionando:

  • integrity
  • MokListRT
  • EFI: Loaded cert
  • Lockdown
  • module verification failed

Se você não inspeciona o log do kernel, está apenas adivinhando.

22. Melhores Práticas para Gerenciamento de Certificados de Secure Boot

22.1 Separar Funções

Não use uma chave de assinatura para tudo, a menos que goste de transformar um comprometimento em um incidente que afeta toda a plataforma.

Prefira chaves separadas para:

  • carregadores de inicialização / binários EFI
  • kernels
  • módulos de kernel de terceiros ou internos
  • fluxos de trabalho de emergência ou break-glass

22.2 Proteger a Chave Privada Adequadamente

Prefira:

  • assinatura offline
  • armazenamento de chave respaldado por HSM ou token quando possível
  • acesso mínimo de operadores
  • etapas de assinatura auditadas
  • planejamento de rotação de certificados

Evite:

  • deixar chaves extraídas não criptografadas em hosts de build
  • copiar material de assinatura entre jobs de CI improvisados
  • chaves de laboratório de longa duração descartáveis reutilizadas em produção

22.3 Manter o Registro MOK Restrito

Cada certificado confiável extra expande o que a plataforma pode aceitar. Registre apenas o que você precisa. “Basta adicionar outro MOK para funcionar” é como a proliferação de confiança começa.

22.4 Rastrear Revogações e Atualizações de Firmware

Se você depende de confiança personalizada de Secure Boot:

  • monitore atualizações de firmware e dbx
  • teste caminhos de recuperação antes de implantação ampla
  • valide a inicialização em hardware de homologação
  • entenda o impacto nos segredos selados por TPM e na atestação

22.5 Manter Secure Boot e PKI TLS Mentalmente Separados

Os mesmos conceitos X.509 aparecem em ambas as áreas, mas os mundos operacionais são diferentes.

Não confunda:

  • bancos de dados de confiança de firmware com /etc/pki/ca-trust
  • registro MOK com instalação de âncora de confiança de CA
  • chaves de assinatura de módulos com certificados TLS de servidor web

Eles usam criptografia relacionada, mas resolvem problemas diferentes.

23. Verdades Difíceis que Administradores Geralmente Aprendem Tarde

  1. Secure Boot é fácil até você precisar de código personalizado.
  2. Código personalizado é fácil até você precisar de operações de assinatura duráveis.
  3. Operações de assinatura duráveis são fáceis até você precisar de revogação, rotação, atestação e recuperação de frota.

A maioria das equipes não falha no Secure Boot porque a criptografia é difícil demais. Elas falham porque seu modelo operacional é desleixado:

  • nenhum modelo de propriedade de chaves
  • nenhum planejamento de ciclo de vida de certificados
  • nenhum hardware de teste
  • nenhum caminho de rollback
  • nenhuma ideia do que é confiável pelo firmware vs shim vs MOK vs keyrings do kernel

Isso não é uma limitação técnica. Isso é falha de processo.

24. Quick Reference

┌──────────────────────────────────────────────────────────────────────┐
│ RHEL SECURE BOOT QUICK REFERENCE                                     │
├──────────────────────────────────────────────────────────────────────┤
│ Check state:        mokutil --sb-state                               │
│ List MOKs:          mokutil --list-enrolled                          │
│ List platform keys: keyctl list %:.platform                          │
│ Built-in keys:      keyctl list %:.builtin_trusted_keys              │
│ Revocations:        keyctl list %:.blacklist                         │
│ View EFI signature: pesign --show-signature --in <efi-binary>        │
│                                                                      │
│ RHEL boot path:     firmware -> shim -> GRUB -> kernel -> modules    │
│                                                                      │
│ Firmware DBs:       PK / KEK / db / dbx                              │
│ Owner trust:        MOK -> .platform                                 │
│ Kernel trust:       .builtin_trusted_keys + .platform                │
│ Revocation:         .blacklist / dbx                                 │
│                                                                      │
│ Common packages:    pesign openssl kernel-devel mokutil keyutils     │
└──────────────────────────────────────────────────────────────────────┘

25. Conclusões Principais

  1. Secure Boot é uma cadeia de autorização baseada em certificados para código de inicialização e espaço do kernel.
  2. No RHEL, o shim é a ponte entre a confiança do firmware e a confiança controlada pela Red Hat.
  3. O MOK é o mecanismo crítico para adicionar confiança controlada pelo proprietário sem reescrever bancos de dados de firmware.
  4. O carregamento de módulos de kernel depende de keyrings confiáveis, não do pacote de CAs do espaço de usuário.
  5. A revogação importa tanto quanto a confiança; dbx e .blacklist podem quebrar artefatos que “funcionavam anteriormente.”
  6. Se você está assinando módulos ou kernels personalizados, o problema não é apenas criptografia. É gerenciamento de ciclo de vida.

26. Leitura Oficial do RHEL que Vale Manter por Perto

  • Documentação de gerenciamento de kernel do RHEL 8/9/10 sobre assinatura de kernels e módulos para Secure Boot
  • Orientações de administração de kernel e Secure Boot do RHEL 7
  • kernel_lockdown(7)
  • mokutil(1)
  • keyctl(1)
  • pesign(1)

Apêndice I: Glossário

Glossário de Termos PKI e Certificados

A

ACME (Automated Certificate Management Environment) Protocolo (RFC 8555) para emissão e renovação certificado automatizadas, popularizado pelo Let’s Encrypt.

ASN.1 (Abstract Syntax Notation One) Formato de serialização de dados usado para codificar certificados X.509.

Criptografia Assimétrica Sistema de chave pública onde criptografia/descriptografia usam pares de chave complementares (pública e privada).

B

Baseline Requirements Regras CA/B Forum que CAs publicamente confiáveis devem seguir (ex: validade máxima 398 dias).

C

Autoridade certificadora (CA) Entidade que emite e assina certificados digitais.

CAB Forum (CA/Browser Forum) Consórcio de indústria definindo padrões para certificados TLS publicamente confiáveis.

Cadeia Certificados Sequência de certificados de entidade-final → intermediário(s) → CA raiz.

Certificate Policy (CP) Documento de alto nível descrevendo quais garantias uma PKI fornece.

Certificate Revocation List (CRL) Lista assinada de números seriais de certificados revogados.

Certificate Signing Request (CSR) Mensagem solicitando que CA assine chave pública, inclui DN subject e extensões.

Certificate Transparency (CT) Sistema de log público (RFC 6962) que registra todos certificados emitidos para auditabilidade.

Certification Practice Statement (CPS) Procedimentos operacionais detalhados de como CA implementa seu CP.

Cipher Suite Conjunto de algoritmos criptográficos usados em TLS (ex: troca de chave, criptografia, MAC).

CN (Common Name) Campo subject do certificado; historicamente continha nome do domínio, agora superado por SAN.

Certificado Code Signing Certificado com extKeyUsage: codeSigning para autenticar publicadores de software.

D

DER (Distinguished Encoding Rules) Codificação binária de ASN.1, usado para certificados em keystores Java e sistemas embarcados.

DH (Diffie-Hellman) Algoritmo de troca de chave permitindo duas partes concordarem em segredo compartilhado sobre canal inseguro.

DN (Distinguished Name) Identificador hierárquico em formato X.500 (ex: /C=US/O=Example/CN=server.example.com).

E

ECC (Elliptic Curve Cryptography) Crypto de chave pública usando curvas elípticas; oferece chaves menores que RSA para segurança equivalente.

ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) Troca de chave fornecendo forward secrecy em TLS.

ECDSA (Elliptic Curve Digital Signature Algorithm) Esquema de assinatura baseado em curvas elípticas.

EKU (Extended Key Usage) Extensão X.509 especificando propósitos permitidos do certificado (serverAuth, clientAuth, codeSigning, etc.).

Certificado End-Entity Certificado folha emitido para servidores, dispositivos ou usuários (não CA).

EST (Enrollment over Secure Transport) Protocolo RFC 7030 para enrollment de certificado, mais simples que SCEP completo.

F

FIPS 140-2 Padrão do governo Norte Americano para segurança de módulo criptográfico (Níveis 1-5).

Forward Secrecy Propriedade garantindo que chaves de sessão passadas permanecem seguras mesmo se chave privada de longo prazo for comprometida (alcançado via DH/ECDHE ephemeral).

H

HSM (Hardware Security Module) Dispositivo resistente à adulteração armazenando chaves criptográficas e executando operações em hardware.

HSTS (HTTP Strict Transport Security) Cabeçalho forçando navegadores a usar HTTPS para domínio.

I

CA Intermediária Certificado CA assinado por CA raiz, usado para emitir certificados entidade-final.

Emissor DN da CA que assinou o certificado.

J

JWKS (JSON Web Key Set) Conjunto de chaves públicas em formato JSON, frequentemente usado com OAuth/OpenID Connect.

JWT (JSON Web Token) Formato de token compacto para transmitir claims; pode ser assinado com RSA/ECDSA.

K

Key Escrow Prática de armazenar chaves privadas com terceiro; controverso para privacidade do usuário.

Key Usage Extensão X.509 definindo operações criptográficas permitidas (digitalSignature, keyEncipherment, etc.).

Keystore Arquivo armazenando chaves privadas e certificados (ex: Java JKS, PKCS#12).

L

LDAP (Lightweight Directory Access Protocol) Protocolo para acessar serviços de diretório; frequentemente usado para publicar certificados e CRLs.

M

mTLS (Mutual TLS) TLS onde ambos cliente e servidor apresentam certificados para autenticação bidirecional.

N

NSS (Network Security Services) Biblioteca de crypto Mozilla usada pelo Firefox; mantém seu próprio repositório de confiança.

O

OCSP (Online Certificate Status Protocol) Protocolo de tempo real (RFC 6960) para verificar status de revogação de certificado.

OCSP Stapling Servidor inclui resposta OCSP fresca em handshake TLS, melhorando privacidade e desempenho.

OID (Object Identifier) Identificador numérico único em ASN.1 (ex: 2.5.29.17 para extensão SAN).

P

PEM (Privacy Enhanced Mail) DER codificado em base64 com headers -----BEGIN CERTIFICATE-----.

PFX Ver PKCS#12.

PIN (Public Key Pinning) Mecanismo para associar domínio com chave(s) pública(s) específica(s); depreciado em navegadores devido à riscos operacionais.

PKI (Public Key Infrastructure) Sistema de hardware, software, políticas e procedimentos para gerenciar certificados digitais.

PKCS (Public-Key Cryptography Standards) Família de padrões da RSA Labs (PKCS#1–15).

PKCS#7 Formato de container para certificados e CRLs (sem chave privada).

PKCS#12 Formato de arquivo empacotando certificado + chave privada + cadeia, protegido por senha (.p12, .pfx).

R

RA (Registration Authority) Entidade validando identidade antes de encaminhar CSR para CA.

CA Raiz CA auto-assinada no topo da hierarquia; embutida em repositórios de confiança do SO/navegador.

RSA (Rivest–Shamir–Adleman) Algoritmo de chave pública amplamente usado baseado em fatoração de inteiros.

S

SAN (Subject Alternative Name) Extensão X.509 listando identidades adicionais (nomes DNS, IPs, URIs).

SCT (Signed Certificate Timestamp) Prova de log CT que certificado foi logado.

Certificado Autoassinado Certificado onde emissor == subject; não confiável por padrão.

Número Serial Identificador único atribuído por CA a cada certificado.

SHA-256 / SHA-384 Funções hash criptográficas (parte da família SHA-3).

SPIFFE (Secure Production Identity Framework For Everyone) Padrão para identidade de carga de trabalho em ambientes dinâmicos; usa SANs URI (spiffe://trust-domain/workload).

SSL (Secure Sockets Layer) Predecessor depreciado do TLS.

T

TLS (Transport Layer Security) Protocolo criptográfico para comunicação de rede segura (versões atuais: 1.2, 1.3).

TPM (Trusted Platform Module) Hardware para armazenamento de chave segura em dispositivos.

Trust Anchor Certificado raiz implicitamente confiável pelo sistema.

Repositório de Confiança Coleção de certificados CA raiz confiáveis (ex: /etc/pki/ca-trust, Windows Certificate Store).

V

VA (Validation Authority) Componente que lida com consultas OCSP/CRL.

W

Certificado Wildcard Certificado cobrindo *.example.com (coincide app.example.com, não sub.app.example.com).

X

X.509 Padrão ITU-T definindo formato de certificado (RFC 5280 é versão IETF).

Z

Zero Trust Modelo de segurança sem assumir confiança implícita; cada requisição é autenticada e autorizada.

Apêndice J: Referências

Referências e Leitura Adicional

Lista curada de recursos autoritativos para aprofundar seu conhecimento em PKI e certificados.

Padrões e RFCs

Padrões PKI Principais

TLS/SSL

Algoritmos Criptográficos

Diretrizes Indústria

CA/Browser Forum

Publicações NIST

Padrões ETSI

Livros

Fundacionais

  • “Network Security with OpenSSL” por Pravir Chandra, Matt Messier, John Viega O’Reilly, 2002 — Guia OpenSSL abrangente

  • “PKI Uncovered” por Andre Karamanian, Siva Sathianathan Cisco Press, 2011 — Padrões design PKI empresarial

  • “Bulletproof SSL and TLS” por Ivan Ristić Feisty Duck, 2022 — Guia autoritativo para implantar TLS corretamente

Avançados

  • “Serious Cryptography” por Jean-Philippe Aumasson No Starch Press, 2017 — Algoritmos e protocolos criptográficos modernos

  • “Applied Cryptography” por Bruce Schneier Wiley, 1996 — Texto clássico sobre protocolos criptográficos

Recursos Online

Documentação

Ferramentas Teste

Tutoriais e Blogs

Vídeos e Cursos

  • “Public Key Cryptography” (Khan Academy) Introdução a RSA e troca chave

  • “How HTTPS Works” (Cloudflare YouTube) Explicação animada de handshake TLS

  • Pluralsight — “PKI Architecture and Implementation” Curso vídeo abrangente sobre PKI empresarial

Software e Ferramentas

Software CA

Gerenciamento Certificado

Bibliotecas

Comunidades e Fóruns

Artigos e Pesquisa

  • “The Most Dangerous Code in the World” (Martin et al., 2012) Análise vulnerabilidades validação certificado SSL

  • “Analysis of the HTTPS Certificate Ecosystem” (Durumeric et al., IMC 2013) Estudo grande escala de implantação TLS

  • “SoK: SSL and HTTPS Revisiting past challenges and evaluating certificate trust model enhancements” (Clark & van Oorschot, S&P 2013)

Frameworks Conformidade


Mantenha-se atualizado: Padrões PKI e TLS evoluem continuamente. Inscreva-se em listas de email e grupos de trabalho TLS IETF e siga avisos de segurança de sua CA e fabricantes de software.