ubuntu18.04+apacheでhttps対応


3行で

  • あまり手をかけずにhttpsに対応したwebサーバーを立てたい
  • 使い慣れたubuntuと、よく使われるであろうapacheを使う
  • ubuntu18.04+apacheはcertbotが自動でhttpsの設定をしてくれる

モチベーション

機械学習モデルを使った簡単なデモをブラウザ上で動かしたい。
そのためにAPI提供しようと思い、簡単なwebサーバーを立てたい。
さらに、今どきhttpsで公開されてるwebページも多いので、httpsに対応できる形にする。

環境

項目 使用環境
クラウドサービス AWS EC2
OS ubuntu 18.04 LTS
サーバーソフト Apache/2.4.29 (Ubuntu)
認証局 let's encrypt

必要な作業

  1. インスタンス作成、SSH接続
  2. インバウンドルールの設定
  3. apacheのインストール
  4. 認証取得

インスタンス作成、SSH接続

まずはEC2インスタンスを作成してSSHで接続できるようにしてください。
本記事では割愛します。詳しくは下記で。

インバウンドルールの設定

httpとhttpsの通信が必要なので、80番(http)と443番(https)のインバウンドルールを設定しておきましょう。
EC2のマネジメントコンソール上の「セキュリティグループ」>「launch-wizard-<>」(<>は具体的な数字launch-wizard-6など)からアクセスできます。
タイプ「HTTP」「HTTPS」を追加して、ソースを0.0.0.0に設定しておけば外部からアクセスできるようになります。

apacheのインストール

sudo apt install apache2

これだけ。
インストールが完了するとサーバーが自動で起動しますので、EC2のマネジメントコンソールにあるIPv4 パブリック IPか、パブリック DNSの値をブラウザのURLバーに打ち込んでください。
以下のようなページが出ます。

これで無事サーバーが立ち上がりました。

認証取得

無料でやろうとするならLet's encryptというサービスがあるようです。
Let's encryptで認証を取得するためには

  • 今公開しているドメインが、認証取得希望者自身のコントロール下にあること

を認証局(Let's encrypt)に認めさせる必要があります。
これには、決まったディレクトリに決まったファイルを置き、そこにhttpで認証局からアクセスしてもらう等の方法がありますが、幸いubuntu18.04+apache環境の場合は認証~https対応のためのapacheの設定変更までcertbotが自動でやってくれます。

(Let's encryptからの引用)

シェルへのアクセス権を持っている場合
シェルアクセスができるほとんどの人には、Certbotという ACME クライアントを使うのがおすすめです。証明書の発行とインストールを、ダウンタイムゼロで自動化できます。自動設定を使いたくない人のために、エキスパートモードも用意されています。とても簡単に使え、多数のオペレーティングシステムで動作し、たくさんのドキュメントもあります。Certbot のウェブサイトでは、各オペレーティングシステムやウェブサーバーごとの個別の設定方法について解説されています。
https://letsencrypt.org/ja/getting-started/

Certbotにいって、ubuntu 18.04上でのapacheで動作しているwebサイトの認証取得の方法を調べてみると

上記のように作業の前に満たすべき必要事項がでてきます。
ほとんどは自動的に満たされていると思いますが、ドメイン名をちゃんと取得出来ていることが必要です。
これは、EC2の場合NoIPなどの動的DNSサービスを使えば取得できます。
(参考:動的DNSの設定)

あとは指示に従って

sudo apt-get install certbot python3-certbot-apache

でcertbotとapacheのpluginを導入します。

認証+apacheの設定まで自動でやりたい場合は続いて以下のコマンドを入力します

sudo certbot --apache

これでhttpsを利用した通信が有効になりました。

その後の作業にあたって

私の場合、この後引き続きflaskを導入しようと思っています。
その際、DocumentRootを変更したいと思っていて、/etc/apache2/apache2.conf/etc/apache2/sites-available/000-default.confだけでなく、certbotによって自動生成された設定ファイルも書き換える必要があったのでメモしておきます。
書き換える必要があるのは

  • /etc/apache2/sites-available/000-default-le-ssl.conf

です。必要な書き換え内容はubuntuでapache2のDocumentRootを変更するまでで紹介されている内容と同じです。
もともとあるDocumentRootの項をコメントアウトして、好きなディレクトリに設定してください。
書き換えができたら

cd /etc/apache2/sites-enabled
sudo a2dissite 000-default-le-ssl.conf
cd ../sites-available/
sudo a2ensite 000-default-le-ssl.conf
/etc/init.d/apache2 restart

で設定を反映させます。

感想

djangoの開発用サーバーをhttps化しようと最初頑張りましたが、それより圧倒的に簡単でした・・・。

参考

Let's encrypt
UbuntuとApacheでウェブサーバを立てる
ubuntuでapache2のDocumentRootを変更するまで