意外と簡単!FlaskをHTTPS対応する方法【Let’s encrypt】

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

前回の記事「mod_wsgiとhttpdのインストールで気をつけるべき事」でも書きましたが、現在ちょっとした時間を見つけて個人的にflaskサイトを構築しています。

そして、この開発も一旦完了したんでサイトを公開することにしました。時代の流れを考えてHTTPS対応にしたかったので、いつもお世話になっている無料・証明書発行サービスの、Let’s encryptを使って実装しました。

正直言うと少し手間取ったんですけど、全てうまくいけば10〜15分あれば作業は十分完了できると思います。

【実装した環境】
OS: CentOS 7
ウェブサーバー: httpd(apache2.4)

Let’s encryptのcertbotをインストールする

証明書を取得するために必要なcertbotと呼ばれるプログラムをインストールします。

(「いや、それ必要ないわ」って人は、”Let’s encryptで証明書を取得する流れ”へ急げ!)

一昔前までは、gitからソースをcloneして使う必要があったんですけど、もうCentOSだとyumパッケージにしてくれてました。

なので、以下のコマンド一発で完了です。

sudo yum install certbot-apache

※ CentOS以外の環境でも大丈夫!「certbot.eff.org」というサイトが、自分の環境を選べばどうすべきか教えてくれるんで、これを使ってみてください。

Let’s encryptで証明書を取得する流れ

では、まずはLet’s encryptが証明書を発行する流れから。

(「いや、それ必要ないわ」って人は、”実際のコード”へ急げ!)

Let’s encrypt のwebrootを使ったインストールは、以下の流れであなたの所有してるサイトかをチェックします。

1.) 一時ファイルをサイト内に作成
2.) 外部からアクセスして本当に作成されているかチェック
3.) チェックを通過したら証明書を発行

となっています。

そして、2番のアクセスしてくるURLは、

http://***.com/.well-known/acme-challenge/***********

です。

なので、このURLに一時ファイルの中身が表示されるよう、flaskの方で調整してやる必要があるわけですね。

実際のコード

まずは一時ファイルを保存するためのフォルダを作ります。(一時ファイルはテンプレートとして読み込こむようにします)

/templates/.well-known

※ 実際にはcertbotがここに「acme-challenge」フォルダを作り、その中へ一時ファイルを作成することになります。

では、次にapp.pyに作るrouteです。

# Let's encrypt

@app.route('/.well-known/acme-challenge/<filename>')
def well_known(filename):
    return render_template('.well-known/acme-challenge/'+ filename)

Let’s encrypt がアクセスしてくるURLからファイル名を取得してテンプレートとして呼び出すだけですね。

証明書を発行する

あとは、インストールしたcertbotに必要なパラメータを付けてエンターキーを「ターンッ!」するだけです。

sudo certbot certonly --webroot -w /var/www/html/***/templates/ -d example.com

あとは、次のようにhttpdのconfファイルへ記述してあげて再起動すればOKです。

NameVirtualHost *:443

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  ServerName example.com
  WSGIScriptAlias / /var/www/html/***/***.wsgi
  WSGIApplicationGroup %{GLOBAL}
  <Directory /var/www/html/***>
    Require all granted
  </Directory>
</VirtualHost>

※firewallとかを設定してる人は、そっちでポートの設定とかもしてくださいね。

さぁ、これで全て完了です!
みなさんもflaskでサイトづくりを楽しんでみてはいかがでしょうか♪

ではでは〜!

このエントリーをはてなブックマークに追加       follow us in feedly  
開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ