Em 2004, criei uma pequena autoridade de certificação usando OpenSSL no Linux e os scripts de gerenciamento simples fornecidos com o OpenVPN. De acordo com os guias que encontrei na época, defini o período de validade do certificado CA raiz para 10 anos. Desde então, assinei muitos certificados para túneis OpenVPN, sites e servidores de e-mail, todos com validade de 10 anos (isso pode estar errado, mas eu não sabia melhor na época).
Encontrei muitos guias sobre como configurar uma CA, mas apenas muito pouca informação sobre seu gerenciamento e, em particular, sobre o que deve ser feito quando o certificado de CA raiz expirar, o que acontecerá em algum momento de 2014. Portanto, tenho o seguinte perguntas:
- Os certificados cujo período de validade se estende após a expiração do certificado da CA raiz se tornarão inválidos assim que este expirar ou continuarão válidos (porque foram assinados durante o período de validade do certificado da CA)?
- Quais operações são necessárias para renovar o certificado de CA raiz e garantir uma transição suave ao longo de sua expiração?
- Posso, de alguma forma, assinar novamente o certificado CA raiz atual com um período de validade diferente e carregar o certificado recém-assinado para os clientes para que os certificados do cliente permaneçam válidos?
- Ou preciso substituir todos os certificados de cliente por novos assinados por um novo certificado de CA raiz?
- Quando o certificado CA raiz deve ser renovado? Perto do vencimento ou um tempo razoável antes do vencimento?
- Se a renovação do certificado de CA raiz se tornar um trabalho importante, o que posso fazer melhor agora para garantir uma transição mais suave na próxima renovação (exceto definir o período de validade para 100 anos, é claro)?
A situação é um pouco mais complicada pelo fato de que meu único acesso a alguns dos clientes é através de um túnel OpenVPN que usa um certificado assinado pelo certificado CA atual, então se eu tiver que substituir todos os certificados do cliente, precisarei copiar os novos arquivos para o cliente, reinicie o túnel, cruze os dedos e torça para que apareça depois.
Manter a mesma chave privada em sua CA raiz permite que todos os certificados continuem a ser validados com sucesso em relação à nova raiz; tudo o que é exigido de você é confiar na nova raiz.
A relação de assinatura do certificado é baseada em uma assinatura da chave privada; manter a mesma chave privada (e, implicitamente, a mesma chave pública) enquanto gera um novo certificado público, com um novo período de validade e quaisquer outros novos atributos alterados conforme necessário, mantém a relação de confiança em vigor. As CRLs também podem continuar do certificado antigo para o novo, pois são, como certificados, assinados pela chave privada.
Então, vamos verificar!
Faça uma CA raiz:
Gere um certificado filho a partir dele:
Assine o certificado filho:
Tudo pronto lá, relação de certificado normal. Vamos verificar a confiança:
Ok, então, agora vamos dizer que 10 anos se passaram. Vamos gerar um novo certificado público a partir da mesma chave privada raiz.
E.. funcionou?
Mas por que? São arquivos diferentes, certo?
Sim, mas isso não significa que a nova chave pública não corresponda criptograficamente à assinatura do certificado. Números de série diferentes, mesmo módulo:
Vamos um pouco mais longe para verificar se está funcionando na validação de certificados do mundo real.
Inicie uma instância do Apache e vamos tentar (estrutura de arquivos debian, ajuste conforme necessário):
Vamos definir essas diretivas em uma
VirtualHost
escuta em 443 - lembre-se, onewroot.pem
certificado raiz nem existia quandocert.pem
foi gerado e assinado.Vamos verificar como o openssl o vê:
Ok, e que tal um navegador usando a API de criptografia da MS? Tem que confiar na raiz, primeiro, depois está tudo bem, com o número de série da nova raiz:
E ainda devemos estar trabalhando com a raiz antiga também. Mude a configuração do Apache:
Faça uma reinicialização completa no Apache, um recarregamento não alternará os certificados corretamente.
E, com o navegador da API de criptografia MS, o Apache está apresentando a raiz antiga, mas a nova raiz ainda está no armazenamento raiz confiável do computador. Ele o encontrará automaticamente e validará o certificado em relação à raiz confiável (nova), apesar do Apache apresentar uma cadeia diferente (a raiz antiga). Depois de remover a nova raiz das raízes confiáveis e adicionar o certificado raiz original, tudo está bem:
Então é isso! Mantenha a mesma chave privada ao renovar, troque a nova raiz confiável e praticamente tudo funciona . Boa sorte!
Percebi que as extensões de CA podem estar faltando no certificado renovado da chave de CA original. Isso funcionou mais apropriadamente para mim (cria um
./renewedselfsignedca.conf
onde as extensões de CA v3 são definidasca.key
eca.crt
são consideradas a chave e o certificado originais da CA):Modo básico para estender o período válido de root (você precisa do X.509 público e da chave privada associada):
Gere o CSR do X.509 público e da chave privada:
Assine novamente o CSR com a chave privada:
@Bianconiglio plus
-set_serial
funcionou para mim. Meu servidor é apenas intranet, então não estou me preocupando muito com os efeitos colaterais e agora tenho tempo para trabalhar em uma solução "adequada".Eu usei o seguinte script configurável. Basta definir as variáveis
CACRT
,CAKEY
eNEWCA
.Quando seu certificado raiz expira, os certificados que você assinou com ele também expiram. Você terá que gerar um novo certificado raiz e assinar novos certificados com ele. Se você não quiser repetir o processo a cada poucos anos, a única opção real é estender a data de validade do certificado raiz algo como dez ou vinte anos: A raiz que gerei para meu próprio uso, estabeleci vinte anos.
Você não pode "renovar" um certificado raiz. Tudo o que você pode fazer é gerar um novo.
Gere uma nova raiz pelo menos um ou dois anos antes que a antiga expire, para que você tenha tempo de mudar sem estar contra uma parede do tempo se algo der errado. Dessa forma, você sempre pode voltar temporariamente para os certificados antigos até resolver seus problemas iniciais com o novo.
No que diz respeito aos túneis VPN, eu configuraria alguns servidores de teste para experimentar, para que você entenda exatamente o que precisa fazer antes de fazer isso com a máquina de um cliente.
Tivemos o mesmo problema, e isso foi no nosso caso porque o servidor Debian estava desatualizado e o openSSL teve esse problema:
https://en.wikipedia.org/wiki/Year_2038_problem
A última versão do OpenSSL disponível para o Debian 6 traz esse problema. Todos os certificados criados após 23.01.2018 produzem um Vality: for 1901 year !
A solução é atualizar o OpenSSL. Você pode criar novamente os arquivos de configuração (com os certificados) para os clientes.
A resposta https://serverfault.com/a/308100/971795 parece sugerir que não é necessário renovar a chave privada - apenas renovar o certificado de chave pública é suficiente. No entanto, é uma prática recomendada alternar a chave privada da CA raiz de vez em quando.
O procedimento é "substituir" a CA antiga por uma nova (não apenas o certificado de chave pública, mas toda a CA),
Observe que a etapa 2, 3 garante a transição suave da antiga para a nova CA.
Para obter mais detalhes, consulte https://docs.aws.amazon.com/acm-pca/latest/userguide/ca-lifecycle.html#ca-succession