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 off
と SSLProxyCheckPeerName 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/
(省略)