クマの手も借りたい
馬とテニスとリラックマが好きな IT 系のエンジニアです。
Linux

Apacheのクライアント証明書を使ったアクセスで「413 Request Entity Too Large」

Apache で通常の SSL 通信は問題がなかったのですが、セキュリティ強化でクライアント証明書を導入してから、ファイルのアップロード処理で以下のエラーが発生するようになりました。

413 Request Entity Too Large

今回はこの問題の原因調査と解決方法を紹介します。

調査結果

エラーの通り Apache のステータスコード(レスポンス)は 413 なのですが、このステータスコードには人生で初めて遭遇した気がします。

要はクライアントからのリクエスト要求(サイズ)が大きすぎるということで、Apache のエラーログにも以下の内容が出力されています。

request body exceeds maximum size (131072) for SSL buffer

許容しているサイズは 131072 なので 128KB(1024 * 128)ですね。

これでは少し大きなサイズのファイルをアップロードしただけで余裕でオーバーしてしまいます。

ちなみに、アップロードの処理は PHP で動作させているのですが、PHP の設定は以下の通りです。

1 ファイル 5MB まで
1 回の POST のサイズを 20MB まで

php.ini だと下記の設定内容ですね。

upload_max_filesize = 5M
post_max_size = 20M

クライアント証明書を使わない SSL(https)通信では問題なく大きなファイルもアップロードできているので、やはりこのエラーに遭遇するのはクライアント証明書を使ってアクセスしたときに限定されます。

解決方法

Apache のエラーログの内容からもわかる通り、SSLRenegBufferSize がデフォルトで 131072 になっているので、ここを 20MB に変更します。

SSLRenegBufferSize 20971520

ディレクトリまたはロケーションブロックでSSLVerifyClientを使用するなど、ロケーションごとにSSL再ネゴシエーションが必要な場合、新しいSSLハンドシェイクが実行できるようになるまで、mod_sslはHTTP要求本体をメモリにバッファリングする必要があります。このディレクティブを使用して、このバッファに使用されるメモリ量を設定できます。
(google翻訳)

SSLRenegBufferSize Directive

設定したら、Apache を再起動してエラーにならないことを確認します。

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/09/20 11:58:13時点 Amazon調べ-詳細)

あなたにオススメ