SSLの設定で自分が2日間はまったので、次来る人がすぐに気づいてくれるようにメモを残しておきます。
私の開発環境は、GMOのグローバルサインでSSL証明書や秘密鍵を発行し、EC2インスタンスにRailsとWordpressを共存させ、どちらも常時SSL接続を実現しようとしている感じです。
SSLの仕組みは、以下の記事で理解しました。
3分で理解できる!共通鍵暗号方式と公開鍵暗号方式の仕組み
SSLとは?仕組みから、共有・独自SSLの違い、証明書についてが分かるまとめ
SSLの設定方法などは、以下の記事を参考にしました。
PKCS #12 ファイルから秘密鍵,証明書,中間CAを取り出す
*グローバルサインでは、PKCS#12形式で証明書や秘密鍵がセットになったファイルをダウンロードできます。この方法で解凍して、証明書と秘密鍵を取得します。
[インストール] Apache 2.x + mod_ssl + OpenSSL(新規・更新)
Amazon EC2 (Amazon Linux) での SSL 設定(重要なのは、EC2のSecurity GroupでHTTPSの443ポートを許可しておく事)
SSLのパスフレーズ(Pass Phrase Dialog)入力を省略してApacheを起動する
Apache + OpenSSL ジオトラスト クイックSSL プレミアム インストール手順 (新規)
CloudFrontで独自ドメインSSL設定
さて、ここからが本題なのですが、私の場合以上の記事にあった手順を完璧に再現しても上手くいきませんでした。SSLの設定をいじってみたり、ssl.conf
ファイルのNameVirtualHostをいじってみたりしてもダメでした。
そして結果分かった原因は、
iptablesでSSL通信のための443ポートを許可するのを忘れていたからでした!
もう一度言います。
iptablesでSSL通信のための443ポートを許可してください!
/etc/sysconfig/iptables
を編集します。
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT # ここの行をいれてなかった!!!
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
これをしたらすべて上手く行きました!iptablesで許可してなかったらそりゃ無理です。
いろいろ検索したのに、どこの記事にもiptablesに関して言及していなかったのでここにメモを残しておきます。
iptablesはオフにすることでも問題は解決しますが、セキュリティ的にオフにしていない人も多いと思うので、そういう人ははまりがちなところだと思います。お気をつけて!