Ubuntu Weekly Recipe

第387回 UbuntuでSSLを利用したサービスを構築する

この記事を読むのに必要な時間:およそ 8.5 分

SSLとは

インターネットは危険に満ちています。とはいえ,もはや我々のお仕事や生活はインターネットなしには成立しません。そんな危険なインターネット上で,安全に通信するためのプロトコルがSSL注1です。SSLを利用することで「暗号化による通信の保護」「通信相手の真正性の確認」を行うことができます。逆に言えばSSLで保護されていない場合は,通信内容を盗み見られたり,偽のサイトに誘導されるといった攻撃に晒される危険があります。パスワードやクレジットカード情報などを入力するサイトはもちろんのこと,もはやインターネット上の通信はすべてSSLで保護すべき,といった意見もあるほどです。

注1)
SSLv2とSSLv3は既に使用が禁止されており,現在では後継のTLSが使われています。しかし世間ではSSLという呼び名が普及しているため,本稿でもSSLで統一します。

今回のレシピではUbuntu 14.04 LTSのサーバーにSSL証明書をインストールし,セキュアなサービスを構築する方法を紹介します。

ApacheでHTTPSサーバーを立てる

まず手始めに,HTTPSで通信できるWebサーバーを構築してみましょう。Apache Webサーバーをインストールします。

Apache Webサーバーのインストール

$ sudo apt-get install apache2

次にApacheのSSLモジュールと,デフォルトのSSLのサイトを有効化し,Apacheを再起動します。

SSLモジュールとバーチャルホストの有効化

$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo service apache2 restart

これで,Apacheが443番ポートの待ち受けを開始します。

ポートの確認

$ ss -lnt
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
LISTEN     0      128                      :::443                     :::*
LISTEN     0      128                      :::80                      :::*

SSLで通信を行うには,SSL証明書をサーバーにインストールしなければなりません。ですがUbuntuの場合,Apache Webサーバーをインストールした段階でサンプルのSSL証明書が自動的に作成され,利用可能になっています。Ubuntuのapache2パッケージは,Recommendsにssl-certパッケージが指定されています。そのため明示的に--no-install-recommendsオプションを指定しない限り,apache2のインストールと同時にこのパッケージもインストールされます。このパッケージのpostinstallスクリプト内で

make-ssl-cert generate-default-snakeoil

というコマンドが実行されているのです。make-ssl-certはその名の通り,SSL証明書を作成するためのラッパースクリプトです。これによって作成されたサンプル証明書の秘密鍵と公開鍵はそれぞれ

/etc/ssl/private/ssl-cert-snakeoil.key
/etc/ssl/certs/ssl-cert-snakeoil.pem

に配置されます。ApacheのデフォルトのSSLサイトの設定である/etc/apache2/sites-available/default-ssl.confでも,以下のようにこの証明書と秘密鍵が指定されています。

/etc/apache2/sites-available/default-ssl.conf

SSLEngine on
SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

このような理由から,Ubuntuではapache2パッケージをインストールしてモジュールとサイトを有効化するだけで,⁠サンプルの証明書で)SSL通信を行うサイトを動かすことができるのです注2)⁠

注2)
snakeoilとは日本で言うガマの油のような,効果のあやしげな胡散臭い商品のことを指す単語です。そこから転じて,自己署名証明書の名前に使われています。当然ですが,そのまま本番サイトに利用できる証明書ではありません。

念の為opensslコマンドを使って,証明書の中身を確認しておきましょう。特にフィンガープリントは,自己署名証明書を使ううえで正しいサイトであることを確認する唯一の手段となりますので,控えておいてください。

SSL証明書の内容の確認

$ openssl x509 -in /etc/ssl/certs/ssl-cert-snakeoil.pem -noout -text -fingerprint -sha256
(……略……)
SHA256 Fingerprint=57:2A:35:91:05:9A:FE:62:11:EF:4F:54:6F:07:7C:39:7E:34:FB:F3:08:7C:CD:75:17:51:F0:D6:AE:79:AF:C8

Webブラウザーからhttps://(サーバーのIPアドレス)にアクセスしてください。画像のような警告が表示されているはずです。これはサーバーが(信頼できる認証局の署名のない)自己署名証明書を利用しているためです注3)⁠

注3)
他にも証明書の有効期限が切れていたり,証明書のCN(コモンネーム)と実際にアクセスしているドメインが異なっている場合にも警告が発生します。Webブラウザーが警告を発するということは,何かおかしいことが起きているわけですから,ここに書かれている通り,なぜそうなっているのかが理解できている場合を除き,そのようなサイトにアクセスしてはいけません。

図1 証明書の警告画面

図1 証明書の警告画面

図2 セキュリティ例外の追加

図2 セキュリティ例外の追加

図3 証明書の詳細

図3 証明書の詳細

「例外を追加」⁠⁠表示」をクリックして,証明書のフィンガープリントを確認してください。これが先ほど控えたフィンガープリントと一致していれば,意図したサイトに接続できているという証明になります。問題がないようであれば,⁠セキュリティ例外を承認」をクリックしてください。また,もしもこの方法で構築したサイトを自分以外の誰かに利用させる場合は,証明書のフィンガープリントを事前に連絡して,証明書の確認ができるようにしてあげてください。

本連載では過去にTinyTinyRSSやownCloudといったWebサービスの構築を紹介してきましたが,こういったサービスもSSLに対応して運用するのが望ましいでしょう。特にownCloudなどは,HTTPでアクセスしてきたら強制的にHTTPSにリダイレクトしてもよいくらいです注4)⁠

注4)
実際のところ,ownCloud 7.x系には常にHTTPSで接続させるためのオプションが用意されています。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。株式会社インフィニットループ所属。

コメント

コメントの記入