Virtual Host com Apache + SSL

Virtual Host com Apache + SSL

Autor: Johnson Teixeira do Nascimento <jtnascimentov2 at yahoo.com.br>
Data: 13/04/2005

Introdução



No artigo anterior (Virtual Host com Apache) eu havia explicado como se montava um Virtual Host no Apache, mas assumindo que o Apache já estava instalado e sem SSL.

Desta vez vou explicar como montar um VH com SSL partindo do início da instalação do Apache. Neste artigo não vou incluir o PHP, já que existe uma gama muito grande de assuntos relativos ao Apache com PHP.

Mãos à obra!

Vamos usar como exemplo dois endereços diferentes:
  • www.meusite1.com
  • www.meusite2.org

Vamos modificar três arquivos:
  • /etc/hosts
  • httpd.conf
  • ssl.conf

OBS: Os arquivos httpd.conf e ssl.conf normalmente estão localizados em /usr/local/apache2/conf/, /etc/httpd/conf/ ou /etc/apache/conf/. Mas isto vai depender da distribuição usada ou onde você pediu para instalar o Apache.


Instalando o OpenSSL



Download do OpenSSL:
1. Descompacte os arquivos com o comando:

$ tar -zxvf openssl-xxx.tar.gz

Substitua o "xxx" pela versão do OpenSSL.

2. Por convenção, vamos instalar o OpenSSL no diretório "/usr/local/openssl", para que não esqueçamos onde o instalamos.

Execute o comando:

$ ./configure --prefix=/usr/local/openssl

Se aparecer uma mensagem do tipo "NOTE: If in doubt, on Unix-ish systems use './config'." Não se assuste, execute o seguinte:

$ ./config --prefix=/usr/local/openssl

Este "prefix" indica o lugar onde futuramente o programa será instalado.

3. Agora digite "make" para que o programa seja compilado.

4. Se tudo correu bem, torne-se root e digite "make install" para instalar o programa:

$ su
# make install


Pronto, o OpenSSL está instalado em /usr/local/openssl.


Instalando o Apache



Download do Apache:
1. Descompacte os arquivos com o comando:

$ tar -zxvf httpd-xxx.tar.gz

Substitua o "xxx" pela versão do Apache.

2. Execute o comando:

$ ./configure --with-ssl=/usr/local/openssl --enable-so --enable-ssl

3. Digite "make" e se tudo correr bem, vire root e "make install".

Por padrão o Apache será instalado em /usr/local/apache2.


Configurando o Apache



Primeiro abra o arquivo /etc/hosts e acrescente as seguintes linhas:

127.0.0.1    meusite1   www.meusite1.com   meusite1
127.0.0.1    meusite2   www.meusite2.org   meusite2

Editando o arquivo httpd.conf:

NameVirtualHost *

  <VirtualHost *>
    ServerName localhost
    DocumentRoot /usr/local/apache2/htdocs
  </VirtualHost>

  <VirtualHost *>
    ServerName www.meusite1.com
    DocumentRoot /usr/local/apache2/htdocs/meusite1
  </VirtualHost>

  <VirtualHost *>
    ServerName www.meusite2.org
    DocumentRoot /usr/local/apache2/htdocs/meusite2
  </VirtualHost>

OBS: Você deve ter os diretórios meusite1 e meusite2 no seu DocumentRoot. Preste atenção na linha DocumentRoot. Se o seu DocumentRoot está em /var/www/html, você deve modificar a linha para "DocumentRoot /var/www/http/meusite1".


Iniciando o Apache pela primeira vez



Digite:

# apachectl start
ou
# /usr/local/apache2/bin/apachectl start
ou
# /etc/init.d/httpd start

Vai depender da distribuição que você está usando.

Abra o navegador e digite os endereços criados:

www.meusite1.com
www.meusite2.org

Observe que o navegador automaticamente adiciona http:// antes dos nomes dos sites, essa observação vai ser útil no final.

Pronto, o Virtual Host foi criado, mas ele ainda não é seguro.


Gerando certificados SSL e modificando o arquivo ssl.conf



1. Vá até onde foi instalado o OpenSSL e digite:

# openssl req -new > new.cert.csr

Vai aparecer algo como:

Generating a 1024 bit RSA private key
...............++++++
......++++++
writing new private key to \\\\\\\' privkey.pem\\\\\\\'

Enter PEM pass phrase:

Informe uma senha (mas não esqueça dela) e responda as perguntas que se seguirem.

2. Digite:

# openssl rsa -in privkey.pem -out new.cert.key

Você precisará informar a senha dada anteriormente.

3. Digite:

# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 1825

4. Vamos renomear os arquivos new.cert.cert e new.cert.key:

# mv new.cert.cert server.crt
# mv new.cert.key server.key


5. No diretório /usr/local/apache2/conf deve existir os diretórios ssl.crt e ssl.key, se não existir, crie.

6. Copie o arquivo server.crt para o diretório /usr/local/apache2/conf/ssl.crt e o arquivo server.key para o diretório /usr/local/apache2/conf/ssl.key.

7. Abra o arquivo ssl.conf que está em /usr/local/apache2/conf/.

8. Tem uma parte no arquivo ssl.conf que se inicia com <VirtualHost _default_:443>...'um monte de coisa'... e termina com </VirtualHost>. Entre eles adicione o seguinte:

ServerName www.meusite1.com:443
DocumentRoot /usr/local/apache2/htdocs/meusite1

Como padrão, será usada a porta 443.

9. Pare o Apache com o comando:

# /usr/local/apache2/bin/apachectl stop

E o inicie com o comando:

# /usr/local/apache2/bin/apachectl startssl

Este comando significa que o Apache será iniciado com suporte ao SSL.

Pronto, o Virtual Host seguro foi criado. Agora para acessar seu site, no navegador, digite o endereço desta forma:

https://www.meusite1.com

Observe o "s" logo depois do http, se não for incluído no endereço, será requisitado o site não seguro.

Esta parte foi baseada na dica do Thiago Alves que está em:

Considerações finais e solução de problemas



Em alguns casos, pode ser que quando for requisitar o endereço, o navegador liste o conteúdo do diretório ao invés de mostrar o index.html por exemplo. Para resolver isto, tanto no http.conf e ssl.conf, mude para:

NameVirtualHost *

   <VirtualHost *>
       ServerName localhost
       DocumentRoot /usr/local/apache2/htdocs
       DirectoryIndex index.html
    </VirtualHost>

    <VirtualHost *>
       ServerName www.meusite1.com
       DocumentRoot /usr/local/apache2/htdocs/meusite1
       DirectoryIndex index.html
    </VirtualHost>

    <VirtualHost *>
       ServerName www.meusite2.org
       DocumentRoot /usr/local/apache2/htdocs/meusite2
       DirectoryIndex index.html
    </VirtualHost>

Observe que foram adicionadas as linhas DirectoryIndex que apontam para o index.html. Isto quer dizer que você não precisa requisitar www.meusite1.com/index.html para ver o conteúdo de index.html, simplesmente requisitará www.meusite1.com e verá seu conteúdo.

Pode ser que onde foi colocado o endereço da máquina localhost como Virtual Host em:

<VirtualHost *>
       ServerName localhost
       DocumentRoot /usr/local/apache2/
       DirectoryIndex /index.html
</VirtualHost>

dê problema, como do tipo listar o conteúdo do diretório /usr/local/apache2/ para qualquer site que for requisitado. Para resolver o problema, apenas o retire.

Como teste, comente as linhas dos Virtual Hosts apenas do arquivo http.conf, como no exemplo seguinte:

#<VirtualHost *>
#      ServerName www.meusite1.com
#      DocumentRoot /usr/local/apache2/htdocs/meusite1
#      DirectoryIndex /index.html
#</VirtualHost>

Logo, pare o Apache e com o comando "/usr/local/apache2/bin/apachectl startssl", inicie-o novamente.

Tente acessar o endereço http://www.meusite1.com, observe que é sem o "s". O Apache dará uma mensagem explicando a situação.

Comentários