Servidor Apache hospedando diversos sites com e sem SSL

Neste artigo descrevo como utilizar um mesmo servidor Web Apache para hospedar diversos sites que utilizam, ou não, SSL. As configurações apresentadas foram testadas no CentOS versões 5.9 e 6.3, mas funcionarão normalmente também para qualquer distribuição, apenas realizando pequenos ajustes.

[ Hits: 28.716 ]

Por: Celso S. Faria em 22/03/2013


Sites com SSL (HTTPS)



Neste exemplo utilizaremos os sites com números pares: "www.site2.com" e "www.site4.com".

Os pacotes instalados juntamente com o Apache, anteriormente, possuem papéis essenciais.

O "mod_ssl" habilita o Apache a utilizar conexão segura (HTTPS) e o OpenSSL gera os certificados de chave pública e privada.

Não abordaremos a geração de chaves públicas e privadas, pois utilizaremos os arquivos gerados no momento da instalação do OpenSSL e mod_ssl.

As CA's possuem procedimentos para geração destas chaves, como a encontrada em:
Você pode utilizar chaves diferentes para cada site, inclusive certificados válidos assinados por diversas organizações, como Certisign, Verisign, SERASA, entre outros.

Para isto, basta alterar (dentro da sessão de cada site) a instrução SSLCertificateFile e SSLCertificateKeyFile.

Se o certificado for assinado por uma CA, então a instrução SSLCACertificateFile deve ser especificada.

Em seguida, edite o arquivo /etc/httpd/conf.d/ssl.conf e certifique-se que a linha abaixo exista (fora da sessão VirtualHost) e que não esteja comentada:

NameVirtualHost *:443


Uma seção, como abaixo, deve ser inserida no arquivo para cada site hospedado no servidor que utilize SSL, adaptando cada linha de acordo com o nome do site (atenção ao "DocumentRoot" que é diferente para cada site).

Neste exemplo, temos os sites "www.site2.com" e "www.site4.com" configurados para utilizar SSL:

<VirtualHost _default_:443>
    DocumentRoot "/var/www/site2.com"
    ServerName www.site2.com:443
    ErrorLog /var/log/httpd/site2.com-ssl_error_log
    TransferLog /var/log/httpd/site2.com-ssl_access_log
    LogLevel warn
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
       # Caminho para o certificado
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
       # Caminho para a chave privada utilizada para a geração do certificado
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
       # Caminho para o certificado/cadeia da CA que assinou o certificado (apenas em caso de certificados válidos)
       SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
    </Files>
    <Directory "/var/www/cgi-bin">
       SSLOptions +StdEnvVars
    </Directory>
    SetEnvIf User-Agent ".*MSIE.*" \
           nokeepalive ssl-unclean-shutdown \
           downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_request_log \
           "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

<VirtualHost _default_:443>
    DocumentRoot "/var/www/site4.com"
    ServerName www.site4.com:443
    ErrorLog /var/log/httpd/site4.com-ssl_error_log
    TransferLog /var/log/httpd/site4.com-ssl_access_log
    LogLevel warn
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
       # Caminho para o certificado
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
       # Caminho para a chave privada utilizada para a geração do certificado
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
       # Caminho para o certificado/cadeia da CA que assinou o certificado (apenas em caso de certificados válidos)
       SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
       SSLOptions +StdEnvVars
    </Files>
    <Directory "/var/www/cgi-bin">
       SSLOptions +StdEnvVars
    </Directory>
    SetEnvIf User-Agent ".*MSIE.*" \
           nokeepalive ssl-unclean-shutdown \
           downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_request_log \
           "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>


Como temos mais que um site utilizando SSL, pode-se utilizar um certificado diferente para cada site, basta gerá-los e alocá-los devidamente.

Verifique se tudo está correto utilizando o comando:

# httpd -S

A saída deverá ser como abaixo:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1.com (/etc/httpd/conf/httpd.conf:1012)
         port 80 namevhost site1.com (/etc/httpd/conf/httpd.conf:1012)
         port 80 namevhost site3.com (/etc/httpd/conf/httpd.conf:1030)
*:443                  is a NameVirtualHost
         default server www.site2.com (/etc/httpd/conf.d/ssl.conf:17)
         port 443 namevhost www.site2.com (/etc/httpd/conf.d/ssl.conf:17)
         port 443 namevhost www.site4.com (/etc/httpd/conf.d/ssl.conf:54)
Syntax OK

O site default a ser apresentado (se acessado por https://IP ou hostname do servidor hospedeiro) será o "site2.com".

Isto indica que a sintaxe da configuração SSL está correta e o Apache está pronto para assumi-la também.

Recarregue o Apache, com:

# service httpd reload
Ou:
# /etc/init.d/httpd reload

Abra seu navegador favorito e digite o nome de um dos sites ("www.site2.com" ou "www.site4.com") precedido de https://, a mensagem de certificado inválido será exibida e assim que aceita o conteúdo apresentado, será o referente ao site que você solicitou.

Fontes


Página anterior    

Páginas do artigo
   1. Considerações iniciais
   2. Sites sem SSL (HTTP)
   3. Sites com SSL (HTTPS)
Outros artigos deste autor

Integrando Nagios e Google Maps

Apache Mod_Proxy como Front-End de acesso e balanceamento de diversas aplicações web

Restauração e registro do RedHat após utilização de repositórios CentOS

Openfire integrado em uma floresta Active Directory

Nagios - Configurando níveis de acesso e autenticação centralizada no Active Directory

Leitura recomendada

Vsftp - Instalação de um servidor FTP focado em segurança

Internet com a velocidade aumentada (Regulamento ANATEL)

Apache em chroot + MySQL + PHP + mod_security + mod_evasive + vsftpd + Fail2ban + Debian Squeeze

Transações Financeiras (Warsaw vs User Agent Overrider) - Itaú Bankline 30 horas

Servidor de Internet, Firewall, Logs - Ubuntu 10.04.3 LTS Lucid Lynx

  
Comentários
[1] Comentário enviado por danniel-lara em 22/03/2013 - 09:39h

Parabéns pelo Artigo muito bom mesmo

[2] Comentário enviado por MarceloTheodoro em 22/03/2013 - 11:46h

Artigo veio em boa hora. :)
Valeu!!

[3] Comentário enviado por djcelsodub em 22/03/2013 - 12:38h

Daniel e Marcelo:

Obrigado por seus comentários.
Fico feliz em saber que o artigo ajudou.

Celso Faria
Americana/SP

[4] Comentário enviado por Teixeira em 28/03/2013 - 19:29h

Parabéns pelo artigo.

[5] Comentário enviado por djcelsodub em 29/03/2013 - 20:41h

Teixeira,

Obrigado pelo seu comentário.

Celso Faria
Americana/SP

[6] Comentário enviado por mayconbelfort em 26/07/2013 - 10:21h

Caro djcelsodub,

No meu caso, o apache está configurado para a porta 8001, mas ao digitar o nome do site não deu nada!

O que pode ser?

Obrigado.

[7] Comentário enviado por djcelsodub em 26/07/2013 - 13:26h

Olá mayconbelfort,

Por padrão a porta de HTTP é 80 e HTTPS é 443.
No seu caso, você alterou o "Listen 80" para "Listen 8001". Sendo assim, você deve substituir "80" por "8001" em todas as configurações que referenciam a porta default "80". O mesmo vale para a porta HTTPS.
Como a porta default não precisa ser especificada (pois é implícito na requisição) ao servidor, se esta porta é alterada ela precisa ser especificada na URL.

Como exemplo utilizando a sua configuração na porta 8001, os sites que citei no artigo devem ser acessados assim:

www.site1.com:8001
www.site3.com:8001

Espero ter ajudado.

Abs.

Celso Faria
Americana/SP


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts