DrupalをSSL化 [Apache2, Debian]

SSL化とはhttps化のことです。

https化のメリット

SSL化されていないサイト(http:〜で始まるサイト)への接続は

・暗号化されていない
・証明されていない

暗号化

暗号化されていないとうのは、つまりそのサイトでパスワードその他を入力しようものならぜんぶ抜き取られる可能性があるということです。

訪問者にパスワード入力させるところないし...と思っていても、Drupalである以上管理者としてログインしますね?
放置しとくとサイトごとのっとられる危険があります。

ドメインの証明

ドメインの証明がされていないというのは、たとえばカフェの公共Wi-Fiが悪いやつにハッキングされてるとしますね。そこからあなたのサイトに訪問した人は、あなたのドメインをみているつもりが実際はそのハッカーが用意したページをみることになります。つまり、「このドメイン(simonsnote.comなど)は正しい接続先です!」という証明がないので、誰でもあなたのドメインを名乗って偽装サイトを作れます。

訪問者の安全のためにもサイトのブランド保護のためにも、これはまずいですね。

それに、最近のブラウザではhttp:〜ではじまるサイトへの接続時には「セキュアでない接続」などと表示されます。なんかいやですね。

https化のデメリット

デメリットもあります。

・少しページ読み込みが遅くなる
・ミクストコンテンツの対策
・お金がかかる

少しページ読み込みが遅くなる

httpsでの接続では認証局との通信を毎回行うことになるので、そのぶん遅くなります。でも許容範囲内です。写真を圧縮した方が大きいです。

ミクストコンテンツの対策

ページ内にhttp通信の埋め込み(imgのsrcなど)があると、ブラウザに警告がでてしまいます。

とはいえ、いまのところ、たとえばChromeの場合は開発ツールをみないとその警告はわかりません。
なので一般ユーザー的には大丈夫ですね。

お金がかかる

無料のLet's Encryptもありますが、知識のない場合はしんどいです。

有料のものは16,000円/年くらいですね。わかりやすいし確実なので、失敗したく無い場合はこっちにしましょう。

今回はGeoTrustのクイックSSLプレミアムを利用したので、これで解説します。

このページに設定の仕方が詳しく書いてあるので初心者向きです。


※ちなみにSymantecのSSL証明書(GeoTrust含む)が順次無効化されることになっていますが、上のリンク先のGeoTrustブランドは現在DigiCertが運営しているものなので問題ありません。(昨年シマンテック社のSSL証明書事業がDigiCertに譲渡されました。問題になっているのは譲渡以前のSSL証明書。詳しくは↓)
webtan.impress.co.jp

秘密鍵・CSRの作成

申し込みの前に、まずは秘密鍵と「CSR」というものを作成します。顧客満足度ではなくCertificate Signing Requestの略です。

今回はDebian・Apache2が前提です。CentOSとはやり方が違いますが、Ubuntuなら大丈夫だと思います。

ここからはLinuxサーバーに接続してのコマンドライン操作です。

秘密鍵の作成

あらかじめ、秘密鍵に使うパスフレーズを用意しておいてください。
パスフレーズは安全な場所に保管しましょう。

/usr/binに移動

cd /usr/bin

秘密鍵作成のために擬似乱数を生成、ユーザーフォルダに保存します。

sudo openssl md5 * > /home/ユーザー名/rand.dat

作成した擬似乱数を利用してgenrsaで秘密鍵(秘密鍵ファイル名.pem)を作成します。sha256で暗号化します。

sudo openssl genrsa -rand /home/ユーザー名/rand.dat -des3 2048 sha256 > /home/ユーザー名/秘密鍵ファイル名.pem

パスフレーズをきかれるので、きめておいたパスフレーズを入力 を2回行います。

作成した秘密鍵(/home/ユーザー名/秘密鍵ファイル名.pem)は、ダウンロードして保管しておいても大丈夫です。自分でLinuxサーバーの中を自由に歩けないのであればいまダウンロードしておいた方がのちのトラブルやサーバー移転の際に便利でしょう。ただ、どんな場合でも秘密鍵を聞かれることはないので、くれぐれも誰かに教えないようにしましょう。セキュリティがしっかりしたフォルダにしまっておくべきです。

CSRの作成

/usr/binに移動

cd /usr/bin

さっき作成した秘密鍵をもとにCSRファイルを作成

openssl req -new -key /home/ユーザー名/秘密鍵ファイル名.pem -out /home/ユーザー名/CSRファイル名.pem

するといろいろきかれます。
なお、今回の場合(ドメイン認証といいます)はこれらの情報は公開されないので安心してください。

Country Name (2 letter code) [AU]:
→ JP と入力。

State or Province Name (full name) [Some-State]:
→サイトの所有者の住所がある都道府県を「Saitama」のように入力。

Organization Name (eg, company) [Internet Widgits Pty Ltd]:
→サイトの運営者名を入力。

Organizational Unit Name (eg, section) :
→自分で判断できる好きな名前を入力。(同じ申請者が複数の証明書を申請する場合などに、それぞれの証明書の識別に利用されます)

Common Name (eg, YOUR name) :
→証明書を申請するサイトのドメインを入力(例:https://www.simonsnote.comなら、www.simonsnote.com)


この後もいくつかきかれますが、あとはぜんぶなにも入力しないでエンターを押してしまってOKです。

そうしたらCSRファイル(/home/ユーザー名/CSRファイル名.pem)ができたので、ダウンロードします。
Google Compute EngineのSSH画面なら右上のメニューからダウンロードできます。

最初に作成した擬似乱数はもういらないので、削除してしまいます。

rm /home/ユーザー名/rand.dat

CSRファイルも、サーバーに置いておく必要はありません。サーバー上の安全なフォルダ(パーミッション400)で保存してもいいですし、サーバーからは削除してしまってもOKです。(その場合自分のPC上などどこかで保管してください)

サーバーから削除する場合は、以下のコマンドでOK。

rm /home/ユーザー名/CSRファイル名.pem

CSRの提出と、SSL証明書、中間CA証明書の受け取り

ここまでできたら、いよいよ証明書を購入です。

受け取る証明書は「サーバー証明書(SSL証明書)」と「中間CA証明書」の2つです。この2つがSSL化には必要です。

ここから買うと半額になります。
ジオトラストSSLサーバー証明書

何種類かあるかもしれませんが、一番安いもので大丈夫です。

ちょっとややこしいですが、今回は

KDDIウェブコミュニケーションズからクーポンの購入 → 購入したクーポンでジオトラストからSSL証明書を購入

の2段階になります。

申し込んだら1〜2日でKDDIウェブコミュニケーションズよりクーポンコードの書かれたメールが届きます。

メールが届いたら以下の手順に進みます。

まずは、今回はドメイン認証(DV)になるので、SSL証明書を申し込むドメインでメールを受け取ることでドメインの所有を確認する必要があります。

認証メールを受け取るメールアドレスは決まっているので、あらかじめ用意しておきましょう。次のうちのどれかひとつでOKです。

admin@〜〜〜
administrator@〜〜〜
hostmaster@〜〜〜
webmaster@〜〜〜
postmaster@〜〜〜

認証メール受信用のメールアドレスを用意したら、このページに申し込みの手順が説明されていますので、みながら申し込みに進みます。
ジオトラスト ストアフロントご利用方法 (PDF)

まず「1. ユーザ登録」をすませたら、今回は「2.見積取得について」は関係ないのでスキップ。「3.ジオトラスト ストアフロントご利用方法(ドメイン認証の証明書)」をみながら申し込みを済ませてください。

申し込みが完了したら、今回はドメイン認証(DV)なので、すぐにSSL証明書(サーバー証明書)と中間CA証明書がさきほど作成したメールアドレスに届くはずです。

サーバ証明書と中間CA証明書のアップロード

まずは、メールで受け取ったサーバー証明書と中間CA証明書をこのページを参考にコピペしてそれぞれテキストファイルを作ります。

それぞれテキストファイルを作ったら、

サーバー証明書ファイル名.pem
中間CA証明書ファイル名.pem

というようなファイル形式にします(拡張子がpemならなんでもいい)。

そうしたら、アップロードの前に、サーバー上で証明書をいれておくフォルダを作ります。

/usr/binに移動

cd /usr/bin

証明書用の専用ディレクトリを/usr/binにつくる(名前はsslfilesでなくてもなんでもOK)

sudo mkdir -m 700 sslfiles

その中にcertとprivateフォルダをつくります。
certは公開フォルダで、privateは非公開フォルダです。

certフォルダを作成

sudo mkdir -m 700 /usr/bin/sslfiles/cert

privateフォルダを作成

sudo mkdir -m 700 /usr/bin/sslfiles/private

そうしたら、つくったフォルダにサーバー証明書と中間CA証明書をアップロードします。

今回は、まずは
/home/ユーザー名
にアップロードしたとします。

サーバー証明書をcertフォルダに移動

sudo mv /home/ユーザー名/サーバー証明書ファイル名.pem /usr/bin/sslfiles/cert

中間CA証明書をcertフォルダに移動

sudo mv /home/ユーザー名/中間CA証明書ファイル名.pem /usr/bin/sslfiles/cert

それに、最初につくった秘密鍵ファイルもprivateフォルダに移動します。

sudo mv /home/ユーザー名/秘密鍵ファイル名.pem /usr/bin/sslfiles/private

ここまでできたら、パーミッション(アクセス権)を適切に設定しておきます。


秘密鍵ファイルを入れたprivateフォルダは、パーミッション400(管理者のみ読み込み可・書き込み不可)に設定します。

sudo chmod 400 /usr/bin/sslfiles/private

サーバー証明書と中間CA証明書を入れたcertフォルダは、パーミッション444(誰でも読み込み可・書き込み不可)に設定します。

sudo chmod 444 /usr/bin/sslfiles/cert

最後に、sslfilesフォルダをパーミッション444(誰でも読み込み可・書き込み不可)に設定します。

sudo chmod 444 /usr/bin/sslfiles

Apache設定ファイルの書き換え

以上でSSL証明書は完全に準備でき、サイトはhttpsで接続することが準備はできています。

しかしまだApacheによってhttpsでの接続が許可されていないので、設定ファイルを書き直してhttps接続を許可する必要があります。

今回はDebian・Ubuntu想定です。CentOSだと設定ファイルの場所や形式が異なります。

Apache設定ファイルを作成

/etc/apache2/sites-available/default-ssl.confに見本のファイルがあるので、ダウンロードしてみてみてください。

PC上で新しいテキストファイルを作成→アップロードという流れです。

まずは以下の内容のテキストファイルを作ります。(www.simonsnote.comを自分のドメイン名に置き換えてください)

<VirtualHost *:80>
    ServerName www.simonsnote.com
    Redirect "/" "https://www.simonsnote.com/"
</VirtualHost>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ServerName www.simonsnote.com

    SSLEngine on

    SSLCertificateFile /usr/bin/sslfiles/cert/サーバー証明書ファイル名.pem
    SSLCertificateKeyFile /usr/bin/sslfiles/private/秘密鍵ファイル名.pem
    SSLCACertificateFile /usr/bin/sslfiles/cert/中間CA証明書ファイル名.pem
</VirtualHost>

このあともしうまくいかなかったら/etc/apache2/sites-available/default-ssl.confの見本のファイルをダウンロードして足りない場所を探して、このファイルをなおしてみてください。

いまつくったテキストファイルの名前を「myssl.conf」にします(mysslの部分はなんでもよい)

アップロードしたファイルをApacheの設定フォルダに移動します。

sudo mv -i /home/ユーザー名/myssl.conf /etc/apache2/sites-available

設定ファイルを有効化します。

sudo a2ensite myssl.conf

Apacheのsslモジュールを有効化します。

sudo a2enmod ssl

再起動が必要みたいなことをいわれましたね?
Apacheを再起動すれば設定が反映されます。

sudo /etc/init.d/apache2 restart

パスフレーズを求められるので、最初に設定したパスフレーズを入力します。


これでサイトに接続すると...https:〜〜でサイトにつながりましたか?

今回はApacheの設定ファイルでリダイレクトを設定していますので、http:〜で接続しようとしても自動的にhttps:〜〜にリダイレクトされるはずです。.htaccessでの設定よりもこちらの方が正統派の設定です。

さて、無事SSL化が完了したら、これまでのhttp:〜〜で張り巡らしているリンクを張り替える作業が待っています。(まあリダイレクトされるので、すぐに困るわけではないですが。でも一時的にでもhttp:を経由するということはセキュリティリスクになり得ますし、場合によっては訪問者のブラウザが警告を出す可能性もあります。)