九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
前回の記事「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でサイトづくりを楽しんでみてはいかがでしょうか♪
ではでは〜!