Como configurar o SSL com a hospedagem virtual em massa do apache2 / httpd usando mod_vhost_alias

3

Eu tenho pesquisado bastante agora, mas não consegui encontrar nenhuma resposta.

Estou usando o httpd 2.2.15 e o Centos 6.2.

Eu configurei o apache para hospedagem virtual em massa. Ou seja:

UseCanonicalName off
VirtualDocumentRoot /var/www/html/%0

Eu terei o mesmo domínio "principal" com diferentes subdomínios apontando para os hosts virtuais. Eu criei um certificado auto-assinado para fins de teste com o nome comum * .mydomain.com. Existe um IP para todo o servidor.

Como posso configurar o apache para usar ssl para meus vhosts?

E, se possível, adicionado acima, eu gostaria de conseguir isso também:

  1. Posso definir um diretório ou, preferencialmente, alguns arquivos (por exemplo, página de login) que devem ser excluídos do SSL? Todos os vhosts são basicamente instâncias diferentes do mesmo aplicativo (exceto os que eu menciono em 2 abaixo).

  2. Posso definir alguns vhosts que não devem usar ssl (tenho controle total do nome do subdomínio para eles). Serão dois aplicativos, minha home page (www) e algum aplicativo administrativo. Se não for possível fazer exceções, acho que vou apenas colocá-las em outro servidor.

Exceto os que eu mencionei no item 2 acima, todos os hosts virtuais serão criados automaticamente com base na solicitação dos usuários.

Com base no comentário de @Shanes, atualizo : se o usuário usar https: // quando não deveria, é bom redirecioná-lo para http: //. Se isso não for possível, acho que está tudo bem se receberem uma mensagem de erro. É claro que ok se ambos http e https funcionam, desde que o http funcione para os arquivos desprotegidos (esta pode ser a escolha preferida).

Eu pude encontrar exemplos de como fazer isso usando mod-rewrite com a exceção de que não era para domínios de massa (ou seja, < VirtualHost > foi usado).

Quais são os truques para conseguir isso?

Se não for possível, ficarei muito feliz em receber algumas dicas sobre como fazer isso.

    
por Nicsoft 17.05.2012 / 16:49

1 resposta

4

Em primeiro lugar, você precisa garantir que sua configuração atual esteja preparada para incluir um ouvinte SSL. Você não especificou se está usando o servidor principal ou um <VirtualHost> , mas se estiver usando o servidor principal, então você precisará mudar para um <VirtualHost> .

<VirtualHost *:80>
    ServerName everything.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/html/%0
    # insert logging config, anything else you need..
    <Directory /var/www/html/>
        Order Allow,Deny
        Allow from all
        # Get rid of this if you need to allow htaccess files:
        AllowOverride None
    </Directory>
    RewriteEngine On
    # We're going to insert some Rewrite configuration here in a minute.
</VirtualHost>

Em seguida, adicionaremos um novo VirtualHost executando o SSL.

# Add this if you don't already have it:
Listen 443

<VirtualHost *:443>
    ServerName everything.example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/html/%0

    SSLEngine On
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/private.key

    # insert logging config, anything else you need..
    <Directory /var/www/html/>
        Order Allow,Deny
        Allow from all
        # Get rid of this if you need to allow htaccess files:
        AllowOverride None
    </Directory>
    # if you want to kick someone back to HTTP if they're using HTTPS,
    # do that with Rewrite configuration here.  For example:
    #RewriteRule ^/(non/sensitive/content.*\.html)$ http://%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>

Então, isso nos leva ao ponto em que o conteúdo está sendo veiculado via HTTP e HTTPS. Agora, para forçar o HTTPS para determinados domínios, podemos usar mod_rewrite.

Informações importantes sobre segurança! Você precisa ter muito cuidado aqui, do ponto de vista da segurança. Se você está simplesmente redirecionando tudo em HTTP para o equivalente HTTPS, você pode potencialmente "ocultar" casos em que uma solicitação é enviada por HTTP em vez de HTTPS devido a locais de recursos codificados - e se houver dados confidenciais nessa solicitação, era apenas enviado pela internet, sem criptografia. Você precisará ponderar esse risco em relação à sua capacidade de detectar e corrigir esse tipo de problema, a falta de facilidade com o usuário de uma página de erro se algo estiver confuso e a sensibilidade dos dados.

Para forçar o SSL para determinados locais, você vai querer inserir a configuração do mod_rewrite no vhost da porta 80 (eu comentei na sua configuração acima). Você pode criar praticamente qualquer tipo de comportamento que desejar, desde que diretórios ou domínios sejam excluídos; Vou dar alguns exemplos:

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_HOST} !^static\.example\.com$
# Exclude the directory /images
RewriteCond %{REQUEST_URI} !^/images/
# Exclude requests to .css files
RewriteCond %{REQUEST_URI} !\.css$
# This is the more secure but less user friendly version - block requests to the non-secured port.
RewriteRule ^ - [F,L]
# This is the user friendly version, where you need to be especially careful that
# your site never sends sensitive data to http accidentally:
#RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Ou, se você quiser fazer o redirecionamento amigável apenas para solicitações ao diretório base e o comportamento de erro para outras pessoas:

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_HOST} !^static\.example\.com$
# ..insert other exclusion conditions here..
RewriteRule ^/$ https://%{HTTP_HOST}/ [R=301,L]

# Exclude the domain "static.example.com"
RewriteCond %{HTTP_HOST} !^static\.example\.com$
# ..insert other exclusion conditions here..
RewriteRule ^ - [F,L]

Se esses exemplos não atenderem às suas necessidades, avise-nos.

    
por 17.05.2012 / 20:05