インフラエンジニアbacchiのわかったことまとめ

bacchi.me

SSLProxyを使っているApacheを2.2から2.4にバージョンアップする際の注意点

SSLProxy を使っている Apache を2.2から2.4にバージョンアップした際にトラブルが発生したので概要と対処方法をメモ。

CentOS5 の Apache-2.2 で下記のような Proxy の設定をしているサーバーがありました。

Proxy の部分の設定は下記のような感じ。


(省略)

  SSLProxyMachineCertificateFile /etc/httpd/conf/ssl.crt/test.pem

(省略)

  RewriteEngine On

  RewriteRule ^/test/(.*) https://192.168.0.1:9443/test/$1 [P]
  ProxyPassReverse /test/ https://192.168.0.1:9443/test/

(省略)

CentOS5 の EOL を間もなく迎えるため、CentOS7 のサーバーにリプレースしました。

CentOS7 の Apache は2.4系です。

ざっと見た感じそのまま移植して問題なさそうだったので、旧サーバーの conf を新サーバーにもっていき、Apache を起動させました。

http の Proxy は問題なかったものの、https のProxy で、下記のような Proxy_Error が発生していました。

Proxy Error

The proxy server could not handle the request GET /test/.
Reason: Error during SSL Handshake with remote server

エラーを見るに、Proxyサーバーと Backend の間で SSL の処理がうまく行っていないようでした。

[ブラウザ] --(SSL)--> [SSL Proxy] --(SSL)--> [Backend]

エラーログを確認してみると下記のエラーが吐かれていました。

[proxy:error] [pid 55227] (502)Unknown error 502: [client 1192.168.0.100:62543] AH01084: pass request body failed to 192.168.0.1:9443 (192.168.0.1)
[proxy:error] [pid 55227] [client 192.168.0.100:62543] AH00898: Error during SSL Handshake with remote server returned by /vsphere-client/
[proxy_http:error] [pid 55227] [client 192.168.0.100:62543] AH01097: pass request body failed to 192.168.0.1:9443 (192.168.0.1) from 192.168.0.100 ()
[proxy:error] [pid 55227] (111)Connection refused: AH00957: HTTPS: attempt to connect to 127.0.0.1:20443 (*) failed
[proxy_http:error] [pid 55227] [client 192.168.0.100:62544] AH01114: HTTP: failed to make connection to backend: localhost

このエラーについて、Apache のドキュメントやフォーラムを確認してみました。

このエラーは、Proxy でホスト名がIPアドレスのホストにアクセスしているため、証明書の検証で CommonName(CN) や Subject Alternative Name(SANs) が一致しないというエラーのようでした。

これを踏まえ、SSLProxyCheckPeerCN offSSLProxyCheckPeerName off の設定を追加しました。

また、SSLProxyEngine on が設定されていなかったので追加しました。

※本来、SSLProxyEngine が有効になっていないと、Proxyサーバーと Backend の間で SSL通信ができないはずですが、SSLProxyMachineCertificateFile が設定されていたので通信できていたのだと思います。(調査できていないです……)

下記のように Proxy の設定を追加した所、SSLProxy がきちんと処理されました。


(省略)

  SSLProxyMachineCertificateFile /etc/httpd/conf/ssl.crt/test.pem

(省略)

  RewriteEngine On

  SSLProxyEngine on
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  RewriteRule ^/test/(.*) https://192.168.0.1:9443/test/$1 [P]
  ProxyPassReverse /test/ https://192.168.0.1:9443/test/

(省略)

  • B!