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.
Considerações iniciais
# rpm -qa | grep httpd # rpm -qa | grep ssl
Se não estiverem, instale-os com o comando:
# yum install httpd mod_ssl openssl -y
Obs.: como boa prática, faça cópias de segurança dos arquivos de configuração antes de alterá-los.
Neste artigo utilizaremos quatro sites: site1.com, site2.com, site3.com e site4.com.
Crie um diretório para cada site utilizado:
# mkdir /var/www/site{1,2,3,4}.com
Cada um destes diretórios será utilizado como base para cada site configurado.
Crie um arquivo “index.html”em cada diretório com um conteúdo simples que identifique cada site, como “Site X”, por exemplo.
Para os testes desta configuração, apenas inseri no arquivo hosts do cliente os nomes dos sites, apontando-os para o IP do servidor web. Funciona perfeitamente.
Assim:
- 172.16.1.192 www.site1.com
- 172.16.1.192 www.site2.com
- 172.16.1.192 www.site3.com
- 172.16.1.192 www.site4.com
Em ambientes de produção, o DNS (interno ou externo) deve resolver os nomes dos sites para o IP do seu servidor web para que consiga acessar os sites por nome.
Sites sem SSL (HTTP)
Assumindo que o Apache esteja configurado para atender às requisições na porta 80 (linha “Listen 80”), edite o arquivo “httpd.conf” e certifique-se que a linha abaixo não esteja comentada:
Uma sessão de VirtualHost, como abaixo, deve ser inserida no final do arquivo para cada site hospedado no servidor, adaptando cada linha de acordo com o nome do site (atenção ao DocumentRoot que é diferente para cada site).
Neste exemplo, utilizaremos os sites com números ímpares: www.site1.com e www.site3.com:
ServerAdmin webmaster@site1.com
ServerName site1.com
ServerAlias www.site1.com
ErrorLog /var/log/httpd/site1.com-error_log
CustomLog /var/log/httpd/site1.com-access_log common
</VirtualHost>
Observe que as sessões são customizadas para cada site, de forma que seja possível identificar os arquivos de cada site.
O Apache identificará cada site pela instrução ServerAlias, ou seja, “www.site1.com” e “www.site3.com”.
Para verificar se a configuração está correta, digite:
# httpd -S
A saída deverá ser como abaixo:
VirtualHost configuration: wildcard NameVirtualHosts: *: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) Syntax OK
O site default a ser apresentado (se acessado por http://IP ou hostname do servidor hospedeiro) será o “site1.com”.
Isto indica que a sintaxe da configuração está correta e o Apache está pronto para assumi-la.
Carregue o Apache, com:
# service httpd start
Ou:
# /etc/init.d/httpd start
Abra seu navegador favorito e digite o nome de um dos sites (“www.site1.com”ou “www.site3.com”), veja que o conteúdo apresentado é referente ao site que você solicitou.
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:
Neste exemplo, temos os sites “www.site2.com” e “www.site4.com” configurados para utilizar SSL:
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?)#8221;>
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>
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?)#8221;>
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 aceito, o conteúdo apresentado será o referente ao site que você solicitou.