quinta-feira, 6 de janeiro de 2011

Criando Certificados SSL com OpenSSL

Certificados digitais são utilizados vastamente em diversos serviços de rede, como contêineres HTTP (exemplo: Apache Web Server), servidores de e-mail (Exim4 ou Sendmail), servidores de nomes e diretórios (LDAP), e até para assinar arquivos e documentos digitalmente, como o faz o AutoCAD. Este tutorial mostra, passo a passo, como criar um certificado digital, utilizando a ferramenta OpenSSL. O certificado criado poderá ser importado e utilizado em qualquer aplicativo ou serviço que suporte conexão segura ou assinatura digital.
Para executar as instruções deste tutorial, você deve ter o openssl previamente instalado em sua máquina (possivelmente sua distro Linux já vem com ele) e deve ter acesso de root, pois todos os comandos deverão ser executados como root, desde o início.
Este tutorial inspira-se num tutorial bem detalhado que pode ser encontrado aqui.


  • Criando um Diretório para o SSL

Como o procedimento que iremos realizar gera vários arquivos e diretórios, alguns deles sensíveis e cujo acesso deve ser restrito ao root, então convém que se crie no sistema um diretório para se armazenar estas informações. Pode estar em qualquer lugar e possuir qualquer nome, vou sugerir /var/ssl. Após criar o diretório, restrinja todo o acesso de leitura, escrita e execução dele apenas ao root, por motivos de segurança:

mkdir /var/ssl
chmod 700 /var/ssl

Confira a operação:

ls -l /var/

# deve conter uma linha semelhante a esta:
drwx------ 2 root root 4096 2011-01-06 15:41 ssl

Agora acesse o diretório. Todas as demais operações ocorrerão de dentro dele:

cd /var/ssl/


  • Criando Subdiretórios e Banco de Dados dos Certificados

Uma vez dentro do diretório, vamos criar dois subdiretórios, utilizados para armazenar os certificados e as chaves privadas:

mkdir certs private

Agora vamos criar dois pequenos arquivos textos, um contendo um número seqüencial (utilizado para numerar os certificados na seqüência em que sejam criados) e outro vazio, utilizado para indexar o certificado atual:

echo '100001' > serial
touch certindex.txt


  • Criando um Arquivo de Configuração do OpenSSL Personalizado

O OpenSSL utiliza um arquivo de configuração em modo texto que pode ter qualquer nome. Já existe um arquivo pronto que fica em "/etc/ssl/openssl.cnf". Você pode modificá-lo e utilizá-lo, se desejar. Por questões de padronização, eu sugiro que você crie o seu próprio arquivo de configuração, incluindo nele os dados particulares de sua empresa ou instituição que deverão aparecer no certificado.
Um exemplo deste arquivo está a seguir. A minha sugestão é que você o salve como openssl.cnf.sample. Basta digitar "vi openssl.cnf.sample", apertar "i" (de "incluir") e colar o seguinte conteúdo:

-----------------------------------------------------
#
# OpenSSL configuration file.
#

# Establish working directory.

dir = .

[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial
database = $dir/certindex.txt
new_certs_dir = $dir/certs
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 365
default_md = md5
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match

[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ req ]
default_bits = 1024 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64

# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = My Company
localityName_default = My Town
stateOrProvinceName_default = State or Providence
countryName_default = US

[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

-----------------------------------------------------

Agora, você já tem um modelo do arquivo de configuração do OpenSSL. Não vamos mexer no modelo, sob pena de perder as informações e dicas contidas nos comentários. Vamos então criar o nosso arquivo personalizado a partir do modelo, e este se chamará simplesmente openssl.cnf:

cp openssl.cnf.sample openssl.cnf


Edite este arquivo e substitua as informações da seção "[ req_distinguished_name ]" por informações em conformidade com as informações que você deseja mostrar no certificado. Lembre-se: evite usar acentos, símbolos, barras, sinais, ou qualquer outro caracter especial fora os símbolos alfanuméricos padrões, pois isto pode criar problemas na codificação da chave!!


  • Criando o Certificado Principal

Antes de criar chaves, você deve criar um certificado principal (root certificate), baseado nas configurações informadas no arquivo de configurações. Todo o resto do trabalho daqui por diante será baseado neste certificado. Assim, para criar este certificado, digite o comando abaixo (sempre de dentro da pasta principal que criamos, e sempre como root!):

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 365 -config ./openssl.cnf

O que significa tudo isso??
-new: indica que se criará um novo Certificate Authority (autoridade certificadora);
-days 365: a quantidade de dias em que este certificado será válido. Algumas pessoas gostam de deixar o certificado principal válido por 10 anos. Neste caso, informe "3650";
-keyout private/cakey.pem: o local e nome do arquivo de chave que será criado;
-out cacert.pem: o arquivo de certificado que será criado;
-config ./openssl.cnf: o arquivo de configuração que será utilizado como base para a criação deste certificado.

Depois que você der ENTER, o OpenSSL vai pedir alguns dados importantes, iniciando por uma senha (pass phrase). Não perca esta senha!! Ela vai ser necessária mais pra frente!! As outras informações são as mesmas do arquivo de configuração que você já deve ter alterado, ou seja:

- Nome da Organização (ou companhia, empresa, instituto ou órgão);
- Unidade da Organização (ou departamento ou seção);
- Cidade;
- Estado (ou província ou região);
- País (na verdade, apenas as duas letras do código do país. Ex: BR para Brasil);
- O chamado Common Name, geralmente o nome de servidor (hostname) ou IP do mesmo.


  • Instalando o Certificado

Apenas com o exposto você já tem o suficiente para usar o certificado. Foram gerados dois arquivos, a saber:

cacert.pem: é o seu certificado público. Pode ser renomeado e distribuído para outras pessoas ou máquinas, ou mesmo via rede. Pode ser baixado e instalado em navegadores ou clientes de e-mail.
private/cakey.pem: é um arquivo privado e não deve ser distribuído. Ao contrário, deve ficar bem guardado e seguro!! Também pode ser renomeado, no entanto. Este arquivo deve ser utilizado internamente para criar as assinaturas digitais, necessárias para acessos seguros via SSL.


  • Próximos Passos

No artigo seguinte (Configurando o Apache com SSL), vamos aprender a criar duas chaves a partir deste certificado, uma pública e outra privada, assiná-las digitalmente e adicioná-las ao Apache Web Server... continue com a gente!!

2 comentários:

Anônimo disse...

Cade o proximo artigo???

O Pajé disse...

É só clicar no link entre parênteses, ao final do texto, onde se lê "Configurando o Apache com SSL".