Introdução
Este artigo oferece uma visão detalhada sobre o gerenciamento de certificados digitais, essencial para a segurança em redes privadas virtuais (VPNs) utilizando o OpenVPN. Exploraremos desde os conceitos fundamentais, como Infraestrutura de Chave Pública (PKI) e Autoridade Certificadora (CA), até a prática de emissão, assinatura, renovação, revogação e administração de certificados com o Easy-RSA.
Este é um dos dois artigos que explicam como configurar uma conexão OpenVPN entre um servidor e múltiplos clientes e como gerenciar os certificados necessários para garantir a segurança das conexões.
Para detalhes específicos sobre a configuração do OpenVPN, consulte:
Terminologia usada
Para compreender o gerenciamento de certificados, é fundamental conhecer alguns termos que frequentemente aparecem em suas formas abreviadas.
O que é PKI?
PKI, sigla para Infraestrutura de Chave Pública, é um conjunto de tecnologias, políticas e procedimentos destinados à criação, gestão, distribuição, armazenamento e revogação de certificados digitais e chaves públicas.
Ela serve como base para a segurança das comunicações digitais, garantindo autenticidade, integridade e confidencialidade de dados em sistemas como e-mails, transações online e VPNs.
O que é CA?
CA, sigla para Autoridade Certificadora, é a entidade responsável por emitir, assinar e gerenciar certificados digitais dentro de uma PKI. Seu papel é verificar a identidade de pessoas, servidores, organizações e outras entidades no ambiente digital.
Algumas das CAs mais utilizadas incluem DigiCert, GoDaddy e Let's Encrypt, que emitem certificados reconhecidos globalmente.
É possível utilizar serviços online para emitir certificados e configurá-los em aplicações como hospedagem de sites ou conexões VPN. No entanto, a maioria desses certificados é paga, o que pode torná-los inviáveis em muitos casos.
Felizmente, é possível criar uma CA própria e gerenciar certificados dentro de uma estrutura controlada.
O que é a request?
Uma requisição, um pedido de assinatura de certificado, ou seja, uma solicitação enviada a uma CA para que seja assinada e transformada em certificado. O termo CSR (Requisição de Assinatura de Certificado), também é utilizado para se referir a esse processo. A requisição inclui a chave pública.
O que é cert?
Cert é a abreviação de certificado digital, um arquivo que vincula uma chave pública a uma identidade, servindo como credencial no processo de autenticação entre dispositivos na rede. O certificado é gerado quando uma requisição (CSR) é assinada por uma CA, garantindo que suas informações são válidas e confiáveis.
O que é keypair?
Keypair (par de chaves, em português) é um conjunto composto por uma chave pública e uma chave privada, utilizado para autenticação, criptografia e verificação de integridade em sistemas de segurança. Esse par de chaves é a base para a geração de certificados digitais.
Chave Pública (Public Key): compartilhada abertamente com outros sistemas, é usada para criptografar dados ou verificar assinaturas digitais.
Chave Privada (Private Key): deve ser mantida em sigilo e armazenada com segurança. É utilizada para descriptografar dados recebidos ou assinar digitalmente documentos e transações, garantindo a autenticidade da entidade proprietária.
Como funciona o keypair?
Se alguém deseja enviar uma mensagem criptografada para você, ele utilizará sua chave pública para criptografá-la. Somente você, com sua chave privada, poderá descriptografar e ler a mensagem.
Ao assinar um documento ou certificado, você usa sua chave privada. Qualquer pessoa com sua chave pública pode verificar a autenticidade da assinatura, garantindo que foi realmente você quem assinou.
Formato PEM
As chaves, certificados e requisições são armazenados em arquivos no formato PEM (Correio com privacidade aprimorada). Esse formato utiliza codificação Base64 para representar dados criptografados.
Nem sempre a extensão .pem estará presente, pois arquivos com extensões como .key, .crt e .csr também utilizam o formato PEM.
Autoridade Certificadora - CA
A CA é a parte central de uma PKI e também o elemento mais crítico em termos de segurança. Sua chave privada é responsável por assinar todos os certificados emitidos. Se o acesso à CA for comprometido, um invasor poderá assinar e revogar certificados, colocando todo o sistema em risco.
Por esse motivo, recomenda-se configurar a PKI da CA de forma segura. Não é aconselhável administrá-la junto com clientes ou servidores VPN. Dependendo das necessidades de segurança, a CA pode ser mantida em uma conta altamente restrita, em um sistema dedicado (virtualizado, porém isolado da VPN), em um sistema offline ou até mesmo em uma mídia removível, como um pendrive, HD externo ou smartcard.
Ao criar uma nova CA, um par de chaves (pública e privada) é gerado, juntamente com a estrutura de arquivos necessária para suportar a assinatura de certificados.
Como tudo se encaixa
Para criar uma PKI, inicia-se configurando uma CA, que será responsável pelos certificados. Durante essa configuração, um par de chaves é gerado: a chave privada é armazenada em um arquivo com extensão .key, enquanto a chave pública é incluída no certificado, um arquivo com extensão .crt.
O próximo passo é gerar o par de chaves para o servidor. Assim como na CA, a chave privada é armazenada em um arquivo .key, enquanto a chave pública é embutida em um arquivo de requisição .req. Essa requisição deve ser assinada pela CA para se tornar um certificado válido .crt, que conterá as informações da chave pública.
O mesmo processo é realizado para o cliente: gera-se um par de chaves, e a CA assina a requisição para gerar o certificado.
O par de chaves, tanto do cliente quanto do servidor, pode ser gerado diretamente pela CA ou localmente no próprio servidor/cliente, enviando apenas a requisição para a CA assinar. O segundo método é preferível, pois a chave privada nunca sai do local onde será utilizada.
As solicitações de certificado (.req) não contêm informações sensíveis e podem ser transferidas por qualquer meio conveniente. Já os certificados assinados (.crt) não precisam ser protegidos com o mesmo rigor que as chaves privadas, mas podem incluir identificadores específicos exploráveis por atacantes. Para evitar riscos, é recomendável transferi-los por métodos seguros.
Caso o par de chaves seja gerado na CA, a chave privada (.key) precisará ser transmitida de forma segura ao servidor ou cliente. Esse processo é crítico e, sempre que possível, deve ser feito por meio de mídia física (HD externo, pendrive) para evitar interceptações. Alternativamente, a transferência pode ser realizada via SSH (scp, sftp) ou HTTPS, que são considerados métodos seguros.
O servidor deverá armazenar:
- Sua chave privada
- Seu certificado
- O certificado da CA
- Chave TLS
- Parâmetros Diffie-Hellman (DH)
O cliente deverá deverá armazenar:
- Sua chave privada
- Seu certificado
- O certificado da CA
- Chave TLS
Conectando servidor e cliente
Dois sistemas que possuam certificados assinados pela mesma CA, além do certificado da própria CA, podem se comunicar sem nunca terem trocado informações de segurança diretamente.
Durante o handshake TLS, cada sistema apresenta seu certificado, e o outro lado verifica sua validade comparando-o com sua cópia do certificado da CA. Como ambos confiam na mesma CA, os certificados são validados e a conexão é autenticada.
Cada sistema comprova a validade do seu certificado assinando um conjunto de dados com sua chave privada. Como apenas o detentor da chave privada pode realizar essa assinatura, sua segurança deve ser garantida. Esse processo confirma a autenticidade dos certificados e permite o estabelecimento seguro da conexão.
Easy-RSA - Introdução
Agora é hora de partir para a prática, configurando sua PKI, sua CA e gerando os certificados necessários. Para isso, utilizaremos o Easy-RSA.
Easy-RSA é um script utilizado para gerenciar certificados digitais dentro de uma Infraestrutura de Chave Pública (PKI). Ele é amplamente empregado em conjunto com o OpenVPN para criar e administrar certificados SSL/TLS essenciais para a configuração de uma VPN segura.
Projetado para ser intuitivo, o Easy-RSA simplifica a administração de certificados, mesmo para aqueles sem conhecimento avançado em criptografia. Ele automatiza grande parte dos processos envolvidos na gestão de uma PKI, tornando-se uma ferramenta valiosa para administradores de rede.
Download Easy-RSA
A CA precisa ser mantida segura. Entre os métodos mencionados anteriormente, será utilizado um pendrive para criar a PKI da CA. Assim, após a configuração, basta remover o dispositivo e armazená-lo em um local protegido para garantir a segurança das chaves privadas.
Neste exemplo, assumiremos que o pendrive está montado em /mnt/usb. O Easy-RSA deve ser configurado com um usuário comum, sem permissões de administrador.
A instalação do Easy-RSA é simples e idêntica em qualquer sistema Linux. Para baixá-lo, acesse o diretório do pendrive e execute:
$ bash
cd /mnt/usb git clone https://github.com/OpenVPN/easy-rsa
O comando acima baixará a versão mais recente disponível no repositório oficial do Easy-RSA no GitHub, que, no momento deste artigo, é a 3.3.0.
Caso prefira baixar uma versão específica, use:
git clone --branch v3.2.2 https://github.com/OpenVPN/easy-rsa
O comando acima fará o download da versão 3.2.2 do Easy-RSA.
Configurando EasyRSA
O diretório base do EasyRSA fica em easy-rsa/easyrsa3/.
Antes de iniciar, é recomendado ajustar algumas variáveis utilizadas nos scripts para garantir a consistência dos dados durante a geração dos certificados. Para isso, copie o arquivo de exemplo vars.example para vars:
$ bash
cd /mnt/usb/easy-rsa/easyrsa3/ cp vars.example vars vi vars
Agora, edite o arquivo vars com seu editor de texto preferido. Remova os comentários das linhas abaixo e personalize com suas informações:
/mnt/usb/easy-rsa/easyrsa3/vars
# Campos organizacionais set_var EASYRSA_REQ_COUNTRY "BR" # Pais set_var EASYRSA_REQ_PROVINCE "São Paulo" # Estado set_var EASYRSA_REQ_CITY "Rinópolis" # Cidade set_var EASYRSA_REQ_ORG "Minha empresa LTDA" # Nome da organização set_var EASYRSA_REQ_EMAIL "contato@minhaempresa.com.br" # E-mail set_var EASYRSA_REQ_OU "Departamento de TI" # Unidade Organizacional # Expiração (em dias) set_var EASYRSA_CA_EXPIRE 7300 # Validade da CA set_var EASYRSA_CERT_EXPIRE 3650 # Validade dos certificados emitidos
Os primeiros parâmetros configurados no arquivo vars são os campos organizacionais, que serão incorporados a todos os certificados gerados. Essas informações identificam a entidade que utiliza o certificado e fornecem detalhes de contato.
O valor de EASYRSA_REQ_COUNTRY deve seguir a convenção de dois caracteres definida pelo ISO 3166-1 alpha-2.
O segundo conjunto de variáveis define o tempo de expiração do certificado da CA e dos certificados emitidos para clientes e servidores VPN. O tempo é especificado em dias. Para a CA, recomenda-se um período longo, possivelmente maior que o padrão de 10 anos (3.650 dias), como 20 anos (7.300 dias). Isso porque, quando o certificado da CA expira, todos os certificados que ela assinou se tornam inválidos, e sua renovação exige distribuir o novo certificado da CA para todos os clientes e servidores da VPN.
Já para os certificados dos clientes e do servidor, pode-se adotar um período um pouco menor. No entanto, um prazo longo, como 10 anos, pode ser adequado. Se necessário, qualquer certificado pode ser revogado manualmente a qualquer momento, este processo será abordado mais adiante.
Manter um mecanismo de revogação bem estruturado pode ser mais eficiente do que lidar com expirações automáticas.
As demais variáveis do arquivo vars devem ser modificadas apenas por quem compreende seu propósito e não serão abordadas neste artigo.
Criando a PKI
Para configurar uma nova Infraestrutura de Chaves Públicas (PKI) com o Easy-RSA, utilize o comando ./easyrsa init-pki. Caso precise de ajuda sobre os parâmetros disponíveis, execute ./easyrsa help [comando].
$ bash
# Acesse o diretório do EasyRSA cd /mnt/usb/easy-rsa/easyrsa3/ # Inicie a PKI ./easyrsa init-pki Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Notice ------ 'init-pki' complete; you may now create a CA or requests. Your newly created PKI dir is: * /mnt/usb/easy-rsa/easyrsa3/pki Using Easy-RSA configuration: * /mnt/usb/easy-rsa/easyrsa3/vars
Esse comando cria um diretório chamado pki/, que contém a estrutura necessária para armazenar e gerenciar requisições, chaves privadas e certificados.
O próximo passo é criar a Autoridade Certificadora (CA).
Criando sua própria CA
Durante a criação da chave privada da CA, algumas informações serão solicitadas:
Senha para a criação da chave
Uma senha será utilizada para criptografar o arquivo da chave privada. Isso garante que, mesmo que alguém obtenha acesso ao arquivo, não possa utilizá-lo sem a senha correta. Guarde essa senha com segurança, pois será necessária sempre que for assinar uma requisição.
Common Name (CN)
Identifica a Autoridade Certificadora e é utilizado apenas para exibição. Neste exemplo, usaremos o nome do site Telazul, ajuste conforme sua aplicação.
Criando a CA com Easy-RSA
Para criar sua própria CA, execute o seguinte comando:
$ bash
# Acesse o diretório do EasyRSA cd /mnt/usb/easy-rsa/easyrsa3/ # Crie a CA ./easyrsa build-ca Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Enter New CA Key Passphrase: # Insira a senha Confirm New CA Key Passphrase: # Confirme a senha ...............................................................................................................................+++++ ...............................................................+++++ You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]: Telazul # Nome da CA Notice ------ CA creation complete. Your new CA certificate is at: * /mnt/usb/easy-rsa/easyrsa3/pki/ca.crt Create an OpenVPN TLS-AUTH|TLS-CRYPT-V1 key now: See 'help gen-tls' Build-ca completed successfully.
Sua Autoridade Certificadora foi gerada com sucesso.
Próximos passos
O próximo passo será gerar a chave TLS e os parâmetros Diffie-Hellman (DH). Ambos protegem a negociação da conexão VPN, mas de formas distintas:
- TLS-AUTH/TLS-CRYPT: Protege a integridade e o sigilo da comunicação.
- DH (Diffie-Hellman): Protege a troca de chaves criptográficas.
Gerando a chave TLS
A chave TLS-Crypt é utilizada para proteger a comunicação do OpenVPN, impedindo que pacotes forjados sejam aceitos, dificultando ataques DoS e ofuscando o handshake TLS, tornando a detecção da VPN mais difícil por terceiros. Para gerar a chave, execute:
$ bash
./easyrsa gen-tls-crypt-key
Using Easy-RSA 'vars' configuration:
* /mnt/usb/easy-rsa/easyrsa3/vars
Notice
------
TLS-CRYPT Key generated at:
* /mnt/usb/easy-rsa/easyrsa3/pki/private/easyrsa-tls.key
If this file is changed then it MUST be redistributed to ALL servers
AND clients, to be in effect. Do NOT change this existing file.
Essa chave impede que terceiros interfiram na comunicação ou detectem que a VPN está em operação.
Gerando parâmetros Diffie-Hellman (DH)
O protocolo Diffie-Hellman (DH) permite que dois participantes estabeleçam um segredo compartilhado sobre um canal inseguro sem transmitir diretamente a chave secreta, garantindo maior segurança na troca de chaves. Para gerar os parâmetros DH, execute:
$ bash
./easyrsa gen-dh
Using Easy-RSA 'vars' configuration:
* /mnt/usb/easy-rsa/easyrsa3/vars
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..............+.....................
........................++*++*++*++*
DH parameters appear to be ok.
Notice
------
DH parameters of size 2048 created at:
* /mnt/usb/easy-rsa/easyrsa3/pki/dh.pem
O uso de Diffie-Hellman permite que o OpenVPN estabeleça um segredo compartilhado sem expor diretamente a chave, protegendo a confidencialidade da comunicação.
Explorando a PKI
Os comandos anteriores criaram a estrutura básica da PKI. Vamos examiná-la:
$ bash
tree pki/ pki/ ├── ca.crt ├── certs_by_serial ├── dh.pem ├── index.txt ├── issued ├── private │ ├── ca.key │ └── easyrsa-tls.key ├── reqs ├── revoked │ ├── certs_by_serial │ └── private_by_serial ├── serial
- ca.crt ➔ Certificado da CA.
- certs_by_serial ➔ Diretório contendo certificados assinados pela CA, organizados pelo número de série.
- dh.pem ➔ Parâmetros Diffie-Hellman (DH).
- index.txt ➔ Banco de dados com o registro dos certificados emitidos.
- issued ➔ Diretório contendo os certificados assinados pela CA, organizados pelo nome comum (CN).
- private ➔ Diretório onde as chaves privadas são armazenadas.
- private/ca.key ➔ Chave privada da CA.
- private/easyrsa-tls.key ➔ Chave privada TLS.
- reqs ➔ Local para armazenamento de requisições de certificado.
- revoked ➔ Diretório contendo certificados e chaves revogados.
- serial ➔ Arquivo que armazena o número de série do próximo certificado a ser emitido.
Com essa estrutura, a CA está pronta para gerar requisições, criar chaves e assinar certificados. O próximo passo será criar os arquivos necessários para o servidor e os clientes do OpenVPN.
Cenário fictício
Para ilustrar os próximos exemplos, consideremos um cenário fictício em que funcionários de um escritório trabalham remotamente e precisam se conectar à rede da empresa para desempenhar suas funções.
Nesse contexto, o servidor OpenVPN será instalado no escritório, enquanto os clientes VPN serão configurados nos dispositivos dos funcionários em suas residências.
Gerando o par de chaves do servidor
Para gerar as chaves do servidor, utilize o comando ./easyrsa gen-req [nome-do-servidor]. Neste exemplo, adicionamos o parâmetro nopass, que desativa o uso de senha na criação da chave privada.
O uso de senha é recomendado, mas pode ser inconveniente em servidores remotos ou sem acesso fácil a um teclado, pois exigirá sua digitação a cada inicialização do serviço. Como a chave sem senha não é criptografada, é essencial restringir seu acesso com permissões adequadas, tema abordado no artigo sobre a configuração do servidor OpenVPN citado na introdução.
$ bash
./easyrsa gen-req escritorio nopass Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Generating a RSA private key ...........................+++++ .....................................................+++++ writing new private key to '/mnt/usb/easy-rsa/easyrsa3/pki/3c601300/temp.2.1' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [escritorio]: Enter ↲ # Confirme Notice ------ Private-Key and Public-Certificate-Request files created. Your files are: * req: /mnt/usb/easy-rsa/easyrsa3/pki/reqs/escritorio.req * key: /mnt/usb/easy-rsa/easyrsa3/pki/private/escritorio.key
Agora, o par de chaves do servidor está pronto. O próximo passo é assinar a solicitação de certificado (CSR) gerada.
Assinando a requisição do servidor
Para assinar a requisição do servidor, utilize o comando ./easyrsa sign-req server [nome-do-servidor]. Durante o processo, confirme os detalhes digitando yes quando solicitado, em seguida, insira a senha da chave privada da CA, gerada no comando build-ca.
$ bash
./easyrsa sign-req server escritorio Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. You are about to sign the following certificate: Requested CN: 'escritorio' Requested type: 'server' Valid for: '3650' days subject= commonName = escritorio Type the word 'yes' to continue, or any other input to abort. Confirm requested details: yes # Confirme Using configuration from /mnt/usb/easy-rsa/easyrsa3/pki/80bec09b/temp.1.1 Enter pass phrase for /mnt/usb/easy-rsa/easyrsa3/pki/private/ca.key: # Senha da CA Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'escritorio' Certificate is to be certified until Feb 23 18:09:06 2035 GMT (3650 days) Write out database with 1 new entries Data Base Updated Notice ------ Inline file created: * /mnt/usb/easy-rsa/easyrsa3/pki/inline/private/escritorio.inline Notice ------ Certificate created at: * /mnt/usb/easy-rsa/easyrsa3/pki/issued/escritorio.crt
O certificado do servidor foi gerado e armazenado em pki/issued/escritorio.crt. Esse arquivo será necessário na configuração do OpenVPN.
Copiando os arquivos para o servidor
Conecte o pendrive contendo a CA no servidor e copie os arquivos para a pasta de configuração do OpenVPN. Como são necessárias permissões de administrador, execute os comandos como root ou com sudo.
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/issued/escritorio.crt /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/private/escritorio.key /etc/openvpn/keys/ cp /mnt/usb/easy-rsa/easyrsa3/pki/private/easyrsa-tls.key /etc/openvpn/keys/
Gerando o par de chaves para o cliente
O par de chaves pode ser gerado na própria CA e depois transferido para o cliente, mas a prática recomendada é gerá-lo diretamente no cliente e enviar apenas a requisição para a CA assinar. Dessa forma, a chave privada nunca sai do cliente, aumentando a segurança.
A seguir, será demonstrado esse processo, com a geração das chaves no cliente e a importação da requisição na CA para assinatura. Como os exemplos anteriores já foram detalhados, aqui os comandos serão apresentados de forma mais objetiva.
Gerando a requisição no cliente
Com um usuário comum, faça o download do Easy-RSA, inicialize a PKI e gere o par de chaves. Neste exemplo, o cliente será identificado como casa.
$ bash
Baixe o Easy-RSA no cliente git clone https://github.com/OpenVPN/easy-rsa Acesse a pasta do script easyrsa cd easy-rsa/easyrsa3 Inicie a PKI ./easyrsa init-pki Gere as chaves sem senha ./easyrsa gen-req casa nopass
Copie a requisição gerada pki/reqs/casa.req do cliente para o servidor. Conecte o pendrive com a estrutura CA no servidor e importe a requisição. Não copie a requisição para o pendrive porque pode causar conflitos. Deixe-a no computador, o comando import-req já a copiará automaticamente para pki/reqs/.
$ bash
cd /mnt/usb/easy-rsa/easyrsa3/
./easyrsa import-req /caminho/para/casa.req casa
Using Easy-RSA 'vars' configuration:
* /mnt/usb/easy-rsa/easyrsa3/vars
Notice
------
Request successfully imported with short-name: casa
This request is now ready to be signed.
Assine a requisição com a CA. Durante o processo, será solicitado para confirmar os detalhes da requisição, digite yes e pressione Enter ↲, em seguida insira a senha da CA.
$ bash
./easyrsa sign-req client casa
Observe que o parâmetro de sign-req muda de server para client ao assinar certificados para clientes. Essa distinção é essencial, pois um certificado assinado incorretamente como server não funcionará para a conexão do cliente.
Após a assinatura, o certificado estará disponível em pki/issued/casa.crt.
Copiando os arquivos para o cliente
Para facilitar a explicação, será considerado que o pendrive contendo a CA e os certificados foi levado até a casa do funcionário para copiar os arquivos. Se for transferi-los pela internet, utilize um método seguro, como SSH ou HTTPS.
Plugue o pendrive contendo a CA no cliente e copie os arquivos para a pasta de configuração do openvpn. Será necessário permissões de adminsitrador, execute os comandos como root ou use o comando sudo.
Conecte o pendrive no cliente e copie os arquivos para a pasta de configuração do OpenVPN:
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/certs/
cp /mnt/usb/easy-rsa/easyrsa3/pki/issued/casa.crt /etc/openvpn/certs/
cp /mnt/usb/easy-rsa/easyrsa3/pki/private/easyrsa-tls.key /etc/openvpn/keys/
# Chave gerada no próprio cliente
cp /caminho/para/easy-rsa/easyrsa3/pki/private/casa.key /etc/openvpn/keys/
A configurações da VPN no cliente é detalhada no artigo sobre configuração do OpenVPN, citado na introdução.
Revogando um certificado
A revogação de certificados é uma medida essencial para manter a segurança da VPN. Sempre que um dispositivo for desativado, comprometido ou um funcionário deixar a empresa, é fundamental revogar seu certificado para impedir acessos indevidos.
Para revogar um certificado e invalidar seu uso, utiliza-se o comando: ./easyrsa revoke nomeDaRequisicao.
Esse processo é irreversível. Será solicitado que você confirme a revogação digitando yes. Em seguida, digite a senha da chave da CA quando solicitado para concluir a revogação.
$ bash
./easyrsa revoke casa
O certificado revogado será movido para a pasta revoked/ dentro do ambiente da PKI da CA.
No entanto, a revogação por si só não bloqueia automaticamente o cliente. O servidor precisa estar configurado para consultar a Lista de Certificados Revogados (CRL). Se essa lista não for atualizada no servidor, clientes revogados ainda poderão se conectar.
Execute o comando abaixo e informe a senha da CA quando solicitado:
$ bash
./easyrsa gen-crl
Isso criará um arquivo chamado crl.pem. Copie-o para o diretório de configuração do OpenVPN no servidor:
$ shell
cp /mnt/usb/easy-rsa/easyrsa3/pki/crl.pem /etc/openvpn/
No arquivo de configuração do servidor OpenVPN (escritorio.conf, neste exemplo), adicione a seguinte linha para que o servidor consulte a CRL:
escritorio.conf
crl-verify /etc/openvpn/crl.pem
Reinicie o servidor OpenVPN para aplicar a alteração. Após isso, quando um cliente tentar se conectar com um certificado revogado, o log do servidor exibirá a seguinte mensagem:
/var/log/openvpn.log
VERIFY ERROR: depth=0, error=certificate revoked: CN=casa
A CRL será verificada sempre que um cliente tentar se conectar. Como o servidor OpenVPN está configurado para reduzir privilégios após a inicialização e operar como o usuário nobody, é necessário garantir que o arquivo crl.pem possa ser lido corretamente. Ajuste as permissões com os seguintes comandos:
# bash
chown root:nobody /etc/openvpn/crl.pem chmod 440 /etc/openvpn/crl.pem
Renovando um certificado
Os certificados possuem uma data de expiração e, eventualmente, precisarão ser renovados. Esse processo pode ser realizado tanto antes quanto depois da expiração. Essencialmente, a renovação envolve a criação de um novo certificado e a revogação do antigo. No entanto, o procedimento utiliza comandos específicos que permitem reutilizar o mesmo nome do certificado original.
Se desejar testar esta funcionalidade, você pode aumentar o período de expiração dos certificados no arquivo vars, como faremos aqui, e renovar o certificado. Para verificar a validade atual de um certificado, utilize o comando:
$ shell
openssl x509 -in pki/issued/casa.crt -noout -dates
notBefore=Feb 27 18:04:32 2025 GMT
notAfter=Feb 25 18:04:32 2035 GMT
Para efeito de testes, altere a expiração para 20 anos no arquivo vars, modificando a linha set_var EASYRSA_CERT_EXPIRE 7300. Se o certificado já estiver expirado ou próximo do vencimento, basta executar os comandos a seguir para renová-lo por mais 10 anos, sem necessidade de modificar a configuração de expiração.
$ shell
./easyrsa renew casa
O processo exibirá um aviso informando que o certificado atual será excluído. Confirme com yes. Em seguida, será solicitado que confirme a criação do novo certificado, yes novamente. Por fim, insira a senha da chave da CA para assinar o novo certificado.
Revogue o certificado antigo com o comando:
$ bash
./easyrsa revoke-renewed casa
Yes para confirmar e insira a senha da chave da CA para concluir a revogação. Pensa que acabou? Ainda não! O próximo passo é atualizar a CRL, o que é feito com o comando:
$ bash
./easyrsa gen-crl
Para mais informações, consulte o tópico Revogando um certificado neste artigo.
No cliente
Copie o novo certificado e a nova chave para o cliente:
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/issued/casa.crt /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/private/casa.key /etc/openvpn/keys/
No servidor
Copie a nova CRL para o servidor:
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/crl.pem /etc/openvpn/
Reinicie o serviço OpenVPN no cliente e no servidor:
# bash
/etc/rc.d/rc.openvpn restart
Verificando a nova expiração do certificado:
$ shell
openssl x509 -in pki/issued/casa.crt -noout -dates
notBefore=Feb 27 18:12:09 2025 GMT
notAfter=Feb 22 18:12:09 2045 GMT
Repare que a nova expiração será em 2045 em vez de 2035. Embora o processo de renovação seja simples, ele pode ser trabalhoso, por isso foi sugerido anteriormente trabalhar com datas de expiração mais longas.
Configurando o servidor e cliente no OpenVPN
Para configurar o OpenVPN e integrar os certificados gerados, confira o artigo Como configurar servidor openVPN com Easy-RSA no Linux. Nele, você encontrará as instruções detalhadas para ajustar o serviço e estabelecer conexões seguras entre clientes e servidores.
Conclusão
Este artigo apresentou o uso do Easy-RSA para gerenciar chaves e certificados no Linux, cobrindo desde a criação da CA até a revogação e renovação de certificados. Com esses procedimentos, é possível estabelecer uma infraestrutura de autenticação segura para o OpenVPN, garantindo o controle sobre os dispositivos que podem se conectar à rede.