
こんにちは。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」の最新記事

【EC2・RDS】WordPressのデータベース接続確立エラー
【自動化】Google Analyticsの集計→Slack通知
Amazon Linux2でLet’s Encryptを使う方法
【AWS】Route53とは?EC2のIPにドメイン設定する方法
TerraformによるLinodeインスタンス新規作成サンプル
【Fingerprint】CircleCIがSSHできない問題解決
【Laravel】セッションタイムアウト後のログイン処理で前回URLに遷移するバグ修正
M1 Mac(2021)でanyenv/phpenvの初期設定!
> HTTPS (403)
403なんですか?