外に公開されている 80, 443 を見れるプロキシ鯖の裏に複数のドメインで Web サーバを複数動かしていた。バックエンド鯖側は見かけ上は 443 ポートで証明書ありのれっきとした暗号化通信をしているようにしていたが実のところプロキシ鯖とバックエンド鯖の間は 80 ポートで通常の http 通信をしている。と、ここまではよかった。もうかれこれ5年はそのままで動いていた。
構成図(今まで)
ブラウザ https://www.ktsys.jp/wp —— https 通信(443) –> プロキシ鯖*1 — http 通信(80) —> バックエンド鯖(Webサーバ)*2
構成図(欲しかったもの)
ブラウザ https://wordpress.ktsys.work – https 通信(443) –> プロキシ鯖*1 — https 通信(443) -> バックエンド鯖(Webサーバ)*3
*1 *.ktsys.jp という ktsys.jp 以下のサブドメイン全てに対応する LetsEncrypt製の証明書設置
*2 80 ポートのみで通信するWebサーバなのでオレオレ証明書すら入ってない
*3 80/443 ポートで通信出来る Docker + nginx-proxy + letsencrypt + WordPress という構成で ktsys.work, wordpress.ktsys.work で使えるれっきとした証明書が入っている
ケーブルテレビの世界では BS デジタルパススルーというものがある。それと同じようにプロキシの世界にも https 通信パススルーが当然あるだろうと思ってた。
出来なかった。簡単に出来るもんだと思ってた。
↓今までの設定
<VirtualHost *:443>
ServerName ktsys.work
ServerAlias wordpress.ktsys.work
ProxyPass / http://192.168.1.23/
ProxyPassReverse / http://192.168.1.23/
</VirtualHost>
SSLProxyEngine on
SSLProxyVerify none
# SSLProxyVerify require
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPreserveHost On
この設定を ↑ の <VirtualHost> 内に追加するも https://wordpress.ktsys.work にアクセスすると *.ktsys.jp の証明書で通信をしているようでブラウザで「HSTSが使用されているため、現在アクセスできません」と表示されてしまう。
さて困ったぞう、と数時間悩んでいたところ他のドメインだけど同一サーバ内では個別の証明書でやれていたことを思い出す
同一物理サーバ内の名前ベースのバーチャルホストをやっていた時はおのおのの <VirtualHost> 設定内に SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile を入れてそれぞれのドメイン用の証明書で正しく通信が出来ていた。
これだ!
ちょっとイレギュラーであまり気持ちいいやり方ではないのだけれどしゃーない、もうあまり時間取れないからとりあえず想定している動作すればいいやと
<VirtualHost *:443>
ServerName ktsys.work
ServerAlias wordpress.ktsys.work
ServerAlias *.ktsys.work
ProxyPass / http://192.168.1.23/
ProxyPassReverse / http://192.168.1.23/
SSLCertificateFile /Users/hoge/work/ktsys.work/cert.pem
SSLCertificateKeyFile /Users/hoge/work/ktsys.work/key.pem
SSLCertificateChainFile /Users/hoge/work/ktsys.work/chain.pem
</VirtualHost>
三行追加で証明書ファイルを指定。これらはバックエンド鯖内にある docker nginx-proxy + letsencrypt で自動生成したファイルをプロキシ鯖にコピーしてきたもの。
実に気持ち悪い
とりあえずこれで欲しかった環境になったのでまた時間出来た時にドライバーでこねくり回してみようと思う
to be continued