Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ma10/19ae4c5c6a5c0069228c0b9e74cc89b3 to your computer and use it in GitHub Desktop.
Save ma10/19ae4c5c6a5c0069228c0b9e74cc89b3 to your computer and use it in GitHub Desktop.
ApacheのBasic認証をHTTPSで行わせる

ApacheのBasic認証をHTTPSで行わせる

背景

mod_rewriteを使ってHTTPアクセスをHTTPSにリダイレクトする設定にしてあるページにBasic認証をかけている場合、なにも考えずに設定すると以下のようなことが起こる:

  1. 普通にHTTPでアクセス
  2. Basic認証が求められるが、この認証は暗号化されない
  3. 認証後HTTPSバージョンにリダイレクトされる
  4. 再度Basic認証が求められる (これは暗号化される)

つまり、以下2つの問題がある:

  1. 暗号化されない状態で認証情報が送信される
  2. 同じ認証動作が2度必要になる

これを解決する。

アプローチ

  • HTTPによるアクセスは認証がない状態で認めるが、必ずHTTPS版にリダイレクトする
  • HTTPSのアクセスは認証が必用

Apache 2.4での設定

※最初に書いた方法では実はうまくいかないことが判明したので修正。

RewriteEngine on
 
# HTTPSのアクセスはリダイレクト不要なので無視
RewriteCond %{HTTPS} off

# LetsEncryptを使っている場合に、 /.well-known/* へのアクセスはリダイレクトしないようにする
# 設定するコンテクストによってパターンの記述が異なるはずなので注意が必要
RewriteRule ^\.well-known/* - [L]

# その他のアクセスはhttps://*にリダイレクト
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# HTTPSアクセスの場合のみ認証を求める
<If "%{HTTS} == 'on'">

  # Basic認証
  AuthType Basic
  AuthName "www.example.com authentication"
  AuthUserFile /path/to/passwd-file
  Require valid-user
</If>
@ootsuka-biz
Copy link

非常に有用な情報なのですが、
恐らくtypoと思われる記述がありましたので、
指摘させてください。

%{HTTS}→%{HTTPS}

# HTTPSアクセスの場合のみ認証を求める
<If "%{HTTS} == 'on'">

# HTTPSアクセスの場合のみ認証を求める
<If "%{HTTPS} == 'on'">

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment