Para criar os certificados, utilizaremos o easy-rsa, um conjunto de scripts incluídos no pacote do OpenVPN. Na maioria das distribuições, os scripts estão disponíveis dentro da pasta “/usr/share/doc/openvpn/examples/easy-rsa“. Se a pasta não existir na sua instalação, use os comandos abaixo para localizá-la:
# locate easy-rsa
Duas localizações comuns são as pastas “/usr/share/doc/packages/openvpn/easy-rsa” e “/usr/share/doc/openvpn-2.0/easy-rsa”. No Fedora, especificamente, é usada a pasta “/usr/share/openvpn/easyrsa” e, no CentOS, é usada a pasta “/usr/share/doc/openvpn-2.0.9/easy-rsa/” (onde o 2.0.9 é a versão do pacote, que muda de acordo com a versão do CentOS usada).
O primeiro passo é copiar todo o diretório para dentro da pasta “/etc/openvpn” (você pode usar outro diretório se preferir). Isso evita que nossa configuração seja apagada ao atualizar o pacote do OpenVPN no futuro. No Debian, o comando seria:
No Fedora, onde a localização da pasta é diferente, o comando muda para:
Isso criará o diretório “/etc/openvpn/easy-rsa”, contendo os seguintes arquivos:
build-ca build-key-pass build-req-pass openssl.cnf sign-req
build-dh build-key-pkcs12 clean-all README.gz vars
build-inter build-key-server list-crl revoke-crt
Em outras distribuições, basta verificar qual é a pasta onde estão os exemplos e ajustar o comando de acordo.
A partir daí, toda a configuração será feita dentro do novo diretório:
Comece editando o arquivo “vars“, usando seu editor de textos preferido:
No final do arquivo, você encontra um conjunto de parâmetros usados para gerar as chaves (país, estado, cidade, empresa, etc.), que devem ser editados, como em:
export KEY_PROVINCE=SP
export KEY_CITY=”Guarulhos”
export KEY_ORG=”GDH”
export KEY_EMAIL=”morimoto@guiadohardware.net”
Em seguida, usamos o comando “source” para carregar as variáveis contidas dentro do arquivo “vars” e, em seguida, executamos os scripts “clean-all” e “build-ca”. O primeiro script limpa qualquer sobra de configuração anterior, enquanto o segundo gera o certificado raiz, usando o openssl. Como os scripts estão dentro do diretório atual, usamos o “./” ao executá-los:
# ./clean-all
# ./build-ca
……………….++++++
…………………++++++
writing new private key to ‘ca.key’
—–
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.
—–
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Guarulhos]:
Organization Name (eg, company) [GDH]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:
Email Address [morimoto@guiadohardware.net]:
Isso criará a pasta “/etc/openvpn/easy-rsa/keys/”, contendo os seguintes arquivos:
O arquivo “ca.crt” contém o certificado raiz. Ele jamais deve sair do servidor, já que qualquer um que tenha acesso a ele poderá gerar certificados adicionais que, essencialmente, permitirão que qualquer um se conecte à VPN. A necessidade de manter esse arquivo secreto faz com que alguns administradores prefiram gerar as chaves em uma máquina desconectada da rede (apenas com acesso local) e copiar manualmente os certificados gerados para o servidor e as demais máquinas.
Depois de criar o certificado raiz, podemos passar para o para o passo seguinte, que é gerar os certificados para o servidor e para os clientes.
Para gerar o certificado do servidor, usamos o script “build-key-server”, especificando como parâmetro o nome do arquivo que será gerado (“servidor” no exemplo). O nome é apenas para identificação dos hosts, você pode usar os nomes que preferir:
# ./build-key-server servidor
Ele começa confirmando as informações que serão incluídas no certificado (país, cidade, empresa, etc.), da mesma forma que ao rodar o build-ca. Em um certo ponto, ele perguntará pelo atributo “Common Name”, onde você deve fornecer o nome do servidor, como em:
Em seguida, ele oferece a opção de incluir um “challenge password”, uma senha que será solicitada cada vez que o certificado for usado. Ela aumenta a segurança, mas, em compensação, reduz bastante a praticidade, já que você precisará digitar a senha cada vez que o certificado for utilizado, o que pode se tornar incrivelmente inconveniente em um servidor administrado remotamente. Se quiser manter as coisas simples, deixe o campo em branco:
Antes de terminar, ele confirma se você deseja assinar o certificado e pede mais uma confirmação antes de aplicar a alteração. Responda “y” em ambas, caso contrário a geração do certificado é abortada:
1 out of 1 certificate requests certified, commit? [y/n]y
Em seguida, geramos as chaves que serão usadas pelos clientes, usando o script “build-key”. Você pode gerar chaves para vários clientes em seqüência, especificando nomes diferentes, como em:
# ./build-key cliente2
Cada vez que o comando é executado, o script mostra a saída do comando do openssl usado para gerar a chave e confirma os parâmetros do certificado, como ao rodar o “build-key-server”:
.++++++
…………………..++++++
writing new private key to ‘cliente1.key’
Se ao executar o comando “./build-key nome” ele simplesmente for executado instantaneamente, sem exibir o indicador ou qualquer mensagem de erro, é sinal de que alguma coisa está errada, provavelmente com a atribuição das variáveis usada pelo script. Nesse caso, experimente rodar novamente o comando “source vars” e executar o script novamente, como em:
# ./build-key cliente1
Não se esqueça de preencher a opção “commonName” com o nome da máquina (ou outro nome definido por você, diferente em cada chave). Deixando o campo em branco a chave não é gerada.
No final do processo, não esqueça de responder as perguntas “Sign the certificate?” e “1 out of 1 certificate requests certified, commit?” com o valor “y”.
…
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Diferente do “build-key-server”, ele não oferece a opção de proteger a chave usando uma senha. Se você quiser que os usuários precisem digitar uma senha antes de poderem efetuar a conexão usando o certificado, gere as chaves usando o script “build-key-pass” em vez do “build-key”. Ele confirma todos os parâmetros (assim como o build-key-server) e oferece a opção incluir a senha:
Em seguida, usamos o script “build-dh” (sem parâmetros). Ele gera os parâmetros Diffie Hellman, que reforçam a segurança, permitindo que o servidor e os clientes troquem as chaves (de forma segura) no momento da conexão, confirmando suas identidades:
This is going to take a long time
………………………………+………..+……………
O comando demora quase um minuto para gerar os parâmetros, mostrando um indicador de progresso durante o processo. Em caso de problemas, certifique-se de que está rodando os comandos a partir do diretório “/etc/openvpn/easy-rsa”, rode o comando “source vars” para carregar as variáveis e tente novamente.
O processo de geração das chaves gera um conjunto de arquivos “.csr”. Estes arquivos correspondem às requisições para a assinatura das chaves, que são feitas durante o processo de criação. Eles podem ser removidos no final do processo:
Você ficará, então, com um conjunto de arquivos similar a esse dentro do diretório “/etc/openvpn/easy-rsa/keys”:
ca.key cliente2.crt cliente3.crt index.txt.attr servidor.key
cliente1.crt cliente2.csr cliente3.key serial
Caso esteja curioso, estes scripts nada mais fazem do que executar os comandos correspondentes do OpenSSL, usando os parâmetros definidos no arquivo “vars”. O script “build-key”, por exemplo, executa os comandos:
openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr -config $KEY_CONFIG &&
openssl ca -days 3650 -out $1.crt -in $1.csr -config $KEY_CONFIG &&
chmod 0600 $1.key
Note que é usado o parâmetro “-days 3650”, que faz com que as chaves tenham validade de 10 anos. Se a sua VPN ainda estiver em uso até lá, não se esqueça de trocar as chaves antes do 3650° dia, caso contrário sua VPN parará de funcionar após completar o décimo aniversário. 🙂
Deixe seu comentário