7

Estoy tratando de proteger el directorio ~/public_html/dev usando http auth basic, pero para hacerlo seguro quiero ejecutarlo a través de ssl.Hacer autenticación HTTP a través de HTTPS con reescritura de URL

La sección central del siguiente archivo .htaccess cambia a https si el URI de solicitud comienza con /dev y funciona.

La última sección del archivo funciona igual de bien pero no funciona correctamente con la redirección de https.

Básicamente quiero poder escribir http://www.example.com/dev/some_sub_dir/ y ser redirigido a https://www.example.com/dev/some_sub_dir/ y solicitar el nombre de usuario y la contraseña de http auth.

Lo que ocurre actualmente es que si me meto en http://www.example.com/dev/some_sub_dir/ me piden un nombre de usuario y una contraseña en el puerto 80, y luego vuelvo a preguntarme por el puerto 443. Entonces mis credenciales se envían dos veces, una a encriptado Hacer que toda la URL de https reescriba un poco sin sentido.

La razón para hacer esto es para que no pueda enviar accidentalmente mi usuario/pase sobre http; https siempre se usará para acceder al directorio /dev.

El .htaccess se encuentra en el directorio ~/public_html/dev.

# Rewrite Rules for example.com 
RewriteEngine On 
RewriteBase/

# force /dev over https 
RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^/dev 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

# do auth 
AuthType Basic 
AuthName "dev" 
AuthUserFile /home/matt/public_html/dev/.htpasswd 
Require valid-user

Respuesta

10

Hay un truco relativamente popular para forzar HTTPS antes de hacer la autenticación básica. Vi por primera vez aquí:

http://blog.jozjan.net/2008/02/htaccess-redirect-to-ssl-https-before.html

Se trata de utilizar un documento de error personalizado para manejar lo que sucede después de la comprobación HTTPS falla.

Por ejemplo, tengo una sola página que necesito para forzar HTTPS, así que hice esto en un archivo .htaccess:

<FilesMatch "secure-page.php"> 
    SSLRequireSSL 
    ErrorDocument 403 https://www.example.com/secure-page.php 
    AuthType Basic 
    AuthName "Secure Page" 
    AuthUserFile /var/www/whatever/.htpasswdFile 
    Require valid-user 
</FilesMatch> 

que se traduce en:

si la página solicitada es ' secure-page.php '- si no es HTTPS, luego redirija a una' página de error 'personalizada - la' página de error 'es realmente solo la versión HTTPS de la página - en la segunda solicitud, dado que ahora pasa la comprobación HTTPS, realice Basic Auth :)

Puede extender este concepto a un directorio u otro uso casos: su 'página de error' personalizada podría ser una página php que redirecciona a la URL correcta de HTTPS, o una secuencia de comandos CGI como en el enlace de arriba ...

+0

que es bastante escurridizo – Matthew

+0

Sí, probablemente no sea una solución óptima, pero después de cuatro horas de encontrarme en la misma situación que tú, fue el mejor Pude encontrar :) – siliconrockstar

+0

Los probé todos y luego algunos; esta solución funcionó lo mejor para mí. Eliminé la directiva FilesMatch y luego verifiqué todo, lo que funciona especialmente bien si el visitante no define un archivo, p. index.php. http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html también le dará mucha información buena; basado en esto también incluí SSLOptions + StrictRequire – Praesagus

2

Proteger el contenido con autenticación básica nunca funcionará de manera segura a través de HTTP.

Una vez que el usuario ha ingresado su nombre de usuario y contraseña, se envía sin cifrar para cada vista de página a ese sitio; no solo envía la hora que se le pide al usuario.

Tiene que tratar las solicitudes a través de HTTP como no autenticadas, y hacer todo conectado cosas a través de HTTPS.

Muchos sitios web han usado HTTPS para el inicio de sesión, usando formularios y cookies, en lugar de autenticación básica, y luego van a HTTP después. Esto significa que su cookie 'estás conectado' se envía sin cifrar. Cada objetivo valioso ha sido pirateado debido a esto, y ahora gmail está cambiando a HTTPS completo y otros seguirán.

No tiene los mismos problemas de escalabilidad que otros han tenido que los ha mantenido lejos del HTTPS computacionalmente más costoso. Si su página de inicio admite el acceso HTTPS, úselo en todo momento.

+0

Me molesta que al volver a leer la pregunta, parece que usted sabe bien el consejo que escribí; Creo que es útil para otros que lean el hilo más tarde para ver mis razones, sin embargo, así que lo dejaré. – Will

+1

¿Has leído la pregunta? Él quiere usar autenticación HTTP a través de HTTPS. Pero la autenticación tiene lugar antes de la redirección de HTTP a HTTPS. Por lo tanto, al solicitar * http: //example.com/dev/...* se solicita la autenticación, la redirección toma lugar y la solicitud de * https: //example.com/dev/...* solicita otra autenticación. Lo que él quiere es primero redirigir y luego solicitar la autenticación. – Gumbo

+0

@Gumbo yeap Lo recogí en la segunda lectura, y lo noté como un comentario – Will

0

¿Funciona poner su sección de autenticación en una etiqueta <Location> o <LocationMatch> usando el protocolo como el término?

4

Me encontré con el mismo problema y finalmente encontré una solución fea, pero funciona. Coloque la regla de reescritura en una directiva de Directorio en httpd.conf o uno de sus archivos conf.d (es decir, en la configuración del servidor "Principal"). A continuación, coloque las líneas Auth * y Require lines in a Directory inside el contenedor <VirtualHost _default_:443> en ssl.conf (o donde esté definido su SSL VirtualHost).

Para mí, esto significa la creación de un archivo con /etc/httpd/conf.d/test.conf:

<Directory "/var/www/html/test"> 
     # 
     # force HTTPS 
     # 
     RewriteEngine On 
     RewriteCond %{HTTPS} off 
     RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 
</Directory> 

...y luego añadiendo el siguiente dentro de /etc/httpd/conf.d/ssl.conf justo por encima de la etiqueta </VirtualHost>:

<Directory "/var/www/html/test"> 
     # 
     # require authentication 
     # 
     AuthType Basic 
     AuthName "Please Log In" 
     AuthUserFile /var/www/auth/passwords 
     Require valid-user 
</Directory> 

Hacer esto hace que Apache aplicar el RewriteRule a todas las solicitudes y los requisitos de autenticación sólo para las solicitudes en el 443 VirtualHost.

1

Si coloca las reglas de reescritura en la configuración principal, fuera de cualquiera o similar, la reescritura se realizará antes de la autenticación.

Ver Rewrite Tech

0

Lo hago de esta manera. Simplemente permitan No SSL ya que será redirigido a continuación requieren autenticación SSL una vez en ...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL 

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

AuthUserFile /.htpasswd 
AuthName "Enter your Username and Password:" 
AuthType Basic 
require valid-user 
Allow from env=IS_NON_SSL 
4

Sobre la base de la respuesta de siliconrockstar, añado un script php que funcionaría en el caso en el que desea forzar SSL en todos los archivos, no solo el caso de un solo archivo mostrado por siliconrockstar. Aquí nuevamente funciona junto con el archivo htaccess.

El .htaccess para proteger a toda directorio:

SSLRequireSSL 
    ErrorDocument 403 /yourphp.php 
    AuthType Basic 
    AuthName "Secure Page" 
    AuthUserFile /some_path_above_the_html_root/.htpasswdFile 
    Require valid-user 

El php llamado por el .htaccess (la ruta dada por el php en esta muestra .htaccess es la raíz de su sitio), lo que obliga a https en el URL llamaste:

<?php 
$path = "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
if ($_SERVER['SERVER_PORT'] == 80) { 
    header("Status: 302 Moved\n"); 
    header("Location: ".$path."\n\n"); 
} 
else { 
    header("Content-type: text/html\n\n"); 
    echo "How did you get here???"; 
} 
?> 

Si tu sitio no tiene un certificado SSL, tendrás que instalar uno. Si este es su único uso, puede instalar un certificado autofirmado. En un VPS de cPanel con su sitio en una IP dedicada, eso requiere de unos momentos: en WHM, visite

. Generar un certificado SSL y la solicitud de firma de

continuación

Dos. Instalar un certificado SSL en un dominio

0

Sé que esta es una vieja pregunta, pero tuve problemas con un simple ht.acceso redirigido Después de muchos otros problemas y respuestas, finalmente armé este htaccess que funciona según lo previsto.

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

AuthName "Private Server" 
AuthUserFile /var/www/.htpassword 
AuthType Basic 
require valid-user 
Order allow,deny 
Allow from env=!HTTPS 
Satisfy Any 

Tomar nota de la

Order allow,deny 

¿Qué es lo que le faltaba a muchas otras respuestas que he visto ya que permitiría a las personas cuando se utiliza directamente en https. La otra sección que le faltaba a mis pruebas fue la siguiente:

Satisfy Any 

Este fragmento siguiente es lo que permite a los clientes que no son SSL con la redirección. El env var de HTTPS se establece desde el mod_ssl para clientes ssl.

Allow from env=!HTTPS 
+1

Esto no funciona, solo permite que pase todo el tráfico – nbsp

Cuestiones relacionadas