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ça | O que acontece | Exemplo real |
|---|---|---|
| Espionagem | Atacante lê seus dados | Captura de senhas em Wi-Fi público |
| Adulteração | Atacante modifica dados em trânsito | Injeção de malware em download de software |
| Personificação | Atacante finge ser outra pessoa | Site bancário falso coletando credenciais |
| Repúdio | Remetente nega ter enviado uma mensagem | Negar 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
| Pilar | Pergunta que responde | Implementado por | Protege contra |
|---|---|---|---|
| Confidencialidade | Alguém mais pode ler? | Criptografia (AES, RSA) | Espionagem |
| Integridade | Foi modificado? | Hashes (SHA-256), HMAC | Adulteração |
| Autenticidade | Quem enviou? | Certificados, assinaturas | Personificação |
| Não-repúdio | O remetente pode negar? | Assinaturas digitais | Repú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:
| Algoritmo | Tamanho da Saída | Estado | Por quê |
|---|---|---|---|
| MD5 | 128 bits | QUEBRADO | Colisões encontradas em segundos. Nunca use para segurança. |
| SHA-1 | 160 bits | QUEBRADO | Google demonstrou colisão prática em 2017 (SHAttered). |
| SHA-256 | 256 bits | SEGURO | Sem ataques práticos conhecidos. Padrão atual. |
| SHA-384 | 384 bits | SEGURO | Margem de segurança maior. |
| SHA-512 | 512 bits | SEGURO | Segurança máxima da família SHA-2. |
| SHA-3 | 256+ bits | SEGURO | Design diferente (Keccak). Alternativa à prova de futuro. |
| BLAKE2 | 256+ bits | SEGURO | Muito 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 uso | Como | Exemplo |
|---|---|---|
| Armazenamento de senhas | Armazena o hash, não a senha | /etc/shadow no Linux |
| Integridade de arquivos | Compara hash antes/depois | sha256sum pacote.rpm |
| Assinaturas digitais | Assina o hash, não os dados | Assinatura de certificados |
| Deduplicação | Identifica arquivos idênticos | Sistemas de backup |
| Blockchain | Cadeia de hashes | Prova 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.
| Propriedade | Valor |
|---|---|
| Velocidade | Muito rápida (AES acelerado por hardware) |
| Tamanho da chave | 128 ou 256 bits |
| Problema | Como compartilhar a chave de forma segura? |
| Exemplos | AES-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).
| Propriedade | Valor |
|---|---|
| Velocidade | Lenta (1000x mais lenta que simétrica) |
| Tamanho da chave | 2048–4096 bits (RSA) ou 256 bits (ECC) |
| Vantagem | Não precisa compartilhar chave secreta previamente |
| Exemplos | RSA, 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 Cores | Equivalente 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étodo | Como funciona | Compensação |
|---|---|---|
| LCR (Lista de Certificados Revogados) | CA publica lista de números de série revogados | Pode estar desatualizada (atualizada periodicamente) |
| OCSP (Protocolo de Status de Certificado Online) | Cliente pergunta à CA “este cert ainda é válido?” em tempo real | Requer rede, preocupação de privacidade |
| OCSP Stapling | Servidor busca sua própria resposta OCSP e anexa ao handshake | Melhor 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:
| Conceito | Resumo em uma frase |
|---|---|
| Hashes | Impressões digitais unidirecionais que detectam qualquer alteração (use SHA-256+). |
| Criptografia simétrica | A mesma chave cifra e decifra — rápida, mas distribuição da chave é difícil. |
| Criptografia assimétrica | Pares de chaves pública/privada — resolve distribuição, mas é lenta. |
| Criptografia híbrida | Usa assimétrica para trocar chaves, depois simétrica para dados (o TLS faz isto). |
| Assinaturas digitais | Hash + chave privada = prova de identidade e integridade. |
| Certificados | Vinculam uma chave pública a uma identidade, assinados por uma CA confiável. |
| PKI | A arquitetura de confiança: CA Raiz → CA Intermediária → Certificado entidade final. |
| Handshake TLS | Autentica servidor, troca chaves, depois cifra tudo. |
| Sigilo futuro | Usa 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:
- Prova identidade (“Eu sou example.com”)
- Habilita criptografia (comunicação segura)
- É 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
-
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
-
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!)
-
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:
- Servidor envia seu certificado
- Cliente verifica cadeia de assinatura até CA raiz confiável
- Se cadeia é válida → conexão prossegue
- 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 RHEL | Característica Chave | Foco de Solução de Problemas |
|---|---|---|
| RHEL 7 | Abordagem tradicional | Configuração manual, problemas TLS legados |
| RHEL 8 | Crypto-policies | Conflitos de política, integração certmonger |
| RHEL 9 | OpenSSL 3.x | Problemas de provedor, validação mais rigorosa |
| RHEL 10 | Padrões fortalecidos | Somente 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
| ← Anterior: Capítulo 1 - Criptografia, Estrutura PKI e Fundamentos | Próximo: Capítulo 3 - Visão Geral das Ferramentas de Certificados do RHEL → |
|---|
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:
| Ferramenta | Uso Principal | Versões RHEL | Quando Usar |
|---|---|---|---|
| openssl | Operações de certificados, testes | Todas | Gerar chaves/CSRs, inspecionar certs, testar conexões |
| certutil | Gerenciamento de base de dados NSS | Todas | BDs de cert estilo Firefox/Mozilla |
| update-ca-trust | Gerenciamento de repositório de confiança | Todas | Adicionar/remover CAs confiáveis |
| certmonger | Renovação automática | Todas | Rastrear e renovar certificados automaticamente |
| crypto-policies | Segurança em todo o sistema | RHEL 8+ | Controlar versões TLS e cifras |
| getcert | CLI do certmonger | Todas | Solicitar e gerenciar certs rastreados |
| trust | Gerenciamento de confiança P11-kit | Todas (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
.dbem/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ística | LEGACY | DEFAULT | FUTURE | FIPS |
|---|---|---|---|---|
| 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ín | 1024 bits | 2048 bits | 3072 bits | 2048 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
| Ferramenta | RHEL 7 | RHEL 8 | RHEL 9 | RHEL 10 | Notas |
|---|---|---|---|---|---|
| openssl | 1.0.2k | 1.1.1k | 3.5.5 | 3.5.5 | Ferramenta principal |
| certutil | ✅ | ✅ | ✅ | ✅ | Ferramenta NSS |
| update-ca-trust | ✅ | ✅ Aprimorado | ✅ Aprimorado | ✅ Aprimorado | Gestão confiança |
| certmonger | ✅ | ✅ Aprimorado | ✅ ACME | ✅ ACME | Renovação auto |
| crypto-policies | ❌ | ✅ | ✅ Subpolíticas | ✅ Aprimorado | Política sistema |
| getcert | ✅ | ✅ | ✅ | ✅ | CLI certmonger |
| trust | ✅ Básico | ✅ | ✅ | ✅ | Ferramenta 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
| ← Anterior: Capítulo 2 - Introdução aos Certificados no RHEL | Próximo: Capítulo 4 - Criptografia Básica para Administradores RHEL → |
|---|
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
- Selecione dois números primos grandes p e q.
- Calcule o módulo
n = p × q. - Derive o expoente público
ee o expoente privadodtal quee × d ≡ 1 (mod φ(n)). - 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.
| Algoritmo | Tamanho de chave para segurança de 128 bits |
|---|---|
| RSA | 3072 bits |
| ECC | 256 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 RHEL | RSA Mínimo | ECC Mínimo | Aplicado Por |
|---|---|---|---|
| RHEL 7 | Nenhum (fraco permitido) | Nenhum | Configuração manual |
| RHEL 8 | 2048 bits | P-256 | crypto-policy DEFAULT |
| RHEL 9 | 2048 bits | P-256 | crypto-policy DEFAULT |
| RHEL 10 | 2048 bits | P-256 | crypto-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
| ← Anterior: Capítulo 3 - Visão Geral das Ferramentas de Certificados do RHEL | Próximo: Capítulo 5 - Certificados X.509 no RHEL → |
|---|
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
| Campo | Propósito |
|---|---|
| Version | Geralmente v3 (adiciona extensões) |
| Serial Number | Único por CA |
| Signature Algorithm | ex. sha256WithRSAEncryption |
| Issuer | Nome Distinguido (DN) da CA |
| Validity | Datas Not Before e Not After |
| Subject | DN da entidade (CN, O, C…) |
| Subject Public Key Info | Algoritmo + Chave |
| Extensions | Key Usage, SAN, CRL DP, etc. |
| Signature | Assinatura 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 RHEL | OpenSSL | Rigor de Validação | Mudanças Chave |
|---|---|---|---|
| RHEL 7 | 1.0.2k | Padrão | SANs recomendados |
| RHEL 8 | 1.1.1k | Mais rigoroso | SANs fortemente recomendados |
| RHEL 9 | 3.5.5 | Muito rigoroso | SANs requeridos, SHA-1 bloqueado |
| RHEL 10 | 3.5.5 | Muito rigoroso | Igual 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
| ← Anterior: Capítulo 4 - Criptografia Básica para Administradores RHEL | Próximo: Capítulo 6 - Mergulho Profundo no Repositório de Confiança RHEL → |
|---|
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 comtrust 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:
- Verificar assinatura do certificado usando a chave pública do emissor
- Encontrar certificado do emissor no repositório de confiança
- Repetir até alcançar a raiz confiável da CA
- 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:
| Componente | Função |
|---|---|
p11-kit | Middleware que carrega módulos de confiança e os expõe via PKCS#11 |
p11-kit-trust | O módulo de confiança (/usr/lib64/pkcs11/p11-kit-trust.so) que lê os certificados de origem |
update-ca-trust | Script shell que invoca p11-kit extract para regenerar os bundles extraídos |
trust | Interface 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 eblocklist/refere-se ao nome de diretório do RHEL 9/10+. Ambos servem o mesmo propósito. Quando você vir um caminho comosource/blacklist/, substitua porsource/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:
| Prioridade | Diretório | Gerenciado 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áveisblacklist/(RHEL 7/8) oublocklist/(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 arquivoca-bundle.trust.p11-kitfornecido com o pacoteca-certificates.
Crítico: Os formatos
BEGIN TRUSTED CERTIFICATEeBEGIN CERTIFICATEnão são intercambiáveis. Um arquivoBEGIN TRUSTED CERTIFICATEcarrega 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 comoBEGIN CERTIFICATEsimples (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) oBEGIN TRUSTED CERTIFICATEtem 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:
-
Desconfiança prevalece sobre confiança. Se um certificado aparece tanto em
anchors/quanto emblacklist//blocklist/, ele é desconfiado. -
Admin sobrescreve pacotes. Atributos de confiança definidos em
/etc/pki/ca-trust/source/sobrescrevem aqueles de/usr/share/pki/ca-trust-source/. -
Atributos explícitos sobrescrevem padrões. Um arquivo
.p11-kitcom restrições de propósito específicas sobrescreve a confiança genérica dada a um PEM simples emanchors/. -
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 comoBEGIN CERTIFICATE, a desconfiança ocorre em dois casos:- O
BEGIN TRUSTED CERTIFICATEtem usos rejeitados explícitos — a rejeição contradiz a confiança implícita total do PEM simples. - O
BEGIN TRUSTED CERTIFICATEtem 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.
- O
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 emca-bundle.trust.p11-kitcom atributos de uso rejeitado ou confiança vazia. O resultado: a CA é desconfiada apósupdate-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 RHEL | Comando trust | Desconfiança | Diretório de Desconfiança | Notas |
|---|---|---|---|---|
| RHEL 7 | Básico | Limitada | blacklist/ | Gerenciamento manual |
| RHEL 8 | Aprimorado | Suporte completo | blacklist/ | Integração com p11-kit |
| RHEL 9 | Aprimorado | Suporte completo | blocklist/ | Renomeado de blacklist/ |
| RHEL 10 | Aprimorado | Suporte completo | blocklist/ | 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 PEM | Dados de Confiança | Onde Aparece |
|---|---|---|
-----BEGIN CERTIFICATE----- | Nenhum — apenas certificado X.509 bruto | Arquivos que você baixa, respostas de CSR, exportações manuais |
-----BEGIN TRUSTED CERTIFICATE----- | Incorporados — inclui listas auxiliares de OIDs de confiança/rejeição | Bundle 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 granulares | ca-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ência | O Que Significa | Como o p11-kit Trata |
|---|---|---|
| Codificação DER idêntica, mesmo formato | Mesmo certificado byte a byte, mesmo encapsulamento de confiança | Deduplicado — aparece uma vez na saída |
| Codificação DER idêntica, formato de confiança diferente | Mesmo certificado, mas um tem atributos BEGIN TRUSTED CERTIFICATE / .p11-kit e o outro tem BEGIN CERTIFICATE | DESCONFIADO 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 diferente | Mesmo certificado lógico, mas recodificado | Tratados como objetos separados — ambos são carregados |
| Mesmo Subject DN, Serial diferente | Certificados 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 CERTIFICATEcom 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 CERTIFICATEcom 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 listo mostra comtrust: 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 umBEGIN CERTIFICATEsimples emanchors/, 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 algumBEGIN TRUSTED CERTIFICATEcom 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 listcom 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ção | Explicação Provável | Impacto |
|---|---|---|
| Mesma impressão digital, mesmo formato PEM | Duplicata inofensiva — p11-kit deduplica | Nenhum |
| 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 total | Certificado marcado DESCONFIADO |
| Mesmo subject + serial, impressão digital diferente | Certificado recodificado ou adulterado | Ambos carregados como objetos separados |
| Mesmo subject, serial diferente | Certificado CA reemitido (novo par de chaves ou renovado) | Ambos carregados independentemente |
Mesmo subject + serial + impressão digital, saída de trust list diferente | Mesmo certificado com atributos de confiança diferentes aplicados | Possí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
| Campo | Significado |
|---|---|
pkcs11:id=... | URI PKCS#11 identificando unicamente este objeto |
type | Sempre certificate para certs de CA |
label | Nome legível por humanos (CN do subject do certificado) |
trust: anchor | Certificado é confiável como uma CA |
trust: distrusted | Certificado é explicitamente desconfiado |
category: authority | Certificado é uma CA (tem Basic Constraints CA:TRUE) |
category: other-entry | Certificado é 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 em | Significado | Ação |
|---|---|---|
/etc/pki/ca-trust/source/blacklist/ (RHEL 7/8) ou blocklist/ (RHEL 9+) | Admin explicitamente desconfiou | Intencional — verifique com a equipe se inesperado |
/usr/share/pki/ca-trust-source/blacklist/ (RHEL 7/8) ou blocklist/ (RHEL 9+) | Pacote RPM desconfiou | Mozilla/Red Hat revogou confiança — verifique avisos de segurança |
ca-bundle.trust.p11-kit com atributos de desconfiança | Mozilla removeu confiança upstream | Normal — CA foi desconfiada pelo programa de raiz Mozilla NSS |
| Não encontrado em nenhum diretório de desconfiança | Provavelmente um conflito de formato de confiança — mesmo cert existe como BEGIN CERTIFICATE e BEGIN TRUSTED CERTIFICATE / .p11-kit | Verifique 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
| Problema | Causa | Solução |
|---|---|---|
| CA não encontrada após adicionar a anchors/ | Esqueceu de executar update-ca-trust | Execute 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 vazia | Remova 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 desconfiada | Compare impressões digitais; garanta certificado idêntico |
| Aplicação Java não confia na CA | Keystore Java não regenerada | Execute sudo update-ca-trust (reconstrói cacerts) |
| Confiança restaurada após reinício | Admin adicionou cert a /usr/share/ (sobrescrito por atualizações de RPM) | Sempre use /etc/pki/ca-trust/source/anchors/ |
trust list mostra entradas duplicadas | Mesma CA de subject de múltiplas fontes com conteúdo DER diferente | Identifique e remova o arquivo de origem redundante |
update-ca-trust falha silenciosamente | Arquivo de certificado corrompido nas origens | Verifique 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
| ← Anterior: Capítulo 5 - Certificados X.509 no RHEL | Próximo: Capítulo 7 - Assinaturas Digitais e Verificação no RHEL → |
|---|
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:
- Determinísticas
- Resistência a pré-imagem
- Resistência a colisões
- Efeito avalanche
Algoritmos populares: SHA-256, SHA-3, BLAKE2.
7.2 Construir Assinaturas
- Calcular hash da mensagem.
- Criptografar hash com chave privada → assinatura.
- 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
| Algoritmo | RHEL 7 | RHEL 8 | RHEL 9 | RHEL 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
| ← Anterior: Capítulo 6 - Mergulho Profundo no Repositório de Confiança RHEL | Próximo: Capítulo 8 - Versões RHEL e Evolução dos Certificados → |
|---|
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 RHEL | Data GA | Suporte Termina | Versão OpenSSL | Característica Chave de Certificado |
|---|---|---|---|---|
| RHEL 7 | Junho 2014 | Junho 2024 | 1.0.2k-26 | Gerenciamento manual tradicional |
| RHEL 8 | Maio 2019 | Maio 2029 | 1.1.1k-14 | Crypto-policies introduzidas |
| RHEL 9 | Maio 2022 | Maio 2032 | 3.5.5-2 | OpenSSL 3.x, padrões mais rigorosos |
| RHEL 10 | Maio 2025 | Maio 2035 | 3.5.5-2 | Fortalecimento contínuo, preparação PQC |
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 TLS | RHEL 7 | RHEL 8 | RHEL 9 | RHEL 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
| Ferramenta | RHEL 7 | RHEL 8 | RHEL 9 | RHEL 10 |
|---|---|---|---|---|
openssl | 1.0.2k | 1.1.1k | 3.5.5 | 3.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ística | RHEL 7 | RHEL 8 | RHEL 9 | RHEL 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:
- Auditar versões TLS em uso
- Atualizar configurações de cifra
- Testar aplicações com TLS 1.2+
- 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:
- Testar todas as operações de certificados
- Atualizar scripts personalizados usando OpenSSL
- Validar integridade da cadeia de certificados
- 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:
- Revisar documentação RHEL 10.x
- Testar compatibilidade de crypto-policy
- 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
- Sempre verificar versão RHEL primeiro ao resolver problemas
- RHEL 8 introduziu crypto-policies - mudança de jogo para gerenciamento de certificados
- RHEL 9 usa OpenSSL 3.x - mudanças significativas em API e comportamento
- RHEL 10 continua base RHEL 9 - melhorias incrementais
- Algoritmos legados removidos progressivamente entre versões
- 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
| ← Anterior: Capítulo 7 - Assinaturas Digitais e Verificação no RHEL | Próximo: Capítulo 9 - Gerenciamento de Certificados no RHEL 7 → |
|---|
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
| Erro | Causa | Solução |
|---|---|---|
| “certificate verify failed” | CA faltando em repositório de confiança | Adicionar CA a /etc/pki/ca-trust/source/anchors/ |
| “permission denied” na chave | Permissões erradas | chmod 600 em arquivo .key |
| “certificate has expired” | Cert expirado | Renovar certificado manualmente |
| “no shared cipher” | Desajuste cipher cliente/servidor | Atualizar SSLCipherSuite |
| “wrong version number” | Desajuste versão TLS | Atualizar 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
- RHEL 7 é manual - Sem crypto-policies, configuração cuidadosa necessária
- OpenSSL 1.0.2k - Sintaxe antiga, sem TLS 1.3
- TLS 1.0/1.1 habilitados por padrão - Desabilitá-los manualmente
- SHA-1 ainda funciona - Mas não após migração para RHEL 8+
- certmonger disponível - Mas básico comparado a RHEL 8+
- Planejar migração - Suporte RHEL 7 está terminando
- 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
| ← Anterior: Capítulo 8 - Versões RHEL e Evolução dos Certificados | Próximo: Capítulo 10 - RHEL 8 e Crypto-Policies → |
|---|
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:
| Recurso | RHEL 7 | RHEL 8 |
|---|---|---|
| OpenSSL | 1.0.2k | 1.1.1k-14 |
| TLS 1.3 | ❌ Não | ✅ Sim |
| Crypto-Policies | ❌ Não | ✅ NOVO! |
| TLS 1.0/1.1 | ✅ Habilitado | ❌ Desabilitado (DEFAULT) |
| certmonger | Básico | Aprimorado |
| Segurança Padrão | Mista | Mais 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ítica | Versões TLS | RSA Mín | SHA-1 | 3DES | Caso de Uso |
|---|---|---|---|---|---|
| DEFAULT | 1.2, 1.3 | 2048 | ❌ Não | ❌ Não | Padrão (recomendado) |
| LEGACY | 1.0+, todos | 1024 | ⚠️ Sim | ⚠️ Sim | Compatibilidade sistemas antigos |
| FUTURE | 1.2, 1.3 | 3072 | ❌ Não | ❌ Não | Segurança mais rigorosa |
| FIPS | 1.2, 1.3 | 2048 | ❌ Não | ❌ Não | Conformidade 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)
- Crypto-policies são O recurso - Aprenda bem
- Política DEFAULT é boa - Não mude sem razão
- TLS 1.3 agora disponível - Mais rápido e mais seguro
- OpenSSL 1.1.1 - Recursos modernos, melhor sintaxe
- certmonger aprimorado - Melhor automatização
- Migração do RHEL 7 - Testar completamente
- 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
| ← Anterior: Capítulo 9 - Gerenciamento de Certificados no RHEL 7 | Próximo: Capítulo 11 - Segurança Moderna no RHEL 9 → |
|---|
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:
| Recurso | RHEL 8 | RHEL 9 |
|---|---|---|
| OpenSSL | 1.1.1k | 3.5.5 |
| Arquitetura | Tradicional | Baseada em Provider |
| TLS 1.0/1.1 | Política LEGACY | ❌ Completamente removido |
| Crypto-Policies | Básica | Subpolíticas |
| Validação | Padrão | Mais Rigorosa |
| SHA-1 | Depreciado | Bloqueado |
| certmonger | Aprimorado | Fluxos 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
| Erro | Causa | Solução |
|---|---|---|
| “CA md too weak” | Assinatura SHA-1 | Reemitir com SHA-256+ |
| “Provider not available” | Algoritmo legado usado | Adicionar -provider legacy ou atualizar para algoritmo moderno |
| “unsupported” em comando openssl | Algoritmo desabilitado | Usar alternativa moderna ou provider legado |
| “no shared cipher” (app migrada) | Cliente usa cifras antigas | Atualizar cliente ou usar política LEGACY temporariamente |
| “certificate verify failed” | Validação mais rigorosa | Verificar 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
- Arquitetura provider OpenSSL 3.5.5 - Entender providers
- Validação mais rigorosa - Captura problemas segurança (bom!)
- SHA-1 completamente bloqueado - Reemitir certificados antigos
- Subpolíticas crypto-policy - Ajustar fino segurança
- certmonger continua valioso para IPA e fluxos de renovação com rastreamento
- Suporte TLS 1.3 obrigatório - Mais rápido, mais seguro
- 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
| ← Anterior: Capítulo 10 - RHEL 8 e Crypto-Policies | Próximo: Capítulo 12 - Recursos Atuais do RHEL 10 → |
|---|
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
| Recurso | RHEL 9 | RHEL 10 |
|---|---|---|
| OpenSSL | 3.5.5 | 3.5.5 (mesma base) |
| Crypto-Policies | Subpolíticas | Subpolíticas aprimoradas |
| Versões TLS | 1.2, 1.3 | 1.3 preferido, 1.2 suportado |
| FIPS | Módulos 140-2 | Transição 140-3 |
| Padrões Segurança | Rigoroso | Mais Rigoroso |
| Suporte Container | Bom | Aprimorado |
| Pós-Quântico | Fundação | Preparaçã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ário | RHEL 9 | RHEL 10 | Recomendação |
|---|---|---|---|
| Nova implantação 2025+ | ✅ Bom | ✅ Melhor | RHEL 10 |
| RHEL 9 existente | ✅ Manter | ⏸️ Aguardar | Ficar em 9 por ora |
| Migrando do RHEL 8 | ✅ Sim | ✅ Considere | Ambos (9 é mais seguro) |
| Migrando do RHEL 7 | ✅ Sim | ⚠️ Grande salto | Ir para 9 primeiro |
| Horizonte 10+ anos | ⏸️ Suporte 2032 | ✅ Suporte 2035 | RHEL 10 |
| Segurança vanguarda | ✅ Boa | ✅ Melhor | RHEL 10 |
| Produção crítica | ✅ Provado | ⏸️ Mais novo | RHEL 9 (mais seguro) |
12.16 Conclusões Chave
- RHEL 10 = RHEL 9 + melhorias incrementais
- Mesma base OpenSSL 3.5.5 - Sem mudanças API principais
- Padrões segurança mais rigorosos - Bom para segurança
- Preparação pós-quântica - Infraestrutura pronta futuro
- Sem mudanças certificado urgentes - Transição é suave
- Conhecimento RHEL 9 transfere - Mesmas ferramentas e comandos
- 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
| ← Anterior: Capítulo 11 - Segurança Moderna no RHEL 9 | Próximo: Capítulo 13 - Compatibilidade Entre Versões → |
|---|
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 7 | Servidor 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
| Erro | Causa | Solução |
|---|---|---|
| “wrong version number” | Desajuste versão TLS | Atualizar cliente para TLS 1.2+ |
| “no shared cipher” | Incompatibilidade cipher | Verificar crypto-policy ou config cipher |
| “certificate verify failed” | Problema trust ou validação | Verificar trust CA, validade certificado |
| “sslv3 alert handshake failure” | Incompatibilidade protocolo | Atualizar versões TLS |
| “unsafe legacy renegotiation” | OpenSSL antigo no cliente | Atualizar 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
- Ambientes mistos são normais - Planejar para compatibilidade
- TLS 1.2+ é o mínimo para sistemas modernos
- Assinaturas SHA-256+ requeridas para RHEL 8+
- Crypto-policies mudaram tudo (RHEL 8+)
- Testar em todas versões antes de implantar
- Documentar tudo - especialmente exceções
- 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 RHEL | Versão Apache | OpenSSL | Abordagem Config |
|---|---|---|---|
| RHEL 7 | 2.4.6 | 1.0.2k | Configuração SSL manual |
| RHEL 8 | 2.4.37+ | 1.1.1k | Manual + crypto-policies |
| RHEL 9 | 2.4.53+ | 3.5.5 | Crypto-policies preferido |
| RHEL 10 | 2.4.62+ | 3.5.5 | Crypto-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 Erro | Causa | Solução |
|---|---|---|
| “SSLCertificateFile: file does not exist” | Caminho errado | Corrigir caminho em ssl.conf |
| “Permission denied” em arquivo chave | Permissões erradas | chmod 600 na chave |
| “certificate verify failed” | Problema cadeia | Instalar certs intermediários |
| “SSLCertificateKeyFile: file does not exist” | Chave faltando | Gerar ou restaurar chave |
| “Private key does not match certificate” | Desajuste cert/chave | Regenerar CSR com chave correta |
| “SSL Library Error” | mod_ssl não carregado | Instalar pacote mod_ssl |
| “ca md too weak” (RHEL 9+) | Assinatura SHA-1 | Reemitir com SHA-256+ |
| “name mismatch” | Hostname não coincide CN/SAN | Corrigir 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
- Apache + mod_ssl é o servidor web padrão RHEL
- RHEL 7: Configuração TLS manual requerida
- RHEL 8/9/10: Crypto-policies simplificam configuração
- Integração certmonger habilita automatização
- certbot requer EPEL (não oficialmente suportado)
- Sempre usar SANs em certificados
- 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 RHEL | Fonte NGINX | Como Instalar |
|---|---|---|
| RHEL 7 | EPEL (comunidade) | Habilitar EPEL, então yum install nginx |
| RHEL 8 | AppStream (oficial) | dnf module install nginx:1.20 |
| RHEL 9 | AppStream (oficial) | dnf install nginx |
| RHEL 10 | AppStream (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
| Erro | Causa | Solução |
|---|---|---|
| “SSL: error:0200100D…” | Permissão negada na chave | chmod 600 no arquivo chave |
| “no ssl configured for the server” | Faltando ssl em listen | Adicionar listen 443 ssl; |
| “cannot load certificate” | Arquivo não encontrado ou inválido | Verificar caminho e formato cert |
| “PEM_read_bio:no start line” | Formato errado | Garantir que cert está em formato PEM |
| “key values mismatch” | Cert/chave não coincidem | Regenerar com chave correta |
| “nginx: [emerg] bind() failed” | Porta já em uso | Verificar 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
- NGINX disponível no AppStream (RHEL 8+) ou EPEL (RHEL 7)
- Crypto-policies simplificam config no RHEL 8/9/10
- certmonger integra bem com reload automático
- certbot requer EPEL em todas versões RHEL
- SNI habilita múltiplos certs no mesmo IP
- mTLS possível para autenticação cliente
- 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
| ← Anterior: Capítulo 14 - Apache httpd no RHEL | Próximo: Capítulo 16 - TLS no Servidor de E-mail Postfix → |
|---|
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ível | Comportamento | Caso de Uso |
|---|---|---|
none | TLS desabilitado | Não recomendado |
may | TLS opcional (oportunista) | Padrão (compatível) |
encrypt | TLS requerido | Ambientes alta segurança |
dane | Validação baseada em DNSSEC | Configuraçõ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
| Erro | Causa | Solução |
|---|---|---|
| “SSL_accept error” | Problema certificado/chave | Verificar coincidência par cert/chave |
| “No shared cipher” | Incompatibilidade cipher | Verificar crypto-policy ou cliente |
| “certificate verify failed” | Cadeia confiança quebrada | Instalar certs intermediários |
| “Permission denied” na chave | Permissões erradas | chmod 600 no arquivo chave |
| “TLS is required but not available” | TLS não habilitado | Definir smtpd_tls_security_level = may |
| “STARTTLS failed” | Problema TLS cliente | Verificar 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
| Recurso | RHEL 7 | RHEL 8 | RHEL 9 | RHEL 10 |
|---|---|---|---|---|
| Versão Postfix | 2.10.x | 3.3.x+ | 3.5.x+ | 3.8.x+ |
| OpenSSL | 1.0.2k | 1.1.1k | 3.5.5 | 3.5.5 |
| Config TLS | Manual | Crypto-policies | Crypto-policies | Crypto-policies |
| TLS Padrão | Pode incluir 1.0/1.1 | TLS 1.2+ | TLS 1.2+ | TLS 1.3 preferido |
| certmonger | Básico | Aprimorado | Suporte ACME | Suporte 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
- Postfix suporta TLS nas portas 25 (STARTTLS), 465 (SMTPS), 587 (Submission)
- RHEL 7 requer config TLS manual (protocolos, cifras)
- RHEL 8+ usa crypto-policies (muito mais simples!)
- Níveis de segurança:
none,may,encrypt,dane - certmonger funciona ótimo com Postfix
- Sempre testar com
openssl s_client -starttls smtp - 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étodo | Porta | Criptografia | Caso de Uso |
|---|---|---|---|
| LDAP | 389 | ❌ Nenhuma | Legado, não recomendado |
| LDAPS | 636 | ✅ TLS desde início | Preferido, criptografado |
| LDAP+STARTTLS | 389 | ✅ Atualizar para TLS | Alternativa 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
| Erro | Causa | Solução |
|---|---|---|
| “TLS: can’t connect” | Certificado/chave não legível | Verificar propriedade: chown ldap:ldap |
| “TLS: hostname does not match” | Desajuste CN/SAN | Regenerar cert com hostname correto |
| “Certificate verification failed” | CA não confiável | Adicionar CA ao repositório de confiança cliente |
| “Permission denied” na chave | Propriedade/permissões erradas | chmod 600, chown ldap:ldap |
| “TLS engine not initialized” | TLS não configurado | Adicionar diretivas TLS à config |
| “error:14094410:SSL routines” | Desajuste protocolo/cifra | Verificar 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
- LDAPS (porta 636) é mais simples que STARTTLS
- Propriedade certificado crítica - Deve ser legível pelo usuário
ldap - cn=config preferido sobre slapd.conf (RHEL moderno)
- FreeIPA lida com LDAPS automaticamente - Muito mais fácil!
- Configuração cliente importa - Definir TLS_CACERT corretamente
- Testar completamente - Usar
openssl s_clienteldapsearch -ZZ - 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
| ← Anterior: Capítulo 16 - TLS no Servidor de E-mail Postfix | Próximo: Capítulo 18 - TLS em Bancos de Dados (PostgreSQL, MySQL) → |
|---|
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-SSLhostssl: Requerer SSLhostnossl: Explicitamente proibir SSL
Opções Cert Cliente:
md5: SSL requerido, auth senhacert: SSL + certificado cliente requeridoclientcert=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 SSLallow: Tentar SSL, fallback para não-SSLprefer: Preferir SSL, fallback permitidorequire: Requerer SSL (não verificar cert)verify-ca: Requerer SSL, verificar CAverify-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 RHEL | PostgreSQL | Suporte SSL | Notas |
|---|---|---|---|
| RHEL 7 | 9.2 | ✅ Sim | Config versão TLS manual |
| RHEL 8 | 10.x+ | ✅ Sim | Crypto-policy sistema |
| RHEL 9 | 13.x+ | ✅ Sim | Aprimorado, crypto-policy |
| RHEL 10 | 15.x+ | ✅ Sim | Último, crypto-policy |
Versões MySQL/MariaDB no RHEL
| Versão RHEL | Banco Dados | Suporte SSL | Notas |
|---|---|---|---|
| RHEL 7 | MariaDB 5.5 | ✅ Sim | Config manual |
| RHEL 8 | MariaDB 10.3+ | ✅ Sim | Consciente crypto-policy |
| RHEL 9 | MariaDB 10.5+ | ✅ Sim | TLS moderno |
| RHEL 10 | MariaDB 10.11+ | ✅ Sim | Recursos ú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
- Ambos PostgreSQL e MySQL suportam SSL/TLS
- Propriedade arquivo crítica - postgres:postgres ou mysql:mysql
- Permissões: 600 para chaves, 644 para certs
- pg_hba.conf controla acesso PostgreSQL (hostssl)
- sslmode importante para clientes PostgreSQL
- Certificados cliente habilitam autenticação forte
- Testar completamente antes forçar TLS
- 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
| ← Anterior: Capítulo 17 - OpenLDAP e Serviços de Diretório | Próximo: Capítulo 19 - Serviços de Certificados do FreeIPA → |
|---|
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
- Navegar para https://ipa.example.com/
- Identity → Hosts → Selecionar host → Actions → New Certificate
- 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
- FreeIPA é a CA interna recomendada pela Red Hat
- Combina identidade + certificados + autenticação
- Integração certmonger é automática
- Certificados auto-renovam (sem trabalho manual!)
- Usar principals serviço (HTTP/host, ldap/host)
- Suporte ACME no RHEL 9+ (pode substituir Let’s Encrypt para interno)
- Interface Web e CLI ambas disponíveis
- 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
| ← Anterior: Capítulo 18 - TLS em Bancos de Dados (PostgreSQL, MySQL) | Próximo: Capítulo 20 - Outros Serviços RHEL com Certificados → |
|---|
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ço | CN/SAN | Cert Cliente | Auto-Renov | Notas Especiais |
|---|---|---|---|---|
| Apache | Requerido | Opcional (mTLS) | certmonger | Mais comum |
| NGINX | Requerido | Opcional (mTLS) | certmonger | Alto desempenho |
| Postfix | Requerido | Opcional | certmonger | SMTP/SMTPS |
| OpenLDAP | Requerido | Opcional | certmonger | Deve ser legível usuário ldap |
| PostgreSQL | Requerido | Opcional | Manual ou script | Propriedade usuário postgres |
| MySQL | Requerido | Opcional | Manual ou script | Propriedade usuário mysql |
| FreeIPA | Automático | N/A | Automático | Auto-gerenciado |
| Cockpit | Requerido | Não | certmonger | Arquivo cert+chave combinado |
| OpenVPN | Requerido | Requerido | Manual | PKI complexa |
| strongSwan | Requerido | Requerido | Manual | IPsec específico |
| HAProxy | Requerido | Não | certmonger | Formato PEM combinado |
| Registry | Requerido | Opcional | Manual | Container 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
- Muitos serviços usam certificados além de apenas servidores web
- Cada serviço tem requisitos únicos - Verificar propriedade, permissões
- certmonger funciona com maioria serviços para automatização
- Certificados wildcard podem simplificar setups multi-serviço
- Testar cada serviço independentemente
- Rastreamento centralizado com certmonger recomendado
- 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
| ← Anterior: Capítulo 19 - Serviços de Certificados do FreeIPA | Próximo: Capítulo 21 - Melhores Práticas de Certificados de Serviço → |
|---|
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
- Organização previne confusão - Estrutura e nomenclatura consistentes
- Permissões são críticas - 600 para chaves, 644 para certs
- Automatizar renovação - Usar certmonger sempre que possível
- Backup de tudo - Mas criptografar chaves privadas
- Documentar completamente - Seu eu futuro agradecerá
- Monitorar proativamente - Não esperar por expiração
- Validar antes implantar - Capturar problemas cedo
- 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
| ← Anterior: Capítulo 20 - Outros Serviços RHEL com Certificados | Próximo: Capítulo 22 - Domínio do certmonger → |
|---|
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çãoSUBMITTING: 🔄 Submetendo requisição para CACA_UNREACHABLE: ❌ Não consegue alcançar servidor CACA_REJECTED: ❌ CA rejeitou requisiçãoNEED_KEY_GEN_PIN: ⏸️ Aguardando PIN (HSM/token)PRE_SAVE_COMMAND: 🔄 Executando script pre-savePOST_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ção | Propósito | Exemplo |
|---|---|---|
-f | Caminho arquivo certificado | /etc/pki/tls/certs/web.crt |
-k | Caminho arquivo chave privada | /etc/pki/tls/private/web.key |
-K | Principal Kerberos | HTTP/web.example.com@REALM |
-D | DNS SAN | web.example.com |
-N | Subject DN | CN=web,O=Example |
-C | Comando post-save | systemctl reload httpd |
-B | Comando pre-save | systemctl stop httpd |
-c | Nome CA | IPA ou external-ca |
-T | Perfil certificado | caIPAserviceCert |
-g | Tamanho chave | 2048 ou 4096 |
-G | Tipo chave | rsa 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?
| Recurso | certmonger | certbot |
|---|---|---|
| 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ção | 2/3 do tempo vida | 30 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
- certmonger é a automatização de certificados do RHEL
- Configure e esqueça - Renovação automática
- Funciona melhor com FreeIPA, CAs internas e renovações baseadas em helpers
- Comandos pós-salvamento recarregam serviços automaticamente
- Rastreia expiração e renova a 2/3 do tempo de vida
- Status MONITORING significa que tudo está bem
- 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
| ← Anterior: Capítulo 21 - Melhores Práticas de Certificados de Serviço | Próximo: Capítulo 23 - Mergulho Profundo em Crypto-Policies → |
|---|
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ítica | Versões TLS | RSA Mín | SHA-1 | 3DES | DH Mín | Caso de Uso |
|---|---|---|---|---|---|---|
| DEFAULT | 1.2, 1.3 | 2048 | ❌ | ❌ | 2048 | ✅ Recomendado |
| LEGACY | 1.0+ | 1024 | ⚠️ | ⚠️ | 1024 | Apenas compatibilidade |
| FUTURE | 1.2, 1.3 | 3072 | ❌ | ❌ | 3072 | Alta segurança |
| FIPS | 1.2, 1.3 | 2048 | ❌ | ❌ | 2048 | Conformidade 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ítica | Efeito | Caso de Uso |
|---|---|---|
NO-SHA1 | Desabilitar completamente SHA-1 | Segurança extra |
AD-SUPPORT | Habilitar compatibilidade AD | Windows/Linux misto |
GOST | Habilitar algoritmos GOST | Requisitos russos |
NO-CAMELLIA | Desabilitar cifra Camellia | Conformidade específica |
NO-ENFORCE-EMS | Desabilitar Extended Master Secret | Compatibilidade |
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 Certificado | DEFAULT | LEGACY | FUTURE | FIPS |
|---|---|---|---|---|
| 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
- Crypto-policies são apenas RHEL 8+ (não no RHEL 7)
- Política DEFAULT é recomendada para maioria casos
- Mudanças requerem restarts serviço para surtir efeito
- Afeta TODAS aplicações crypto system-wide
- Subpolíticas fornecem ajuste fino (RHEL 9+)
- Evitar overrides por app quando possível
- Testar antes de implantar novas políticas
- 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 uso | Ferramenta recomendada |
|---|---|
| Certificado público de internet do Let’s Encrypt | certbot |
| Certificado interno do FreeIPA / IdM | certmonger com ipa-getcert |
| ACME contra seu próprio endpoint IdM ACME | certbot 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 Limite | Valor | Período |
|---|---|---|
| Certificados por domínio | 50 | por semana |
| Certificados duplicados | 5 | por semana |
| Validações falhadas | 5 | por hora |
| Novas contas | 10 | por 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
- Let’s Encrypt fornece certificados gratuitos para domínios públicos
- certbot requer EPEL em TODAS versões RHEL (não oficialmente suportado)
- certbot automatiza configuração Apache/NGINX
- Validade 90 dias requer renovação automática
- certmonger continua sendo a opção nativa para fluxos de FreeIPA e CA interna
- Para serviços internos: Usar FreeIPA ao invés
- Testar com –dry-run para evitar limites taxa
- 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
| ← Anterior: Capítulo 23 - Mergulho Profundo em Crypto-Policies | Próximo: Capítulo 25 - Automatização Ansible para Certificados → |
|---|
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
- Ansible habilita implantação certificado em massa
- Coleção community.crypto essencial para tarefas certificado
- Usar ansible-vault para chaves privadas
- Playbooks idempotentes são críticos
- Testar em staging antes produção
- Combinar com certmonger para melhores resultados
- 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
| ← Anterior: Capítulo 24 - Let’s Encrypt e certbot | Próximo: Capítulo 26 - Monitoramento e Alertas no RHEL → |
|---|
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
| Ferramenta | Complexidade | Custo | Integração | Alertas |
|---|---|---|---|---|
| Scripts simples | Baixa | Gratuito | Fácil | Email/syslog |
| Nagios/Icinga | Média | Gratuito | Boa | Múltiplos |
| Prometheus + Grafana | Média-Alta | Gratuito | Excelente | Poderoso |
| Zabbix | Média | Gratuito | Boa | Múltiplos |
| Comercial (Datadog, etc.) | Baixa | $$$ | Excelente | Avançado |
| Red Hat Insights | Baixa | Subscription | Nativo | Dashboard |
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
- Monitorar proativamente - Não esperar por expiração
- Aviso 30 dias mínimo recomendado
- Status certmonger crítico se usando automatização
- Múltiplos canais alerta (email, Slack, PagerDuty)
- Testar monitoramento - Garantir alertas realmente chegam
- Logar tudo para trilha auditoria
- 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
| ← Anterior: Capítulo 25 - Automatização Ansible para Certificados | Próximo: Capítulo 27 - Metodologia de Solução de Problemas de Certificados RHEL → |
|---|
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 Erro | Significado | Solução |
|---|---|---|
| 0 | OK | ✅ Sem problemas |
| 19 | Certificado autoassinado na cadeia | Adicionar CA ao repositório de confiança |
| 20 | Impossível obter cert emissor local | CA ou intermediário faltando |
| 21 | Impossível verificar primeiro certificado | Cert intermediário faltando |
| 27 | Certificado não confiável | CA 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
- Sempre seguir metodologia de 7 passos - não pular passos
- Verificar versão RHEL primeiro - comportamento varia significativamente
- Verificar propriedades básicas certificado antes de solução de problemas complexa
- Problemas de cadeia de confiança são o problema mais comum
- Permissões de arquivo causam muitas falhas “misteriosas”
- Crypto-policies (RHEL 8+) afetam tudo
- SELinux pode bloquear acesso a certificados
- 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
| ← Anterior: Capítulo 26 - Monitoramento e Alertas no RHEL | Próximo: Capítulo 28 - Erros Comuns de Certificados no RHEL → |
|---|
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:
- Viu um erro? Busque neste capítulo pela mensagem de erro
- Serviço não inicia? Verifique Seção 28.3 (Erros de Configuração)
- Conexão falha? Verifique Seção 28.4 (Erros de Validação)
- Após atualização RHEL? Verifique Seção 28.7 (Específico por Versão)
- Não tem certeza? Use a metodologia do Capítulo 27
28.2 Erros Mais Comuns (Top 10)
Tabela de Referência Rápida
| # | Erro | Causa Comum | Solução Rápida |
|---|---|---|---|
| 1 | Certificado expirado | Esqueceu renovar | Renovar certificado |
| 2 | unable to get local issuer | CA faltando no repositório de confiança | Adicionar CA a /etc/pki/ca-trust/source/anchors/ |
| 3 | certificate verify failed | Cadeia incompleta | Instalar certs intermediários |
| 4 | Permission denied | Permissões de arquivo erradas | chmod 600 em arquivo de chave |
| 5 | hostname does not match | Desajuste de CN/SAN | Reemitir com SANs corretos |
| 6 | no shared cipher | Incompatibilidade de cifra | Verificar crypto-policy (RHEL 8+) |
| 7 | ca md too weak | Assinatura SHA-1 (RHEL 9+) | Reemitir com SHA-256+ |
| 8 | wrong version number | Desajuste de versão TLS | Verificar suporte TLS cliente |
| 9 | CA_UNREACHABLE | certmonger não alcança IPA | Verificar conectividade IPA |
| 10 | SELinux denying access | Contexto SELinux errado | restorecon 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 modernoalgo 1— RSA (criptografar ou assinar)digest algo 1— MD5 (criptograficamente quebrado)version 3na assinatura — formato de assinatura antigosigclass 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
| Campo | Significado |
|---|---|
off | Deslocamento em bytes no arquivo (posição inicial deste pacote) |
ctb | Cipher Type Byte (byte de cabeçalho em hex, codifica formato + tag) |
tag | Tipo de pacote (decodificado — ver tabela abaixo) |
hlen | Comprimento do cabeçalho em bytes |
plen | Comprimento do conteúdo em bytes |
Tags de Pacote (tag=)
| Tag | Tipo de Pacote |
|---|---|
| 1 | Chave de Sessão Criptografada com Chave Pública |
| 2 | Assinatura |
| 3 | Chave de Sessão Criptografada com Chave Simétrica |
| 4 | Assinatura One-Pass |
| 5 | Chave Pública |
| 6 | Chave Secreta |
| 7 | Subchave Secreta |
| 8 | Dados Compactados |
| 9 | Dados Criptografados Simetricamente |
| 10 | Marcador |
| 11 | Dados Literais |
| 12 | Confiança |
| 13 | ID de Usuário |
| 14 | Subchave Pública |
| 17 | Atributo de Usuário |
| 18 | Dados Criptografados + Proteção de Integridade |
| 19 | Código de Detecção de Modificação |
IDs de Algoritmo de Chave Pública (algo)
| ID | Algoritmo |
|---|---|
| 1 | RSA (criptografar ou assinar) |
| 2 | RSA (somente criptografar) |
| 3 | RSA (somente assinar) |
| 16 | Elgamal (somente criptografar) |
| 17 | DSA |
| 18 | ECDH |
| 19 | ECDSA |
| 21 | Diffie-Hellman |
| 22 | EdDSA (Ed25519, etc.) |
IDs de Algoritmo de Digest (Hash) (digest algo)
| ID | Algoritmo | Status |
|---|---|---|
| 1 | MD5 | Quebrado — não usar |
| 2 | SHA-1 | Descontinuado — bloqueado no RHEL 9+ |
| 3 | RIPEMD-160 | Legado |
| 8 | SHA-256 | Recomendado |
| 9 | SHA-384 | Forte |
| 10 | SHA-512 | Forte |
| 11 | SHA-224 | Aceitável |
Classes de Assinatura (sigclass)
| Código | Significado |
|---|---|
| 0x00 | Assinatura de documento binário |
| 0x01 | Assinatura de texto canônico |
| 0x02 | Assinatura independente |
| 0x10 | Certificação genérica de chave |
| 0x11 | Certificação de persona |
| 0x12 | Certificação casual |
| 0x13 | Certificação positiva |
| 0x18 | Vinculação de subchave |
| 0x19 | Vinculação de chave primária |
| 0x1F | Assinatura direta de chave |
| 0x20 | Revogação de chave |
| 0x28 | Revogação de subchave |
| 0x30 | Revogação de certificação |
| 0x40 | Marca temporal |
| 0x50 | Confirmação de terceiros |
Versões de Pacote de Chave
| Versão | Era | Status |
|---|---|---|
| 3 | PGP 2.x (1990s) | Obsoleto — usa MD5 internamente, rejeitado pelo GnuPG moderno |
| 4 | OpenPGP RFC 4880 (2007) | Padrão atual |
| 5 | Rascunho (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]
| Campo | Significado |
|---|---|
algo 1 | Algoritmo de chave pública utilizado (RSA) |
keyid | Identificador curto da chave assinante |
version 3 | Versão do formato de assinatura (v3 = legado) |
created | Timestamp Unix da criação da assinatura |
md5len | Comprimento do prefixo MD5 (artefato legado v3) |
sigclass 0x10 | Tipo de assinatura (certificação genérica de chave) |
digest algo 1 | Algoritmo de hash (MD5) |
begin of digest | Primeiros 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ãogpg-pubkeydo RPM em hexadecimal minúsculo (a47e31d2). Serpm -ereportar “not installed”, liste todas as chaves comrpm -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:
- Remova chaves de assinatura SHA-1 antigas e importe chaves atualizadas do fornecedor
- Reconstrua o banco de dados do RPM com
rpm --rebuilddb - 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 Erro | Código Erro | Causa | Capítulo |
|---|---|---|---|
| “certificate has expired” | - | Cert expirado | 28.4 |
| “unable to get local issuer” | 20 | CA faltando | 28.4 |
| “unable to verify first cert” | 21 | Intermediário faltando | 28.4 |
| “autoassinado certificate” | 18 | Autoassinado não confiável | 28.4 |
| “certificate verify failed” | - | Validação geral | 28.4 |
| “ca md too weak” | 3 | Assinatura SHA-1 | 28.7 |
| “no shared cipher” | - | Desajuste de cifra | 28.6 |
| “wrong version number” | - | Desajuste de versão TLS | 28.6 |
| “Permission denied” | - | Permissões de arquivo | 28.3 |
| “key values mismatch” | - | Cert/chave não coincidem | 28.3 |
| “hostname does not match” | - | Desajuste de CN/SAN | 28.4 |
| “CA_UNREACHABLE” | - | certmonger não alcança IPA | 28.9 |
| “CA_REJECTED” | - | IPA rejeitou requisição | 28.9 |
| “skipped PGP-2 keys” | - | Importação chave GPG v3 rejeitada | 28.10 |
| “SHA1 is not considered secure” | - | Chave GPG de terceiros usa SHA-1 | 28.11 |
| “Malformed MPI” | - | Assinatura OpenPGP não conforme | 28.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
- Maioria dos erros são previsíveis - Padrões comuns
- Sempre verificar expiração primeiro - Causa #1 de problemas
- Permissões importam - 600 para chaves, 644 para certs
- Cadeia de confiança crítica - CA ou intermediário faltando
- Versão RHEL importa - Erros diferentes por versão
- crypto-policies afetam tudo (RHEL 8+)
- SELinux pode bloquear - Verificar contextos
- 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
| ← Anterior: Capítulo 27 - Metodologia de Solução de Problemas de Certificados RHEL | Próximo: Capítulo 29 - Solução de Problemas Específica por Serviço → |
|---|
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
| Erro | Causa | Solução |
|---|---|---|
| “SSLCertificateFile: file does not exist” | Caminho errado | Corrigir caminho em ssl.conf |
| “key values mismatch” | Cert/chave não pareiam | Regenerar com chave correta |
| “unable to load certificate” | Problema formato arquivo | Garantir formato PEM |
| “Syntax error” em ssl.conf | Erro de digitação config | Executar apachectl configtest |
| “unable to verify certificate” | Problema cadeia | Adicionar 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
| Erro | Causa | Solução |
|---|---|---|
| “SSL: error:0200100D” | Permissão negada na chave | chmod 600 na chave |
| “no "ssl" is defined” | Faltando ssl em listen | Adicionar listen 443 ssl; |
| “cannot load certificate” | Arquivo não encontrado | Verificar caminho |
| “PEM_read_bio:no start line” | Formato errado | Garantir formato PEM |
| “nginx: [emerg] bind() failed” | Porta em uso | Verificar 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
| Erro | Causa | Solução |
|---|---|---|
| “SSL_accept error” | Problema cert/chave | Verificar par cert/chave |
| “TLS is required but not available” | TLS não habilitado | Definir security_level = may |
| “no shared cipher” | Desajuste cipher | Verificar crypto-policy |
| “certificate verify failed” | Problema cadeia | Instalar intermediário |
| “Permission denied” | Permissões chave | chmod 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
| Erro | Causa | Solução |
|---|---|---|
| “TLS: can’t accept” | Chave não legível | chown ldap:ldap na chave |
| “TLS: hostname does not match” | Desajuste CN/SAN | Reemitir com hostname correto |
| “certificate verify failed” | CA não confiável | Adicionar CA ao repositório de confiança |
| “Permission denied” | Propriedade errada | chown ldap:ldap |
| “TLS engine not initialized” | TLS não configurado | Adicionar 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
| Erro | Causa | Solução |
|---|---|---|
| “could not load server certificate” | Permissão negada | chown postgres:postgres, chmod 600 |
| “private key file has wrong permissions” | Muito permissivo | chmod 600 na chave |
| “SSL connection has been closed unexpectedly” | Problema confiança | Verificar confiança CA do cliente |
| “SSL is not enabled” | SSL desligado na config | Definir 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
- Cada serviço tem requisitos únicos - Propriedade, localização, formato
- Sempre verificar logs específicos do serviço primeiro
- Testar com comandos específicos do serviço (não apenas openssl)
- Permissões críticas - Usuários diferentes para serviços diferentes
- Localizações de arquivo importam - Caminhos dependentes do serviço
- Sintaxe de configuração varia por serviço
- 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
| ← Anterior: Capítulo 28 - Erros Comuns de Certificados no RHEL | Próximo: Capítulo 30 - Solução de Problemas do certmonger → |
|---|
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
| Status | Significado | Ação Requerida |
|---|---|---|
MONITORING | ✅ Tudo bem - cert emitido, rastreando expiração | Nenhuma |
SUBMITTING | 🔄 Solicitando cert da CA | Aguardar (usualmente segundos) |
CA_UNREACHABLE | ❌ Não consegue contatar servidor CA | Corrigir conectividade |
CA_REJECTED | ❌ CA recusou requisição | Corrigir principal/permissões |
NEED_KEY_GEN_PIN | ⏸️ Aguardando PIN (HSM) | Fornecer PIN |
NEED_GUIDANCE | ⚠️ Necessita intervenção manual | Verificar detalhes requisição |
PRE_SAVE_COMMAND | 🔄 Executando script pre-save | Aguardar |
POST_SAVE_COMMAND | 🔄 Executando script post-save | Aguardar |
NEWLY_ADDED | 🆕 Recém adicionado, ainda não processado | Aguardar |
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
- CA_UNREACHABLE é problema mais comum - Verificar conectividade IPA
- CA_REJECTED significa problema principal - Criar principal de serviço
- Status MONITORING significa que está tudo bem
- Comandos post-save críticos - Testá-los independentemente
- Logs certmonger no journal - Usar
journalctl -u certmonger - Retentar com resubmit - Frequentemente corrige problemas transitórios
- 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
| ← Anterior: Capítulo 29 - Solução de Problemas Específica por Serviço | Próximo: Capítulo 31 - Solução de Problemas Crypto-Policy → |
|---|
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
- Crypto-policies são apenas RHEL 8+ (não RHEL 7)
- Serviços DEVEM reiniciar após mudança política
- Mudanças política são system-wide - Afetam tudo
- DEFAULT é recomendado para maioria ambientes
- LEGACY deve ser temporária apenas
- Testar antes de implantar novas políticas
- 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
| ← Anterior: Capítulo 30 - Solução de Problemas do certmonger | Próximo: Capítulo 32 - Análise de Relatórios SOS → |
|---|
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
- Relatórios SOS são inestimáveis para solução de problemas remota
- Sem chaves privadas incluídas (segurança!)
- Informações certificado SÃO incluídas (certs públicos, config, logs)
- Status certmonger preservado na saída getcert_list
- Crypto-policy registrada (RHEL 8+)
- Usar para análise pós-incidente e auditorias
- 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
| ← Anterior: Capítulo 31 - Solução de Problemas Crypto-Policy | Próximo: Capítulo 33 - Procedimentos de Emergência → |
|---|
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:
-
Avaliar (30 segundos)
openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates -
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> -
Comunicar (5 minutos)
- Notificar stakeholders
- Atualizar página de status
-
Correção Apropriada (15-60 minutos)
# Solicitar novo cert da CA # OU usar certmonger ipa-getcert resubmit -f /etc/pki/tls/certs/server.crt -
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:
-
Parar sangria - Rollback
./emergency-rollback.sh -
Verificar serviço restaurado
-
Identificar certificado correto
-
Implantar cert correto com validação
-
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:
-
Verificar timeline de expiração do cert
openssl x509 -in cert.crt -noout -checkend $((86400*7)) -
Se > 7 dias: Aguardar recuperação da CA, monitorar
-
Se < 7 dias:
- Gerar autoassinado temporário
- Contatar suporte CA
- Escalonar para gerência
-
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:
-
Verificar negações
ausearch -m avc -ts recent | grep cert -
Correção rápida - Relabeling
restorecon -Rv /etc/pki/tls/ -
Se persistir - Permissive temporário
setenforce 0 # TEMPORÁRIO! systemctl restart <serviço> -
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
- Velocidade sobre perfeição em emergências
- Correções temporárias são OK - Corrigir apropriadamente depois
- Comunicação é crítica - Manter stakeholders informados
- Documentar tudo - Para post-mortem
- Praticar procedimentos emergência - Não esperar incidente real
- Ter backups prontos - Testá-los regularmente
- Conhecer sua rota de escalação - Quando pedir ajuda
- 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
| ← Anterior: Capítulo 32 - Análise de Relatórios SOS | Próximo: Capítulo 34 - Planejamento e Preparação de Migração RHEL → |
|---|
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
- Planejar com antecedência - Começar 6-8 semanas antes migração
- Auditar completamente - Conhecer cada certificado
- Corrigir problemas cedo - Não aguardar até dia migração
- Testar extensivamente - Múltiplas execuções teste
- Backup de tudo - Certificados, configs, BD certmonger
- Documentar claramente - Runbook, rollback, problemas
- 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
| Recurso | RHEL 7 | RHEL 8 | Impacto |
|---|---|---|---|
| OpenSSL | 1.0.2k | 1.1.1k | Moderado |
| Versões TLS | 1.0/1.1/1.2 | 1.2/1.3 (DEFAULT) | ALTO |
| Crypto-Policies | Nenhuma | NOVA! | ALTO |
| Cifras Padrão | Mistas | Mais Rigorosas | Moderado |
| certmonger | Básico | Aprimorado | Baixo |
| Gerenciamento | Manual | Automatizado (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
- Usar utilitário leapp para migração RHEL 7→8 (método suportado)
- crypto-policies são NOVAS no RHEL 8 - Mudança principal!
- TLS 1.0/1.1 desabilitados por padrão - Testar compatibilidade cliente
- Remover configs TLS manuais - Deixar crypto-policy gerenciar
- Testar extensivamente antes migração produção
- Política LEGACY disponível para compatibilidade (temporária!)
- 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
| ← Anterior: Capítulo 34 - Planejamento e Preparação de Migração RHEL | Próximo: Capítulo 36 - Migração RHEL 8→9 → |
|---|
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
| Recurso | RHEL 8 | RHEL 9 | Impacto |
|---|---|---|---|
| OpenSSL | 1.1.1k | 3.5.5 | ALTO |
| Arquitetura | Tradicional | Baseada Provider | ALTO |
| TLS 1.0/1.1 | Política LEGACY | Completamente removido | ALTO |
| SHA-1 | Depreciado | Bloqueado | ALTO |
| Validação | Padrão | Mais Rigorosa | Moderado |
| Crypto-Policies | Básica | Subpolíticas | Baixo |
| certmonger | Aprimorado | Suporte ACME | Baixo |
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
- OpenSSL 3.x é mudança principal - Arquitetura provider é nova
- SHA-1 DEVE ser eliminado antes migração - Sem exceções!
- Usar leapp para migração (oficialmente suportado)
- Testar aplicações customizadas no RHEL 9 primeiro
- Validação mais rigorosa captura mais problemas (bom para segurança!)
- certmonger ganha suporte ACME no RHEL 9
- 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
| ← Anterior: Capítulo 35 - Migração RHEL 7→8 | Próximo: Capítulo 37 - Solução de Problemas e Recuperação de Migração → |
|---|
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
| Problema | Sintomas | Causa | Correção Rápida |
|---|---|---|---|
| 1. Serviços não iniciam | systemctl status falha | Sintaxe config mudou | Restaurar config, atualizar sintaxe |
| 2. Rejeição SHA-1 (RHEL 9) | “ca md too weak” | Assinatura SHA-1 | Reemitir certificado |
| 3. Desajuste versão TLS | Clientes não conectam | TLS 1.0/1.1 bloqueados | Política LEGACY (temp) |
| 4. Problemas crypto-policy | Vários erros | Novo sistema política | Entender e configurar |
| 5. certmonger perdeu rastreamento | getcert list vazio | Corrupção BD | Restaurar de backup |
| 6. CAs faltando | Cert verify failed | Repositório de confiança resetado | Re-adicionar CAs |
| 7. Mudanças permissão | Permission denied | Propriedade mudou | Corrigir permissões |
| 8. Negações SELinux | Serviço bloqueado | Contexto mudou | Relabeling arquivos |
| 9. Erros provider (RHEL 9) | Algoritmo unsupported | Mudança OpenSSL 3.x | Usar -provider legacy |
| 10. Degradação desempenho | Conexões lentas | Crypto mais rigoroso | Esperado, 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
- Ter plano rollback pronto antes migração
- Maioria problemas são corrigíveis sem rollback
- Mudanças Crypto-policy causam maioria problemas compatibilidade
- Rejeição SHA-1 é inegociável no RHEL 9
- Testar, testar, testar antes migração produção
- Documentar tudo durante a solução de problemas
- 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 RHEL | Estado FIPS | Padrão | Notas |
|---|---|---|---|
| RHEL 7 | Validado | FIPS 140-2 | Módulos OpenSSL 1.0.2 validados |
| RHEL 8 | Validado | FIPS 140-2 | OpenSSL 1.1.1, NSS, libgcrypt validados |
| RHEL 9 | Validado | FIPS 140-2 | Provider OpenSSL 3.x, transição para 140-3 em progresso |
| RHEL 10 | Em processo | FIPS 140-2/140-3 | Transiçã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
- FIPS 140-2 é padrão atual no RHEL (transição 140-3 em progresso)
- Habilitar na instalação para estado FIPS mais limpo
- Habilitação pós-instalação requer reboot
- Apenas algoritmos aprovados FIPS permitidos
- Crypto-policy automaticamente definida para FIPS
- Serviços automaticamente cumprem
- 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
| ← Anterior: Capítulo 37 - Solução de Problemas e Recuperação de Migração | Próximo: Capítulo 39 - Certificados Conformes FIPS → |
|---|
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
- FIPS 140-2 é padrão atual validado no RHEL
- Transição FIPS 140-3 está em progresso
- Habilitar na instalação para melhores resultados
- Apenas RSA 2048+ ou ECC P-256/384
- Assinaturas SHA-256+ requeridas
- Serviços automaticamente cumprem com política FIPS
- 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
| ← Anterior: Capítulo 38 - Guia Completo do Modo FIPS | Próximo: Capítulo 40 - Fortalecimento de Segurança de Certificados no RHEL → |
|---|
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:
- Permissões Arquivo - Proteger chaves privadas
- SELinux - Controle acesso obrigatório
- Firewall - Limitar exposição
- Auditoria - Rastrear acesso
- TPM - Proteção chave hardware
- Smart Cards - Tokens físicos
- Monitoramento - Detectar problemas
- 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
- Defesa em profundidade - Múltiplas camadas segurança
- SELinux enforcing - Obrigatório para produção
- Permissões arquivo críticas - 400/600 para chaves
- Auditar tudo - Rastrear acesso chave
- TPM para alta segurança - Proteção hardware
- OpenSCAP para conformidade - Scanning automatizado
- 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
| ← Anterior: Capítulo 39 - Certificados Conformes FIPS | Próximo: Capítulo 41 - Conformidade e Auditoria → |
|---|
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
| Framework | Foco | Requisitos Certificado |
|---|---|---|
| STIG | Segurança DoD | FIPS, algoritmos fortes, auditoria |
| CIS Benchmark | Melhores práticas indústria | TLS 1.2+, cifras fortes, permissões |
| PCI-DSS | Indústria cartão pagamento | Crypto forte, sem TLS/cifras fracas |
| HIPAA | Healthcare | Criptografia, controle acesso, auditoria |
| NIST 800-53 | Sistemas federais | FIPS, 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
- Conformidade é contínua - Não única vez
- Múltiplos frameworks existem - STIG, CIS, PCI, HIPAA
- OpenSCAP automatiza scanning no RHEL
- Documentar tudo - Requerido para auditorias
- Auditorias regulares essenciais - Trimestral mínimo
- Remediação deve ser rastreada - Corrigir e verificar
- 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:
-
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
-
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)
-
Seus Serviços (3-4 horas)
- Cap 14-21: escolher capítulos para os serviços que você usa
-
Automatização (2-3 horas)
- Cap 22: certmonger
- Cap 23: Crypto-policies (se RHEL 8+)
-
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:
-
Começar Aqui (1 hora)
- Cap 27: Metodologia de Solução de Problemas de Certificados RHEL ⭐
- Início Rápido de Solução de Problemas
-
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
-
Ferramentas (1 hora)
- Cap 3: Ferramentas RHEL
- Cap 32: Relatórios SOS
-
Emergência (30 min)
- Cap 33: Procedimentos de Emergência
-
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:
-
Visão Geral (1 hora)
- Cap 1-2: Fundamentos e introdução
-
CA Empresarial (2 horas)
- Cap 19: Serviços de Certificados do FreeIPA
-
Automatização (3 horas)
- Cap 22: certmonger
- Cap 23: Crypto-policies
- Cap 25: Automatização Ansible para Certificados
-
Melhores Práticas (2 horas)
- Cap 21: Melhores Práticas de Certificados de Serviço
- Cap 26: Monitoramento e Alertas no RHEL
-
Segurança (3 horas)
- Cap 38-41: FIPS, fortalecimento, conformidade
-
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:
-
Fundação (1 hora)
- Cap 1: Criptografia e Fundamentos de PKI
- Cap 2: Introdução a Certificados no RHEL
-
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 ⭐
-
Crypto-Policies (1 hora)
- Cap 23: entendendo controles em todo o sistema
-
Monitoramento (1 hora)
- Cap 26: Monitoramento e Alertas no RHEL
-
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
| Caminho | Tempo | Capítulos |
|---|---|---|
| Início Rápido | 3-5 horas | 1, 3, 27 |
| Solução de Problemas | 5-8 horas | 27-33 |
| Iniciante Completo | 40-50 horas | Todos em ordem |
| Administrador de sistemas | 10-15 horas | Capítulos selecionados |
| Engenheiro de Suporte | 5-8 horas | Foco em solução de problemas |
| Conformidade | 8-10 horas | Capítulos de segurança |
💡 Dicas de Estudo
- Prática é essencial — praticar em uma VM RHEL
- Seguir exemplos — copiar, colar e entender
- Usar referências rápidas — no final de cada capítulo
- Marcar solução de problemas — Capítulos 27-33
- Conhecer sua versão do RHEL — focar nos capítulos relevantes
- 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 Problema | Ir para o Capítulo |
|---|---|
| Solução de problemas geral | Capítulo 27 |
| Erros comuns | Capítulo 28 |
| Problemas Apache/NGINX/Postfix | Capítulo 29 |
| Problemas do certmonger | Capítulo 30 |
| Problemas de crypto-policy | Capítulo 31 |
| Análise de relatórios SOS | Capítulo 32 |
| Emergência em produção | Capítulo 33 |
| Específico para RHEL 7 | Capítulo 9 |
| Específico para RHEL 8 | Capítulo 10 |
| Específico para RHEL 9 | Capítulo 11 |
| Específico para RHEL 10 | Capítulo 12 |
| Após migração | Capí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:
- Certificado expirado → Renovar
- CA faltando → Adicionar ao repositório de confiança
- Permissões erradas → chmod 600
- Desajuste cert/chave → Regenerar CSR
- Desajuste de hostname → Reemitir com SANs
- Versão TLS → Verificar crypto-policy
- SELinux negando → restorecon
- 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
| RHEL | Lançado | OpenSSL | Suporte TLS | Crypto-Policies | Recurso Principal |
|---|---|---|---|---|---|
| 7 | 2014 | 1.0.2k-26 | 1.0/1.1/1.2 | ❌ Não | Configuração manual |
| 8 | 2019 | 1.1.1k-14 | 1.2/1.3 | ✅ NOVO! | Políticas em todo o sistema |
| 9 | 2022 | 3.5.5-2 | 1.2/1.3 | ✅ Aprimorado | OpenSSL 3.x, rigoroso |
| 10 | 2025 | 3.5.5-2 | 1.3 pref | ✅ Aprimorado | Preparaçã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
| Tarefa | RHEL 7 | RHEL 8/9/10 |
|---|---|---|
| Gerar Chave | openssl genrsa -out key 2048 | openssl genpkey -algorithm RSA -out key |
| Verificar Política | N/A | update-crypto-policies --show |
| Config TLS | Manual por serviço | Automática via crypto-policies |
| certmonger | Básico | Aprimorado (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 legacypara 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ção | Impacto em Certificados | Mudanças Principais |
|---|---|---|
| 7→8 | Moderado-Alto | crypto-policies, TLS 1.0/1.1 bloqueados |
| 8→9 | Alto | OpenSSL 3.x, SHA-1 bloqueado, mais rigoroso |
| 9→10 | Baixo | Mesmo 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ão | Propósito |
|---|---|
| SAN: URI:spiffe:// | ID de Carga Trabalho |
| Key Usage: digitalSignature | AuthN |
| EKU: clientAuth, serverAuth | TLS Mútuo |
| Validity ≤ 24h | Limitar raio de explosão |
4. Pontos de Aplicação de Política
- Gateways terminam TLS e verificam certs de cliente.
- Service Mesh sidecars realizam mTLS transparentemente.
- 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
| Documento | Audiência | Conteúdo |
|---|---|---|
| CP | Partes confiantes | Que garantia a PKI fornece |
| CPS | Auditores, operadores | Como 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
- Dispositivo gera par chaves dentro ATECC608.
- CSR criado usando chave on-chip.
- 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ática | Justificativa |
|---|---|
| Usar ECC (P-256, P-384) | Chaves menores, menor consumo energia |
| Hardware Root of Trust | TPM, ATECC ou TrustZone previnem extração chave |
| Validade Certificado ≤ 1 ano | Limitar raio explosão de compromisso |
| Revogação via OCSP/CRL | Desabilitar dispositivos comprometidos remotamente |
| PKI Separada para IoT | Isolar 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
| VPN | Suporte Certificado | Gerenciamento Chave | Caso de Uso |
|---|---|---|---|
| OpenVPN | PKI X.509 completa | Easy-RSA, manual | Site-to-site empresarial e acesso remoto |
| WireGuard | Chaves públicas (sem X.509 por padrão) | Pares chave simples | Moderno, alto desempenho, IoT |
| IPsec (strongSwan) | PKI X.509 completa | Ferramentas ipsec pki | Conforme padrões, interop com Cisco/Juniper |
6. Melhores Práticas
- CA Separada para VPN – Isolar certs VPN de certs TLS web.
- Validade Curta – Emitir certs cliente VPN com expiração 30-90 dias.
- CRL/OCSP – Habilitar verificação revogação no servidor.
- 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:
- O que o Secure Boot realmente faz.
- Onde certificados e chaves são usados na cadeia de inicialização.
- 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ção | Finalidade |
|---|---|
| Variáveis de firmware UEFI | Armazenam âncoras de confiança da plataforma e revogações |
shim | Carrega confiança embarcada do fornecedor para verificação do próximo estágio |
| Keyrings do kernel | Mantêm chaves confiáveis usadas para autenticar módulos e artefatos relacionados |
| Lista MOK | Adiciona confiança controlada pelo proprietário sem reescrever bancos de dados de firmware |
| Blocos de assinatura em binários EFI | Provam 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 Dados | Significado | Função Típica |
|---|---|---|
PK | Platform Key | Proprietário de nível superior da política de Secure Boot da plataforma |
KEK | Key Exchange Key database | Autoriza atualizações nos bancos de dados de assinaturas permitidas e revogadas |
db | Assinaturas / certificados permitidos | Lista de confiança para executáveis e drivers EFI |
dbx | Assinaturas / certificados / hashes proibidos | Lista de revogação usada para bloquear binários ou certificados reconhecidamente problemáticos |
Esses são conceitualmente simples, mas administradores rotineiramente os confundem:
PKcontrola a autoridade do Secure Boot da plataforma.KEKcontrola atualizações na lista de permissões e na lista de negações.dbdefine o que é permitido inicializar.dbxdefine 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:
- O firmware valida o carregador de inicialização EFI de primeiro estágio contra chaves confiáveis nos bancos de dados de firmware.
- O carregador de primeiro estágio é tipicamente o
shim. - O
shimcarrega uma âncora de confiança embarcada da Red Hat usada para autenticar o próximo estágio. - O
shimvalida o binário EFI do GRUB do RHEL. - 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). - 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
shimconté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:
- Desabilitar o Secure Boot sempre que precisar de código personalizado.
- 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
shime oMokManagergerenciam 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:
| Keyring | Função |
|---|---|
.builtin_trusted_keys | Chaves confiáveis embutidas no kernel ou carregadas como parte do caminho de inicialização confiável |
.platform | Confiança derivada da plataforma, incluindo chaves provenientes de bancos de dados do Secure Boot e MOK |
.blacklist | Chaves 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_keyse.platform - entradas revogadas da blacklist são excluídas da verificação
- chaves MOK são propagadas para
.platformem 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:
| Recurso | Função Principal |
|---|---|
| Secure Boot | Bloqueia execução de código não autorizado no caminho de inicialização |
| Measured Boot | Registra medições de inicialização em PCRs do TPM |
| TPM | Armazena segredos protegidos e medições; pode selar dados ao estado de inicialização |
| IMA appraisal | Estende 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
kexecnã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:
- O firmware confia em chaves no
dbe rejeita chaves ou hashes nodbx. - O firmware autoriza o
shim. - O
shimautoriza os componentes de inicialização de próximo estágio da Red Hat e também suporta operações MOK. - O MOK permite adicionar certificados públicos controlados pelo proprietário.
- O kernel confia em chaves embutidas e derivadas da plataforma/MOK para verificação de módulos.
- 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:dbshimembarcadoUEFI: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:
| Ferramenta | Finalidade |
|---|---|
pesign | Assinar e inspecionar binários EFI e kernels |
efikeygen | Gerar um par de chaves X.509 orientado a Secure Boot no banco de dados do pesign |
mokutil | Registrar e inspecionar Machine Owner Keys e o estado do Secure Boot |
keyctl | Inspecionar keyrings do kernel |
sign-file | Anexar assinaturas a módulos de kernel Linux |
certutil / pk12util | Exportar chaves e certificados do banco de dados NSS usado pelo pesign |
openssl | Extrair 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:
- O
shimdetecta o registro pendente. - O
MokManager.efiinicia. - Você escolhe
Enroll MOK. - Você insere a senha definida durante o
mokutil --import. - 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
shimembarcado - Chaves registradas pelo proprietário provenientes do
MokListRT - Revogações refletidas em
.blacklist
Isso fornece três fontes de confiança diferentes em jogo:
- Confiança do firmware
- Confiança embarcada do fornecedor
- 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
- Atualizar o
shimem 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. - 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áriosshimassinados apenas com a chave de 2023 não serão aceitos. - Estar ciente do impacto no TPM: atualizações no UEFI
dbalterarã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 nodb. 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. - 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
shimassinados 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:
shimcomo 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.blacklistefikeygenpesign- 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
| Sintoma | Causa Provável |
|---|---|
| Módulo não carrega | Módulo não assinado ou assinante não confiável |
| Módulo mostra assinante mas ainda falha | Chave 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ível | Registro não completado no MokManager após reinicialização |
| Binário EFI falha ao inicializar | Assinatura confiável ausente, fluxo de trabalho de substituição incorreto ou certificado/hash revogado |
| Comportamento mudou após atualização de firmware | Alteraçõ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 chave | Mediçõ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:
integrityMokListRTEFI: Loaded certLockdownmodule 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
- Secure Boot é fácil até você precisar de código personalizado.
- Código personalizado é fácil até você precisar de operações de assinatura duráveis.
- 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
shimvs 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
- Secure Boot é uma cadeia de autorização baseada em certificados para código de inicialização e espaço do kernel.
- No RHEL, o
shimé a ponte entre a confiança do firmware e a confiança controlada pela Red Hat. - O MOK é o mecanismo crítico para adicionar confiança controlada pelo proprietário sem reescrever bancos de dados de firmware.
- O carregamento de módulos de kernel depende de keyrings confiáveis, não do pacote de CAs do espaço de usuário.
- A revogação importa tanto quanto a confiança;
dbxe.blacklistpodem quebrar artefatos que “funcionavam anteriormente.” - 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
-
RFC 5280 — Internet X.509 Public Key Infrastructure Certificate and CRL Profile https://datatracker.ietf.org/doc/html/rfc5280
-
RFC 6960 — Online Certificate Status Protocol (OCSP) https://datatracker.ietf.org/doc/html/rfc6960
-
RFC 6962 — Certificate Transparency https://datatracker.ietf.org/doc/html/rfc6962
-
RFC 8555 — Automatic Certificate Management Environment (ACME) https://datatracker.ietf.org/doc/html/rfc8555
-
RFC 7030 — Enrollment over Secure Transport (EST) https://datatracker.ietf.org/doc/html/rfc7030
TLS/SSL
-
RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3 https://datatracker.ietf.org/doc/html/rfc8446
-
RFC 6125 — Representation and Verification of Domain-Based Application Service Identity https://datatracker.ietf.org/doc/html/rfc6125
Algoritmos Criptográficos
-
RFC 3447 — RSA Cryptography Specifications (PKCS #1 v2.1) https://datatracker.ietf.org/doc/html/rfc3447
-
RFC 6090 — Fundamental Elliptic Curve Cryptography Algorithms https://datatracker.ietf.org/doc/html/rfc6090
-
FIPS 186-5 — Digital Signature Standard (DSS) https://csrc.nist.gov/publications/detail/fips/186/5/final
Diretrizes Indústria
CA/Browser Forum
-
Baseline Requirements for TLS Certificates https://cabforum.org/baseline-requirements-documents/
-
EV SSL Certificate Guidelines https://cabforum.org/extended-validation/
Publicações NIST
-
SP 800-57 — Recommendation for Key Management https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final
-
SP 800-207 — Zero Trust Architecture https://csrc.nist.gov/publications/detail/sp/800-207/final
-
SP 800-52 Rev. 2 — Guidelines for TLS Implementations https://csrc.nist.gov/publications/detail/sp/800-52/rev-2/final
Padrões ETSI
- ETSI EN 319 411-1 — Policy and security requirements for Trust Service Providers issuing certificates https://www.etsi.org/standards
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
-
Documentação OpenSSL https://www.openssl.org/docs/
-
Documentação Let’s Encrypt https://letsencrypt.org/docs/
-
Documentação cert-manager https://cert-manager.io/docs/
-
HashiCorp Vault PKI Secrets Engine https://www.vaultproject.io/docs/secrets/pki
-
Documentação FreeIPA https://www.freeipa.org/page/Documentation
Ferramentas Teste
-
SSL Labs Server Test https://www.ssllabs.com/ssltest/ Testar configuração servidor HTTPS e cadeia certificado
-
testssl.sh https://testssl.sh/ Ferramenta teste TLS/SSL linha comando
-
crt.sh — Certificate Search https://crt.sh/ Consultar logs Certificate Transparency
-
Hardenize https://www.hardenize.com/ Scanner TLS/PKI abrangente
Tutoriais e Blogs
-
Cloudflare Learning Center — SSL/TLS https://www.cloudflare.com/learning/ssl/
-
Mozilla SSL Configuration Generator https://ssl-config.mozilla.org/ Gerar configs TLS seguras para servidores comuns
-
PKI Solutions Blog https://pkisolutions.com/blog/ Insights PKI empresarial
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
- OpenSSL — https://www.openssl.org/
- FreeIPA — https://www.freeipa.org/
- EJBCA — https://www.ejbca.org/
- step-ca — https://smallstep.com/docs/step-ca
- HashiCorp Vault — https://www.vaultproject.io/
Gerenciamento Certificado
- cert-manager (Kubernetes) — https://cert-manager.io/
- Certbot (cliente ACME) — https://certbot.eff.org/
- certmonger (RHEL) — https://pagure.io/certmonger
- Venafi (Empresarial) — https://www.venafi.com/
Bibliotecas
- BouncyCastle (Java/C#) — https://www.bouncycastle.org/
- cryptography (Python) — https://cryptography.io/
- Go crypto/x509 — https://pkg.go.dev/crypto/x509
Comunidades e Fóruns
-
Fórum Comunidade Let’s Encrypt https://community.letsencrypt.org/
-
r/crypto (Reddit) https://www.reddit.com/r/crypto/
-
r/netsec (Reddit) https://www.reddit.com/r/netsec/
-
Grupo Trabalho TLS IETF https://datatracker.ietf.org/wg/tls/about/
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
-
PCI DSS — Payment Card Industry Data Security Standard https://www.pcisecuritystandards.org/
-
HIPAA — Health Insurance Portability and Accountability Act https://www.hhs.gov/hipaa/
-
SOC 2 — Service Organization Control 2 https://www.aicpa.org/
-
eIDAS — Serviços de identificação e confiança eletrônica da União Européia https://digital-strategy.ec.europa.eu/en/policies/eidas-regulation
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.