無料でHTTPSを使いたい
「AWS EC2 HTTPS 無料」 とかでググると、大体AWSのロードバランサーを使ってそっちをSSL化するとか、AWS Route53を使うとかいう記事が出てきますが、それ使ったら無料じゃないじゃん。
ということで、1円もかけずにSSL化する方法を書いておきます。
構成
この構成で完全無料でSSL化してHTTPSでアクセスできるようにします。
- AWS EC2 (無料枠を使えば無料)
- SpringBoot
- Let’s Encrypt
別にSpingBootである必要はありません。
apacheとかnginxとかのwebサーバを別に使っても完全無料でSSL化は可能です。
今の主流はnginxらしいので、nginxを使ったやり方は別の記事にまとめます。
(先に言っておきますが、この構成でwebサーバを別に立てていない人も拡張性を考えるとwebサーバを立ててSSL対応をした方が圧倒的に便利になります。)
追記
nginxを使った方法もかきました。
> AWS EC2 + SpringBoot + Nginx + Let’s EncryptでHTTPS対応
Let’s Encryptとは
Let’s Encryptが何か分からずこの記事にたどり着いた人用に、超ざっくりと説明しておきます。
- 無料でSSL証明書を発行してくれるところ
- 90日で期限が切れるので、適宜更新する必要がある
-
この更新も自動化できるので、実質メンテナンスフリーで使える
-
SSL証明書は基本有料で発行してもらうものが多いですが、Let’s Encryptは無料で使えます。
無料で大丈夫なの?と思うかもしれませんが、企業でガチガチに使いたいとかでなければ大丈夫です。
余談ですが、先日、GoogleにYouTube APIの利用申請(正確にはQuota上限変更)を出したんですが、開発中のサービスだったのでhttpのまま申請を出したらhttpsじゃないとダメ!と怒られ、Let’s Encryptでhttps対応をしましたが、それで申請は通ったので、Googleさん的にもOKみたいです。
SSL化手順
DNS登録する
httpsにしたい!ということは外部公開したい人だと思うので、ドメインは取得済みかと思いますが、SSL化にはドメインが必須になります。
(ip直指定でhttps://127.0.0.1みたいなことやりたい人はいませんよね…?)
取得していない人向けに書いておきますが、DNS登録をしてください。
お名前.comとかで取っておけば大丈夫です。
登録したら無料じゃないじゃん!とツッコミが来そうですが、無料でDNS取得できるサービスを使ってもいいです。
ただ、登録しても1000円/年くらいなので、ちゃんとしたところで取っておいていいかなと思います。(サービス開発するなら多少お金をかけた方がモチベが上がる。)
今回は、1-lifengine.comのサブドメインgeotube.1-lifengine.comをSSL化していきます。
EC2の80, 443ポートを開ける
EC2で80, 443ポートで通信できるようにしましょう。
デフォルトだと空いていなかった気がしたので、セキュリティの設定から80, 443ポートを開けておきます。
Let’s EncryptでSSL証明書を発行する
サーバ内で実際にSSL証明書を発行していきます。
今回は、SpringBootを使うので、webサーバは入れていないですが、証明書の取得にwebサーバを立てておく必要があるので、apacheを入れます。
(証明書取得後に消しても問題ありません。)
SpringBootのアプリが動いている場合は、止めておいてください。
# apacheをインストール&起動
sudo yum -y install httpd mod_ssl
sudo service httpd start
sudo chown ec2-user /var/www/html/
httpでアクセスできることを確認しておいてください。
次に証明書取得のスクリプトをインストールして叩きます。
(geotube.1-lifengine.com
部分はhttpsにしたいドメインに書き換えてください。)
# 証明書取得のためのスクリプトを取得&実行
sudo yum -y install git socat
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install
./acme.sh --issue -d geotube.1-lifengine.com -w /var/www/html
上のコマンドを実行すると、証明書が作られます。
途中、パスワードの入力を求められるので、設定して忘れないようにしておきましょう。
SpringBootで使う場合は、p12形式に変換する必要があるので、変換しておきます。
※ドメインの書き換えを忘れずに。
# 取得した証明書をp12形式に変換
openssl pkcs12 -export -in ~/.acme.sh/geotube.1-lifengine.com/geotube.1-lifengine.com.cer -inkey ~/.acme.sh/geotube.1-lifengine.com/geotube.1-lifengine.com.key -out ~/geotube.1-lifengine.com.p12
これで証明書の準備は完了です。
SpringBootで証明書を読み込む
前の手順で作成したgeotube.1-lifengine.com.p12をscpするなりしてSpringBootのプロジェクトのルートディレクトリにコピーしておきます。
証明書をコピーできたら、application.properties (もしくはapplication.yml) に設定を記述します。
# application.propertiesに記述
server.port=443
server.ssl.key-store=geotube.1-lifengine.com.p12
server.ssl.key-store-password=パスワード
server.ssl.keyStoreType=PKCS12
# 443ポートはルート権限が必要なのでsudo付ける
sudo java -jar app.jar
お疲れ様でした。これで、httpsでアクセスできるようになっているはずです。
https://geotube.amusia-web.com/
まとめ
今回は、AWS(EC2) + SpringBoot + Let’s Encryptで完全無料でHTTPS対応する方法を書きました。
とまぁ、ここまでこの構成でSSL化する方法を書きましたが、webサーバは別で立てた方がいいです。(アクセス制御とかメンテナンスとかしやすいので。)
その方法は、別でまとめておきます。
追記
こちらにまとめました。
> AWS EC2 + SpringBoot + Nginx + Let’s EncryptでHTTPS対応
本日のオススメの書籍
こちらは、AWSについての基本を網羅的に知ることができます。
こちらは、SpringBootで開発したい人にオススメ。
私も本業でSpringBoot使っていますが、この本のおかげでだいぶ理解が進みました。
コメント