【完全無料でSSL化】AWS(EC2) + SpringBoot + Let’s EncryptでHTTPS対応

プログラミング




無料で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ポートを開けておきます。

aws ec2のポート設定画面

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
server.ssl.key-store-passwordには、先ほど設定したパスワードを記述します。
これでSpringBoot側の設定も完了です。
あとは、アプリを起動するだけです。
443ポートは、ルート権限が必要なので、sudoで実行してあげてください。
# 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使っていますが、この本のおかげでだいぶ理解が進みました。




コメント

タイトルとURLをコピーしました