プロジェクト

全般

プロフィール

Apache mod autoindex » 履歴 » バージョン 5

健二 酒井, 2019/11/13 22:09

1 5 健二 酒井
# Apache mod autoindex
2 1 健二 酒井
3 1 健二 酒井
## 概要
4 1 健二 酒井
5 1 健二 酒井
あったことを適当に書いてく
6 1 健二 酒井
7 1 健二 酒井
## クライアント認証とOption Index
8 1 健二 酒井
9 1 健二 酒井
### やりたい事
10 1 健二 酒井
11 1 健二 酒井
- 特定ディレクトリにクライアント認証をかけたい
12 4 健二 酒井
- https://example.com/ でアクセスしたときにapacheのインデックスページを出したい
13 1 健二 酒井
14 1 健二 酒井
### 設定状況
15 1 健二 酒井
16 1 健二 酒井
こんなディレクトリを持っていたとする:
17 1 健二 酒井
18 1 健二 酒井
- DocumentRoot
19 1 健二 酒井
  - ClientVerifyDir
20 1 健二 酒井
  - FooDir
21 1 健二 酒井
  - BarDir
22 1 健二 酒井
23 1 健二 酒井
こんな設定だったりする:
24 1 健二 酒井
25 1 健二 酒井
- ディレクトリClientVerifyDirにクライアント認証をかけている
26 1 健二 酒井
- ディレクトリDocumentRootにはクライアント認証をかけていない
27 1 健二 酒井
- DocumentRootにOption +Indexがついている
28 1 健二 酒井
- index.htmlとかはない
29 1 健二 酒井
30 1 健二 酒井
### 何が起きた
31 1 健二 酒井
32 4 健二 酒井
https://example.com/ でアクセスしたときにSSLのネゴシエーションに失敗する
33 1 健二 酒井
34 1 健二 酒井
エラーログはこんな感じ
35 1 健二 酒井
36 1 健二 酒井
```
37 1 健二 酒井
SSL Library Error: error:140890C7:SSL routines:ssl3_get_client_certificate:peer did not return a certificate -- No CAs known to server for verification?
38 1 健二 酒井
AH02261: Re-negotiation handshake failed
39 1 健二 酒井
```
40 1 健二 酒井
41 1 健二 酒井
結構悩んだのでメモしとく
42 1 健二 酒井
43 1 健二 酒井
### 原因(推測)
44 1 健二 酒井
45 2 健二 酒井
1. https://example.com/にアクセス
46 2 健二 酒井
1. インデックスページを生成しようとする
47 2 健二 酒井
1. DocumentRootのエントリ「ClientVerifyDir」を読もうとする
48 2 健二 酒井
1. 一方ClientVerifyDirを読むにはクライアント認証が必要
49 1 健二 酒井
   アクセスしているDocumentRootはクライアント認証の提示をブラウザに要求していない
50 2 健二 酒井
1. クライアント認証は失敗する
51 1 健二 酒井
52 1 健二 酒井
って感じなんだろうか。うーん、ディレクトリのread権限がなくて403 Forbidden的なしょぼいエラーと似ている気がする
53 1 健二 酒井
54 1 健二 酒井
### 対処
55 1 健二 酒井
56 1 健二 酒井
まず、ディレクトリ構造を変更
57 1 健二 酒井
58 1 健二 酒井
- DocumentRoot
59 1 健二 酒井
  - SecretsDir
60 1 健二 酒井
      - ClientVerifyDir
61 1 健二 酒井
  - FooDir
62 1 健二 酒井
  - BarDir
63 1 健二 酒井
64 1 健二 酒井
クライアント認証かけるディレクトリをSecretsDirより下のものたちに。
65 1 健二 酒井
66 1 健二 酒井
```
67 3 健二 酒井
<Directory "DocumentRoot/SecretsDir/*">
68 1 健二 酒井
    SSLVerifyClient require
69 1 健二 酒井
</Directory>
70 1 健二 酒井
```
71 4 健二 酒井
72 4 健二 酒井
-------
73 4 健二 酒井
74 4 健二 酒井
### ソースを読んでみた
75 4 健二 酒井
76 4 健二 酒井
もやもやを解消したくせっかくだしソースを読んでみた。
77 4 健二 酒井
https://github.com/apache/httpd/blob/trunk/modules/generators/mod_autoindex.c
78 4 健二 酒井
79 4 健二 酒井
たぶんこの辺。「make_autoindex_entry」とかいういかにもディレクトリエントリのリンク作り出しそうな関数
80 4 健二 酒井
81 4 健二 酒井
82 4 健二 酒井
```c
83 4 健二 酒井
if ((autoindex_opts & SHOW_FORBIDDEN)
84 4 健二 酒井
    && (rr->status == HTTP_UNAUTHORIZED || rr->status == HTTP_FORBIDDEN)) {
85 4 健二 酒井
    show_forbidden = 1;
86 4 健二 酒井
}
87 4 健二 酒井
88 4 健二 酒井
if ((rr->finfo.filetype != APR_DIR && rr->finfo.filetype != APR_REG)
89 4 健二 酒井
    || !(rr->status == OK || ap_is_HTTP_SUCCESS(rr->status)
90 4 健二 酒井
    || ap_is_HTTP_REDIRECT(rr->status)
91 4 健二 酒井
    || show_forbidden == 1)) {
92 4 健二 酒井
    ap_destroy_sub_req(rr);
93 4 健二 酒井
    return (NULL);
94 4 健二 酒井
}
95 4 健二 酒井
```
96 4 健二 酒井
97 4 健二 酒井
以下、頭の中垂れ流し:
98 4 健二 酒井
99 4 健二 酒井
最初のifでたぶん、IndexOptionディレクティブのShowFobbidenのあたりを処理している。
100 4 健二 酒井
if文の式を読むと「SHOW_FOBIDDENが立っていて、サブリクエストのステータスがUNAUTHORIZEDやFORBIDDENのとき」、フラグを立ててる。
101 4 健二 酒井
このフラグが立っていると、下のif内の式第二項がfalseになると。なのでif文の中に突入するには、「ディレクトリでない かつ 通常のファイルでない」が成立すると。
102 4 健二 酒井
で、このときNULL返してる、本来の返却値はentへのポインタなのでたぶん、エントリを作らなかった時にこのreturnなんだろう。
103 4 健二 酒井
104 4 健二 酒井
ここから逆に考えて、通常のファイルやディレクトリを表示しようとするときは第二項がfalseになる。
105 4 健二 酒井
これはつまりサブリクエストがOKでないし、HTTPに成功もしてないし、リダイレクトでもないし、show_forbiddenが立ってない。
106 4 健二 酒井
まぁ特に設定してない限りSHOW_FORBIDDENは0なのでいいや。
107 4 健二 酒井
108 4 健二 酒井
### 結論
109 4 健二 酒井
110 4 健二 酒井
うーん、つまりディレクトリエントリへのサブリクエストが成功しないと表示しないのね。
111 4 健二 酒井
BASIC認証必要なディレクトリが出てきたり、出てこなかったりするのもこれでひとまず納得できる。
112 4 健二 酒井
やっぱ表示していいディレクトリだけ出すようにmod_autoindexさんが辺制御してるということか。
113 4 健二 酒井
114 4 健二 酒井
ちゃんと読んでないけどたぶん合ってるだろう
115 4 健二 酒井
116 4 健二 酒井
## 参考
117 4 健二 酒井
118 4 健二 酒井
- mod_autoindex.c https://github.com/apache/httpd/blob/trunk/modules/generators/mod_autoindex.c
119 4 健二 酒井
- mod_autoindexのディレクティブ https://httpd.apache.org/docs/2.4/en/mod/mod_autoindex.html#indexoptions
120 4 健二 酒井
- サブリクエスト http://koseki.hatenablog.com/entry/20090921/ModDirRewrite