こんにちは。iQeda [@iQeeeda] です。
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 -tlnp
や netstat -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>
SSL 証明書は Let’s Encrypt から取得していたので、/etc/letsencrypt/live/[ドメイン]/cert.pem
と /etc/letsencrypt/live/[ドメイン]/privkey.pem
を設定しています。
僕はこれで https://ドメイン
接続できるようになりました。
日本語でも英語でも、このエラーについて調べてみましたが、
ここまで VirutalHost の設定は書かれていなかったので、詰まっている方は試してみて下さい。
HTTP から HTTPS にリダイレクトさせるには?
リバースプロキシで HTTPS リダイレクトをかける方法を解説しました。
関連記事
お仕事ください!
僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。 なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。
カテゴリ「AWS」の最新記事
> HTTPS (403)
403なんですか?