web-dev-qa-db-fra.com

Forcer correctement SSL avec .htaccess, pas de double authentification

J'essaie de forcer SSL avec .htaccess sur un hôte partagé. Cela signifie que je n’ai accès qu’à .htaccess et pas à la configuration principale VirtualHost. Je sais que vous pouvez mettre une règle dans le fichier de configuration VirtualHost pour forcer SSL qui sera récupéré ici (et sur lequel on agira en premier), empêchant ainsi la double authentification, mais je n'y arrive pas.

Voici les progrès que j'ai accomplis:

Config 1

Cela fonctionne plutôt bien mais cela force la double authentification si vous visitez http://example.com - une fois pour http et une fois pour https. Une fois connecté, il redirige automatiquement http://example.com/page1.html vers le https coutnerpart très bien:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]


RewriteEngine on
RewriteCond %{HTTP_Host} !(^www\.example\.com*)$
RewriteRule (.*) https://www.example.com$1 [R=301,L]


AuthName "Locked"
AuthUserFile "/home/.htpasswd"
AuthType Basic
require valid-user

Config 2

Si j'ajoute le texte suivant en haut du fichier, cela fonctionnera beaucoup mieux car il basculera sur SSL avant de demander le mot de passe:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_Host} eq "example.com"
ErrorDocument 403 https://example.com

Il est judicieux de savoir comment utiliser l'option SSLRequireSSL et le ErrorDocument 403 pour rediriger vers la version sécurisée du site. Mon seul reproche est que si vous essayez d'accéder à http://example.com/page1.html, il sera redirigé vers https://example.com/

Donc, il force SSL sans double connexion, mais il ne transfère pas correctement les ressources non-SSL à leurs homologues SSL.

En ce qui concerne la première configuration, Insyte a mentionné "tiliser mod_rewrite pour effectuer une redirection simple est un peu exagéré. Utilisez plutôt la directive Redirect. Il est possible que cela puisse même résoudre votre problème, car je crois que les règles mod_rewrite font partie des dernières directives à traiter, juste avant que le fichier ne soit réellement extrait du système de fichiers "

Je n'ai pas eu une telle chance de trouver une option de configuration force-ssl avec la directive redirect et n'ai donc pas pu tester cette théorie.

6
cwd

Si vous avez une exécution côté serveur telle que php ou cgi, définissez votre document ErrorDocument sur un fichier ne nécessitant pas d'authentification. Ce fichier doit rediriger le client vers le bon emplacement. Apache définira plusieurs variables d'environnement préfixées par REDIRECT_ pour vous aider, et l'environnement d'origine est préservé - voir http://httpd.Apache.org/docs/trunk/custom-error.html .

Dans votre .htaccess, faites comme votre deuxième exemple ci-dessus, mais faites de ErrorDocument un document interne:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_Host} eq "example.com"
ErrorDocument 403 /err_redirect.php
AuthName "Locked"
AuthUserFile "/home/.htpasswd"
AuthType Basic
require valid-user
<Files /err_redirect.php>
  AuthType none
</Files>

Ensuite, dans ce document d'erreur, envoyez le statut HTTP approprié et l'en-tête Location. Voici un exemple simple en php:

<?php
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
?>
6
user5244

Cela fonctionne parfaitement pour ce que j'essaie de faire. J'ai quelques outils d'administration basés sur PHP dans les répertoires respectifs sous /admin/, dans /admin/.htaccess j'ai énuméré:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_Host} eq "www.example.com"
ErrorDocument 403 https://www.example.com/admin/

AuthName "Enter your credentials"
AuthType Basic
AuthUserFile /etc/httpd/passwd/passwordfile
Require user valid-user

lorsque vous passez à example.com/admin non sécurisé, il le redirige vers example.com/admin sécurisé, puis vous invite à vous authentifier.

3
Sm0k3

J'ai eu le même problème, et je l'utilise maintenant:

AuthType Basic
AuthName "Protected area"
# your auth provider setup here
Require expr "%{ENV:HTTPS} !~ /on/i"
Require valid-user

RewriteEngine On

# Redirect alias to preferred hostname  
RewriteCond expr "! %{HTTP_Host} -strmatch '%{SERVER_NAME}'"
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

# Redirect http:// to https://
RewriteCond expr "%{ENV:HTTPS} !~ /on/i"
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

Fondamentalement, il accorde l'accès si http:// est utilisé, mais redirige toutes les demandes vers https:// dans ce cas.

J'utilise "%{ENV:HTTPS} !~ /on/i" parce que j'ai trouvé certains systèmes (par exemple, derrière les proxys de terminaison SSL) ne définissent pas HTTPS sur "off" comme le fait Apache avec http://, ni sur "on" au lieu de "On" avec https://. J'ai également ajouté la redirection vers le SERVER_NAME, au cas où quelqu'un le voudrait.

Je n'ai pas de certificat pour tous mes alias existants, il est donc essentiel de rediriger d'abord vers le nom d'hôte par défaut dans ce cas.

1
xsrf