Visão Geral do SSL e de Certificados Digitais

O SSL oferece conexões seguras permitindo que, para dois aplicativos que estão se conectando por meio de uma rede, cada aplicativo faça a autenticação da identidade do outro aplicativo. Além disso, o SSL fornece a criptografia dos dados trocados entre esses aplicativos. A autenticação permite que um servidor (unidirecional) e, opcionalmente, um cliente (bidirecional) verifiquem a identidade do aplicativo na outra extremidade de uma conexão de rede. A criptografia faz com que os dados transmitidos pela rede possam ser compreendidos apenas pelo destinatário planejado.

Os recursos do SSL incluem os seguintes conceitos:

  • O SSL oferece um mecanismo para que um aplicativo se autentique em outro aplicativo.
  • O SSL unidirecional permite que um aplicativo saiba exatamente a identidade do outro aplicativo.
  • O SSL bidirecional (autenticação mútua) permite que ambos os aplicativos saibam exatamente a identidade do outro.
  • O aplicativo que assume a função de “servidor” possui e utiliza um certificado de servidor para comprovar sua identidade ao aplicativo cliente.
  • Em uma autenticação mútua, o aplicativo que assume a função de “cliente” possui e utiliza um certificado de cliente para comprovar sua identidade ao aplicativo servidor.
  • O aplicativo que recebe um certificado deve possuir o certificado raiz (ou a cadeia de certificado) de CA (Autoridade de Certificação) que assinou esse certificado que está sendo apresentado. O certificado raiz, ou a cadeia, de CA valida o certificado que está sendo apresentado.
  • Em conexões de clientes, o navegador cliente alerta o usuário quando recebe um certificado que não foi emitido por uma Autoridade de Certificação reconhecida.

Compreendendo Chaves Privadas e Certificados Digitais

Chaves privadas, certificados digitais e Autoridades de Certificação confiáveis podem ser utilizadas para estabelecer e verificar a identidade de aplicativos de rede.

O SSL utiliza tecnologia de criptografia de chave pública para autenticação. Na criptografia de chave pública, uma chave pública e uma chave privada são geradas para um aplicativo. As chaves são relacionadas de tal forma que os dados criptografados com a chave pública podem ser decriptografados somente utilizando a chave privada correspondente. De maneira similar, os dados criptografados com a chave chave privada podem ser decriptografados somente utilizando a chave pública correspondente. A chave privada é cuidadosamente protegida, de forma que apenas o proprietário possa decriptografar as mensagens criptografadas utilizando a chave pública.

A chave pública está incorporada a um certificado digital com informações adicionais que descrevem o proprietário da chave pública, como nome, endereço e endereço de e-mail. Uma chave privada e um certificado digital fornecem a identidade para o aplicativo.

Os dados incorporados em um certificado digital são verificados por uma CA confiável e assinados digitalmente com o certificado digital da Autoridade de Certificação. As Autoridades de Certificação conhecidas incluem Verisign eEntrust.net. Uma Autoridade de Certificação confiável estabelece confiança para um aplicativo.

Um aplicativo que participa de uma conexão SSL é autenticado quando a outra parte avalia e aceita os respectivos certificados digitais. Um certificado digital utilizado para autenticação é validado por um certificado de CA raiz associado, localizado na aplicação de recepção.

Navegadores da Web, servidores e outros aplicativos ativados por SSL geralmente aceitam como verdadeiro qualquer certificado digital que seja assinado por uma Autoridade de Certificação confiável e seja válido. Por exemplo, um certificado digital pode ser invalidado porque expirou ou porque o certificado digital da Autoridade de Certificação utilizada para assiná-lo expirou. Um certificado de servidor poderá ser invalidado se o nome do host no certificado digital do servidor não corresponder ao nome do host especificado pelo cliente.

Irei mostrar três formas para gerar certificados SSL para o seu servidor. Você poderá utilizar um certificado auto-assinado (uma forma mais rápida, fácil, porém limitada), um certificado assinado através da CA, que poderá ser gerenciada por você mesmo (uma forma mais segura e confiável), ou usando um certificado de uma CA reconhecida (neste exemplo utilizarei o “cacert.org”, pois eles assinam seus certificados e fornecem um certificado com o objetivo de ser usado em muitos projetos de software livre).

Geralmente o mod_ssl vem junto com o pacote principal do Apache. Nas distribuições derivadas do debian é necessário somente ativar o módulo.

# a2enmod ssl

Vamos recarregar o serviço para que as alterações sejam aplicadas

# /etc/init.d/apache2 force-reload

No caso das distribuições derivadas do RHEL, como o CentOS, vamos verificar se o “mod_ssl” está instalado e ativar no apache.

# rpm -qa | grep mod_ssl

Vamos instalar o módulo e recarregar as configurações.

# yum install mod_ssl
# httpd -kgraceful

Após instalação do mod_ssl, automaticamente é criado o arquivo de configuração ssl.conf dentro do diretório “/etc/httpd/conf.d”

1 – Gerando um certificado auto-assinado

Gerar a chave privada com 2048 bits

$ cd /etc/pki/tls/certs
# openssl genrsa -out servidor.key 2048

Gerar o certificado auto-assinado

# openssl req -outform PEM -new -key servidor.key -x509 -days 1825 -out servidor.crt
Country Name (2 letter code) [XX]:BR
State or Province Name (full name) []:Ceara
Locality Name (eg, city) [Default City]:Fortaleza
Organization Name (eg, company) [Default Company Ltd]:Café com Linux
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.cafecomlinux.com.br
Email Address []:neto@cafecomlinux.com.br

Responda as perguntas conforme as informações de seu site. O campo “Common Name” deverá ser preenchido com as informações do hostname, os campos “Organizational Unit Name” e “Email” não são obrigatórios, porém darão mais informações ao certificado que será gerado.

Copie a chave privada para o respectivo diretório

# cp servidor.key /etc/pki/tls/private

O conteúdo abaixo deverá ser inserido no arquivo de configuração de ssl do seu servidor apache ou nas configurações do virtualhost de seu site

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
SSLCertificateFile /etc/pki/tls/certs/servidor.crt
SSLCertificateKeyFile /etc/pki/tls/private/servidor.key

2 – Gerando um certificado assinado através da sua CA

Nesse exemplo, irei utilizar dois servidores, o servidor que será assinado pela CA e o servidor responsável pela CA.

Vamos criar um diretório para a chave privada e certificado da CA

# mkdir /etc/pki/tls/certs/CA

Gerar a chave privada com 2048 bits da CA

$ cd /etc/pki/tls/certs/CA
# openssl genrsa -des3 -out cacert.key 2048
Enter pass phrase for cacert.key:
Verifying - Enter pass phrase for cacert.key:

Gerar o certificado auto-assinado da CA com validade de 10 anos

# openssl req -new -x509 -days 3650 -key cacert.key -out cacert.pem 
Country Name (2 letter code) [XX]:BR
State or Province Name (full name) []:Ceara
Locality Name (eg, city) [Default City]:Fortaleza
Organization Name (eg, company) [Default Company Ltd]:Café com Linux
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.cafecomlinux.com.br
Email Address []:neto@cafecomlinux.com.br

Responda as perguntas conforme as informações de seu site. O campo “Common Name” deverá ser preenchido com as informações do hostname, os campos “Organizational Unit Name” e “Email” não são obrigatórios, porém darão mais informações ao certificado que será gerado.

Agora iremos criar a chave privada do servidor que será assinado pela CA

# openssl genrsa -out servidor.key 2048

Gerar a requisição de certificado do servidor que será assinado pela CA

# openssl req -new -key servidor.key -out servidor.csr
Country Name (2 letter code) [XX]:BR
State or Province Name (full name) []:Ceara
Locality Name (eg, city) [Default City]:Fortaleza
Organization Name (eg, company) [Default Company Ltd]:Café com Linux
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.cafecomlinux.com.br
Email Address []:neto@cafecomlinux.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Novamente responda as perguntas conforme as informações de seu site. O campo “Common Name” deverá ser preenchido com as informações do hostname, os campos “Organizational Unit Name”, “Email”, “A challenge password” e “An optional company name” não são obrigatórios, porém darão mais informações ao certificado que será gerado.

Vamos assinar o certificado do seu servidor pela CA com validade de 10 anos

# openssl x509 -req -in servidor.csr -out servidor.crt -sha1 -CA cacert.pem -CAkey cacert.key -CAcreateserial -days 3650

O conteúdo abaixo deverá ser inserido no arquivo de configuração de ssl do seu servidor apache ou nas configurações do virtualhost de seu site

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
SSLCertificateFile /etc/pki/tls/certs/CA/servidor.crt
SSLCertificateKeyFile /etc/pki/tls/certs/CA/servidor.key
SSLCACertificateFile /etc/pki/tls/certs/CA/cacert.pem

Para o navegador de internet e aplicações clientes que utilizarão ssl, se faz necessário importar ou copiar o arquivo “cacert.pem” para seus respectivos diretórios.

3 – Usando um certificado de uma CA reconhecida”

Gerar a chave privada com 2048 bits

$ cd /etc/pki/tls/certs
# openssl genrsa -out servidor.key 2048

Gerar a requisição de certificado do servidor que será assinado pela CA

# openssl req -new -key servidor.key -out servidor.csr
Country Name (2 letter code) [XX]:BR
State or Province Name (full name) []:Ceara
Locality Name (eg, city) [Default City]:Fortaleza
Organization Name (eg, company) [Default Company Ltd]:Café com Linux
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.cafecomlinux.com.br
Email Address []:neto@cafecomlinux.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Responda as perguntas conforme as informações de seu site. O campo “Common Name” deverá ser preenchido com as informações do hostname, os campos “Organizational Unit Name”, “Email”, “A challenge password” e “An optional company name” não são obrigatórios, porém darão mais informações ao certificado que será gerado.

Copie a chave privada para o respectivo diretório

# cp servidor.key /etc/pki/tls/private

Agora vamos colar conteúdo do arquivo servidor.csr no site da CA que será gerado o certificado (https://www.cacert.org/account.php?id=10) e após receber e-mail com resposta, vamos copiar o cetificado “.crt” gerado pela CA para o servidor web

# cp servidor.crt /etc/pki/tls/certs/servidor.crt

Vamos baixar o certificado CACERT’s root certificate e renomear para “cacert.pem”. Este certificado será utilizado tanto pelo servidor web quanto pelos clientes.

O conteúdo abaixo deverá ser inserido no arquivo de configuração de ssl do seu servidor apache ou nas configurações do virtualhost de seu site

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
SSLCertificateFile /etc/pki/tls/certs/servidor.crt
SSLCertificateKeyFile /etc/pki/tls/private/servidor.key
SSLCACertificateFile /etc/pki/tls/certs/cacert.pem

Para o navegador de internet e aplicações clientes que utilizarão ssl, se faz necessário importar ou copiar o arquivo “cacert.pem” para seus respectivos diretórios.

Com o openssl podemos obter algumas informações através dos certificados gerados, abaixo seguem alguns exemplos de comandos:

Informação geral do certificado

# openssl x509 -in cacert.pem -noout -text

Informação sobre datas de criação e expiração

# openssl x509 -in cacert.pem -noout -dates

Informação da finalidade do certificado

# openssl x509 -in cacert.pem -noout -purpose

Dúvidas, comentários, sugestões?

comments