リバースプロキシしているApacheにHTTPS接続できないとき

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。タクマ™ [@suwaru_blog] です。

Apache でリバースプロキシ (Reverse proxy) をしている場合、
HTTPS 接続時、以下のようなエラーが表示されることあります。

curl --verbose https://eeeeg.tokyo

curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Google Chrome では ERR_SSL_PROTOCOL_ERROR と、ザックリしたエラーが表示されます。

これは「HTTPS (403) 接続のはずなのに、HTTP (80) 接続が使われているよ」
…という指摘の可能性があります。その場合の VirtualHost を使った解消法を説明します。

Apache のバージョンは 2.4.41 で検証しています。

httpd.conf の確認

ss -tlnpnetstat -lnp | grep 443 で、念の為 443 ポートが開いているか確認します。
何も表示されなければ httpd.conf に以下を追記します。

/etc/httpd/conf/httpd.conf

Listen 80
Listen 443

リバースプロキシ設定も見ておきます。こんな感じになっているかと思います。

/etc/httpd/conf/httpd.conf

ProxyRequests Off

<Location />
    ProxyPass http://localhost:3000/
    ProxyPassReverse http://localhost:3000/
    # Location ヘッダに localhost の  HTTP 通信を指定しないようにする
    Header edit Location ^http:// https://
</Location>

VirtualHost を作成する

httpd.conf で VirtualHost の conf ファイルを読み込むようにします。

/etc/httpd/conf/httpd.conf

Include vhost/*.conf

/etc/httpd/vhost/ 配下に、適当な名前で conf ファイルを作成します。

cd /etc/httpd

# vhost ディレクトリがなければ作成する
sudo mkdir vhost
cd vhost

# わかりやすい名前で conf ファイルを作成する (何でもいいです)
sudo vi hoge.conf

この hoge.conf にポート 443 で HTTPS アクセスしてきたときの対応を記述します。

ポイントは SSLEngine ・証明書ファイル・リバースプロキシの設定です。

/etc/httpd/vhost/hoge.conf

<VirtualHost *:443>
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/[ドメイン]/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン]/privkey.pem
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
ProxyPreserveHost On
</VirtualHost>

このときは Let’s Encrypt で HTTPS 対応していたので、/etc/letsencrypt/live/[ドメイン]/cert.pem/etc/letsencrypt/live/[ドメイン]/privkey.pem を定義しています。

僕はこれで https://ドメイン 接続できるようになりました。

日本語でも英語でも、このエラーについて調べてみましたが、
ここまで VirutalHost の設定は書かれていなかったので、詰まっている方は試してみて下さい。

関連記事

コメント

コメントを残す

*