26.6. Configurando um servidor Web seguro com SSL

Sempre que há transferência de dados confidenciais (como informações de cartão de crédito) entre o servidor Web e o cliente, é desejável ter uma conexão criptografada segura com autenticação. O mod_ssl oferece uma criptografia forte usando os protocolos SSL (Secure Sockets Layer) e TLS (Transport Layer Security) na comunicação HTTP entre um cliente e o servidor Web. Com SSL/TSL, é estabelecida uma conexão privada entre o servidor Web e o cliente. Com a integridade dos dados garantida, cliente e servidor são capazes de autenticar-se um ao outro.

Para isso, o servidor envia um certificado SSL contendo informações que comprovam a validade da identidade do servidor antes que solicitações a um URL sejam respondidas. Por sua vez, isso garante que o servidor é o único ponto de terminação correto para essa comunicação. Além disso, o certificado gera uma conexão criptografada entre o cliente e o servidor capaz de transmitir informações sem o risco de exposição de conteúdo confidencial em texto simples.

Em vez de implementar os protocolos SSL/TSL por conta própria, o mod_ssl atua como interface entre o Apache e uma biblioteca SSL. A biblioteca OpenSSL é usada no SUSE Linux. Ela é instalada automaticamente com o Apache.

O efeito mais visível do uso de mod_ssl com o Apache é que os URLs aparecem com o prefixo https:// em vez de http://.

26.6.1. Criando um certificado SSL

Para usar SSL/TSL com o servidor Web, você deve criar um certificado SSL. Esse certificado, necessário para a autorização entre o servidor Web e o cliente, possibilita a cada parte identificar claramente a outra. Para garantir a integridade do certificado, ele deve ser assinado por uma entidade em que todos os usuários confiem.

Há três tipos de certificados que você pode criar: um certificado “simulado” somente para teste, um certificado auto-assinado para um círculo definido de usuários que confiam em você e um certificado assinado por uma autoridade de certificação (CA) notória e independente.

A criação de um certificado se resume em um processo de duas etapas. Primeiro é gerada uma chave privada para a autoridade de certificação, em seguida, o certificado do servidor é assinado com essa chave.

[Tip]Mais informações

Para saber mais sobre conceitos e definições sobre SSL/TSL, consulte http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html.

26.6.1.1. Criando um certificado “simulado

Gerar um certificado simulado é simples. Basta chamar o script /usr/bin/gensslcert. Ele cria ou sobregrava os seguintes arquivos:

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

Uma cópia de ca.crt também é colocada em /srv/www/htdocs/CA.crt para download.

[Important]Importante

Um certificado simulado nunca deve ser usado em um sistema de produção. Use-o somente para teste.

26.6.1.2. Criando um certificado auto-assinado

Se você estiver configurando um servidor Web seguro para uma Intranet ou para um círculo definido de usuários, talvez seja suficiente assinar um certificado com sua própria autoridade de certificação (CA).

A criação de um certificado auto-assinado é um processo interativo de nove etapas. Passe para o diretório /usr/share/doc/packages/apache2 e execute o seguinte comando: ./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom. Não tente executar esse comando fora desse diretório. O programa apresenta uma série de prompts, dos quais alguns precisam de entrada do usuário.

Procedimento 26.1. Criação de um certificado auto-assinado com mkcert.sh

  1. Decide the signature algorithm used for certificates (Defina o algoritmo de assinatura usado para certificados)

    Escolha RSA (R, o padrão), pois alguns browsers mais antigos têm problema com DSA.

  2. Generating RSA private key for CA (1024 bit) (Gerando chave privada RSA para CA - 1024 bits)

    Nenhuma interação necessária.

  3. Generating X.509 certificate signing request for CA (Gerando solicitação de assinatura de certificado X.509 para CA)

    Crie aqui o nome exclusivo da CA. Para isso você terá que responder a algumas perguntas, como nome do país ou da organização. Digite dados válidos, pois tudo que você digitar aqui aparecerá depois no certificado. Você não precisa responder a todas as perguntas. Se alguma não lhe diz respeito ou se você quer deixá-la em branco, use “.”. Nome comum é o nome da própria CA — escolha um nome significativo, como CA Minha empresa.

  4. Generating X.509 certificate for CA signed by itself (Gerando certificado X.509 para CA assinado por ele próprio)

    Escolha a versão 3 do certificado (padrão).

  5. Generating RSA private key for SERVER (1024 bit) (Gerando chave privada RSA para servidor - 1024 bits)

    Nenhuma interação necessária.

  6. Generating X.509 certificate signing request for SERVER (Gerando solicitação de assinatura de certificado X.509 para servidor)

    Crie aqui o nome exclusivo da chave do servidor. As perguntas são quase idênticas às que já foram respondidas para o nome exclusivo da CA. Os dados digitados aqui se aplicam ao servidor Web e não precisam ser idênticos aos dados da CA (por exemplo, se o servidor estiver em outro lugar).

    [Important]Selecionando um nome comum

    O nome comum digitado aqui deverá ser o nome de host completo do servidor seguro (por exemplo, www.exemplo.com). De outra forma, quando o browser acessar o servidor Web, ele emitirá aviso de que o certificado não corresponde ao servidor.

  7. Generating X.509 certificate signed by own CA (Gerando certificado X.509 assinado pela própria CA)

    Escolha a versão 3 do certificado (padrão).

  8. Encrypting RSA private key of CA with a pass phrase for security (Criptografando chave privada RSA da CA com frase secreta por segurança)

    É altamente recomendável criptografar a chave privada da CA com uma senha, por isso, escolha Y e digite uma senha.

  9. Encrypting RSA private key of SERVER with a pass phrase for security (Criptografando chave privada RSA do servidor com frase secreta por segurança)

    Criptografar a chave do servidor com senha significa digitar essa senha todas as vezes que o servidor Web for iniciado. Isso dificulta o início automático do servidor na inicialização da máquina ou a reinicialização do servidor Web. Portanto, é razoável responder N a essa pergunta. Lembre-se de que a sua chave fica desprotegida quando não criptografada com senha e assegure-se de que somente pessoas autorizadas tenham acesso à chave.

    [Important]Criptografando a chave do servidor

    Se você escolher criptografar a chave do servidor com senha, aumente o valor de APACHE_TIMEOUT em /etc/sysconfig/apache2. Caso contrário, você não haverá tempo suficiente para você digitar a frase secreta antes que a tentativa de iniciar o servidor fracasse.

A página de resultados do script contém uma lista com certificados e chaves gerados por ele. Ao contrário da saída do script, os arquivos não foram gerados no diretório local conf, mas nas localizações corretas em /etc/apache2/.

A última etapa é copiar o arquivo do certificado da CA de /etc/apache2/ssl.crt/ca.crt em uma localização em que os usuários possam acessá-lo para incorporá-lo à lista de CAs conhecidas e confiáveis em seus browsers da Web. Caso contrário, o browser acusará que o certificado foi emitido por uma autoridade desconhecida. O certificado é válido por um ano.

[Important]Certificados auto-assinados

Somente use um certificado auto-assinado em um servidor Web que seja acessado pelas pessoas que o reconhecem e confiam em você como autoridade de certificação. Não é recomendado usar esse tipo de certificado em uma loja aberta ao público, por exemplo.

26.6.1.3. Obtendo certificado assinado oficialmente

Existem autoridades de certificação oficiais que assinam seus certificados. O certificado, assinado por uma terceira parte confiável, pode ser confiado inteiramente. Os servidores Web que funcionam para o público geralmente têm um certificado oficialmente assinado.

As CAs oficiais mais conhecidas são Thawte (http://www.thawte.com/ ou Verisign (www.verisign.com). Essas e outras CAs já são compiladas em todos os browsers, de modo que os certificados assinados por elas sejam aceitos automaticamente pelos browsers.

Ao solicitar um certificado oficialmente assinado, em vez de enviar um certificado à CA, você emite uma CSR (Certificate Signing Request - solicitação de assinatura de certificado). Para criá-la, chame o script /usr/share/ssl/misc/CA.sh -newreq.

Em primeiro lugar, o script pede uma senha, com a qual a CSR deve ser criptografada. Em seguida, você é solicitado a digitar um nome exclusivo. Para isso você terá que responder a algumas perguntas, como nome do país ou da organização. Digite dados válidos — tudo que você digitar aqui aparecerá depois no certificado e será verificado. Você não precisa responder a todas as perguntas. Se você não tiver resposta para alguma pergunta ou quiser deixá-la em branco, use “.”. Nome comum é o nome da própria CA — escolha um nome significativo, como CA Minha empresa. Por fim, é necessário digitar uma senha de verificação e um nome de empresa alternativo.

Localize a CSR no diretório em que você chamou o script. O nome do arquivo é newreq.pem.

26.6.2. Configurando o Apache com SSL

A porta padrão das solicitações SSL e TLS no servidor Web é a 443. Não há conflito entre uma recepção “normal” do Apache na porta 80 e uma recepção habilitada por SSL/TLS do Apache na porta 443. Na verdade, HTTP e HTTPS podem ser executados na mesma instância do Apache. Geralmente os hosts virtuais separados são usados para despachar solicitações à porta 80 e à porta 443 para servidores virtuais separados.

[Important]Configuração de firewall

Não se esqueça de abrir o firewall do Apache habilitado por SSL na porta 443. Isso pode ser feito com o YaST, conforme descrito em Seção 4.1.4.1, “Configurando com o YaST”.

Para usar SSL, ele deve ser ativado na configuração global do servidor. Abra /etc/sysconfig/apache2 em um editor e procure APACHE_MODULES. Adicione “ssl” à lista de módulos, caso ele ainda não esteja presente (mod_ssl é ativado por padrão). Em seguida, procure APACHE_SERVER_FLAGS e adicione “SSL”. Se você decidiu criptografar com senha seu certificado de servidor, deverá também aumentar o valor de APACHE_TIMEOUT para que tenha tempo suficiente de digitar a frase secreta quando o Apache for iniciado. Reinicie o servidor para ativar essas mudanças. Não basta recarregar.

O diretório da configuração de host virtual contém um modelo /etc/apache2/vhosts.d/vhost-ssl.template com diretivas específicas de SSL amplamente documentadas. Consulte a configuração geral de host virtual na Seção 26.2.1.2, “Configuração do host virtual”.

Comece apenas ajustando os valores das seguintes diretivas:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

[Important]Hosts virtuais identificados por nome e SSL

É impossível executar vários hosts virtuais habilitados para SSL em um servidor dotado de apenas um endereço IP. Os usuários que se conectam a uma configuração assim recebem uma mensagem de aviso informando que o certificado não corresponde ao nome do servidor toda vez que eles visitam o URL. Um endereço IP ou porta separado(a) é necessário a todo domínio habilitado para SSL para efetivar a comunicação baseada em um certificado SSL válido.