herokuで運用しているアプリでhttps設定(Let’s Encrypt)をしたいという要望があり、調査、設定をすることに。
当然herokuでなくても大丈夫です。
過去に行ったhttps設定に関して
Let’s Encryptとは
通常SSLの証明証発行ではお金がかかることが多いのですが、Let’s Encryptでは無料で設置ができるようです。
ローカルのmacで鍵、証明書を作成でき、これをサーバーに配置すればOKかと思います。
デメリットとしては更新頻度がやや短い(3ヶ月ごと?)ということでしょうか。プログラムで自動化してしまえば大丈夫っぽいですが。
作成方法
もうほとんどここのリンクに書かれていることを実行すれば大丈夫かと思いました。
MacOS に CertBot を入れて Let’s Encrypt 証明書を作ってみる
わかりやすすぎ・・
手順1 CertBotのインストール
証明書を作成するために、CertBotというソフトをインストールする必要があります。
下記コマンドでそのまま入れられます。
1 2 3 |
brew install certbot #下記コマンドで確認しましょう。 certbot --version |
手順2 証明書発行
ソフトがインストールできたら実際に証明書を作成します。
sudo certbot certonly --manual --domain example.herokuapp.com
ここでインストールとウィザードが始まります。詳細は先ほどのリンクをみた方がいいでしょう(汗)
最後に下記のようなメッセージが出て実際に鍵が作られますが、ここでEnterを押してはダメです。
1 2 3 4 5 6 7 8 9 |
Create a file containing just this data: hogehogehogehoge And make it available on your web server at this URL: http://example.herokuapp.com/.well-known/acme-challenge/foofoofoo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue |
これは要するに http://example.herokuapp.com/.well-known/acme-challenge/foofoofoo というurlにアクセスをした時にhogehogehogehogeというレスポンスを返してね、という指示ですので、アプリ側の設定が必要になります。
(注:実はherokuの場合このurl自体にアクセスをさせるのが大変でした・・・
参考リンク herokuでのhttpd.conf設定 )
まだ準備もしていないうちにEnterを押しても当然期待通りのレスポンスはかえってきませんので、エラーになります。
ルーティングでも実際にファイルをおくでもいいのですが、上記URLでアクセスした時に上記の文字列を返すような処理を入れましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Press Enter to Continue Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.herokuapp.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.herokuapp.com/privkey.pem Your cert will expire on 2020-07-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
うまく行けば上記のように自分のPCに鍵が生成されています。
手順3 鍵配置
実際に上記のディレクトリ /etc/letsencrypt/live/ に行くとサーバ証明証と中間CA証明書の結合( /etc/letsencrypt/live/example.herokuapp.com/fullchain.pem )と秘密鍵( /etc/letsencrypt/live/example.herokuapp.com/privkey.pem )がありますので(実際にはシンボリックリンクですので本来のパスは /etc/letsencrypt/archive/example.herokuapp.com/ 直下です。)、これらをサーバーに配置して通常の設置(参照:SSLの設定に関して)あげれば大丈夫かと思います。
ちなみにherokuだとサーバーへのアップが直接できないため下記のようにコマンドであげます。
(* fullchain.pem → cert.pem にリネームしてます。)
heroku certs:add cert.pem privkey.pem
Freeプランだとできないので注意しましょう・・
Let’s Encryptで取得した証明書をHerokuに反映させてみた
オチ
実は私が触っていた案件はドメインが独自ドメインではなく、 http://example.herokuapp.comのようなherokuディフォルトのドメインだったため、すでにhttps設定はされていました。
四苦八苦して設定を試していたところ未設定のはずなのにhttpsが通ったんで、ブラウザを調べてみましたが、証明証がすでに発行されておりました。
不要だったわけですね・・・。
よく考えりゃ、herokuのドメインなので自体は当然してますよね・・・
ちなみに一般のVPSサーバーなどでは、
作成した鍵をscpでローカルからサーバーに移管し、
1 2 |
scp privkey.pem matsumoto@example.com:~/ scp fullchain.pem matsumoto@example.com:~/ |
そのあと下記のように鍵の位置に配置し、
1 2 |
mv ~/privkey.pem /鍵のパス/privkey.pem mv ~/fullchain.pem /鍵のパス/cert.pem |
webサーバー(apacheなど)再起動しましょう。
そのあと、ブラウザでURL欄の「証明書」の有効期限が更新されていればOKです。
[…] 前回の記事でLet’s EncryptでSSL設定する場合、 http://ドメイン/.well-known/ というURLにアクセスする必要があります。 […]