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:
- http://www.apache.org/ (versão 2 e acima)
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