Criando certificados X509

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:

# updatedb
# 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/easy­rsa” 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:

# cp -a /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/

No Fedora, onde a localização da pasta é diferente, o comando muda para:

# cp -a /usr/share/openvpn/easy­rsa /etc/openvpn/

Isso criará o diretório “/etc/openvpn/easy-rsa”, contendo os seguintes arquivos:

2.0 build-key build-req make-crl revoke-full
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:

# cd /etc/openvpn/easy-rsa

Comece editando o arquivo “vars“, usando seu editor de textos preferido:

# joe vars

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_COUNTRY=BR
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:

# source vars
# ./clean-all
# ./build-ca

Generating a 1024 bit RSA private key
……………….++++++
…………………++++++
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:

ca.crt ca.key index.txt serial

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:

# cd /etc/openvpn/easy-rsa/
# ./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:

Common Name (eg, your name or your server’s hostname) []:Etch

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:

A challenge password []:

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:

Sign the certificate? [y/n]:y
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 cliente1
# ./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”:

Generating a 1024 bit RSA private key
.++++++
…………………..++++++
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:

# source vars
# ./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”.

Common Name (eg, your name or your server’s hostname) []:cliente1

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:

# ./build-key-pass cliente2

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:

# ./build-dh

Generating DH parameters, 1024 bit long safe prime, generator 2
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:

# rm *.csr

Você ficará, então, com um conjunto de arquivos similar a esse dentro do diretório “/etc/openvpn/easy-rsa/keys”:

ca.crt cliente1.key cliente2.key index.txt servidor.crt
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:

cd $KEY_DIR &&
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. 🙂

:. Leia mais sobre servidores Linux

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X