Eu tenho dispositivos embarcados que estão localizados em diferentes cidades e conectados ao meu servidor OpenVPN. Eu inicializo meus dispositivos antes de implantá-los e coloco o certificado / par de chaves na rede local. Quando os dispositivos ficam online no site remoto, eles são conectados ao meu servidor openVPN através de um túnel privado. Estou usando a versão OpenVPN: 2.3.10 com EasyRSA no Ubuntu 16.04 LTS

Agora os certificados estão prestes a expirar. Como posso renovar os certificados nesses dispositivos? Estou pensando em duas abordagens.

Abordagem 1) Um script no dispositivo que verifica a validade do certificado a cada mês ou mais e quando o certificado está prestes a expirar, deve enviar uma solicitação de geração de certificado (uma solicitação padrão de obtenção de https ou similar). No lado do servidor, somente solicitações provenientes de um túnel privado devem ser atendidas. Um certificado / chave com o mesmo CN deve ser gerado e transferido para o cliente.

Problemas com a abordagem 1)

  • Como o par certificado / chave deve ser transferido de forma segura? Eu não quero trocar a chave privada dos clientes via rede. Todo o processo deve ser automatizado para que eu também não possa colocar a chave manualmente.
  • Como deve a chave cert / gerada no servidor? Eu também não quero o usuário da web apache, ou seja, www-data para ter acesso à minha pasta easyRSA.

Abordagem 2) Gerar chave privada no lado do cliente (meu dispositivo incorporado). Crie uma solicitação de assinatura de certificado (CSR) para enviá-la ao servidor OpenVPN (que também é minha CA). A CA gera um certificado e envia de volta o certificado do cliente.

Problemas com a abordagem 2)

  • Como autenticar o CSR? Como posso saber que o CSR está vindo do meu dispositivo incorporado e não de algum invasor? A única maneira que eu posso garantir é, se o CSR está vindo do túnel privado.

  • No caso de o certificado no meu dispositivo incorporado expirar antes da renovação, o túnel privado não existiria. Como posso autenticar o CSR neste caso? Qualquer um com CA.crt (chave pública de CAs) pode gerar uma chave privada e enviar um CSR para a CA.

Eu acho que a abordagem 2 parece mais razoável e segura, mas eu não sei a solução para os problemas que estou enfrentando. Eu quero saber se tenho uma compreensão correta da segurança? ou se há algo que estou perdendo. Além disso, se eu for com a abordagem 2, como seria a implementação? Eu sei como gerar chave e criar CSR, mas qual é a melhor maneira de enviá-lo de forma segura para a CA. E no servidor / CA final, como receber o CSR e como enviar o certificado com segurança.

Ahmad Karim
fonte