初心者でもできるLet’ EncryptでWordPressマルチサイトを完全https化 保存版

スポンサーリンク

Let’ Encryptって何?

簡単に言うと無料でサイトをhttps化(暗号化)できる認証局です。その認証を容易に取得するのがCerbotっていうソフトウェアです。ブラウザとサーバ間の通信は従来のhttpでは暗号化されておらず盗み見られる可能性があります。それを暗号化して安全に通信できるようにしたのがhttpsというプロトコルです。すなわち、このサーバは安全ですよというお墨付きを与える認証局がLet’ Encryptなのです。

Cerbotって何?

Webサーバが認証局Let’ Encryptから認証を取るクライアントソフトウェアです。ここではサーバがLet’ EncryptでクライアントがWebサーバという意味になるのでご注意ください。

実際にどのようにhttps化するの?

いよいよ本題ですね。CerbotとLet’ Encrypt間の認証通信においてこのWebサーバは本当に実在して暗号化をサポートしているかをまず見ます。それに合格すると証明書が発行されそれをWebサーバに設置すればいいのです。これでhttps化、つまり暗号化された通信がブラウザとWebサーバ間で行われるのです。それを保障しているのがWebサーバに設置した証明書になるわけですね。

実際に証明書の取得とWebサーバへの設置方法は?

Cerbotを使っての証明書の取得方法

これは簡単になって来ています。私のCentOS6.8環境でも容易にできましたよ。以前まではPython2.7に上げなくてはいけなかったみたいですが、現在ではPython2.6のままで問題なく証明書の取得ができます。前提として次の環境下で実施しました。

  • OS:CentOS 6.8
  • Webサーバ:Apache/2.2.15
  • Python 2.6.6
  • さくらのvps

Pythonはそのままでいいです。とりあえずepel、mod_ssl、git等がインストールされているかを確認します。

$ yum list installed | grep epel
$ yum list installed | grep mod_ssl
$ git --version

インストールされていない場合は適宜インストールしておいて下さいね。

mod_sslをインストール UbuntuターミナルからさくらvpsへSSH接続

mod_sslをインストール UbuntuターミナルからさくらvpsへSSH接続

あとはポート80と443を開けておくのを忘れないで下さいね。Let’ Encryptでhttps通信がちゃんと行われているかの確認に使います。確認と設定は例えばここで。私の場合両ポート共に開放済みでした。

Cerbotのインストール

この辺りを参考にしていきます。

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
$ ./certbot-auto

Cerbotの依存ライブラリ等が自動インストールされる

Warningが出ますがOKです。一旦Cでキャンセル

Warningが出ますがOKです。一旦Cでキャンセル

ここで、Apacheを一時停止させます。その後再びCerbotコマンドを打ちます。

$ sudo service httpd stop
$ sudo ./certbot-auto certonly

私の場合上の様な選択をしました。ドメイン名に関しては名前ベースのバーチャルホストを5つ使っています。Let’ EncryptではSANを使って代表ドメイン一つの証明を取得するだけで残り四つの証明書も取れます。

SANって何?ってなりますよね?Subject Alternative Nameの略称でSubjectの別名ということになります。Subjectって「主題」という日本語訳の通りCommon Nameつまりここでは代表ドメインshibainu-kuro.comのことを指し、その別名がichikarano-programming.site hajimeteno-linux.site notepc-env.site html5karanoippo.siteとなります。結論的には代表ドメインshibainu-kuroの証明書一つを取得するだけでいいのです。上に書いたドメイン5つは当然DNSに登録されている独自ドメインでなくてはいけませんよ。個々ドメインごとに認証書を取得する必要がないSANは一つのIPでバーチャルホスト機能を使ってマルチドメインを運用している場合とても便利だと思います。

無事に認証が通ると認証書がダウンロードされます。

おめでとう!メッセージ

おめでとう!メッセージ

認証書がダウンロードされる

認証書がダウンロードされる

認証ファイルをApacheへ設置

認証ファイル(書)が無事ダウンロードされました。ここでApacheの再起動をかけるとどうなるでしょうか?

$ sudo service httpd restart

ただ単に従前のポート80を使ってのhttp通信ができるだけで、ポート443のhttps通信は当然できません。それはおそらく以下のような事情からです。

Apacheを再起動

Apacheを再起動

/etc/httpd/conf.d/ssl.conf

がデフォルトのhttps(SSL/TLS)通信を担っていますが、Apacheのバーチャルホストに個別にSSL/TLS通信の設定がないからです。この辺りは皆様方関係サイトの説明ではほとんど触れられずサラッと流されています。まぁ~当然のことなのでしょうね?でも私を含め初心者の皆様が一番悩む所ではないかと思います。少なくとも私は深く?悩みましたよ。(笑) 一番オーソドックスで簡単と思われる設定を皆様が悩まずに済む方法を紹介します。この方法は私が検証した限りうまく動作してくれたので間違いではないはずです。

/etc/httpd/conf/httpd.confにまとめて設定する

Apacheの大元の設定ファイルであるhttpd.confにSSL/TLS通信の設定を個別に書けばいいようです、というかそれが間違いなく一つの方法です。言葉で説明するより私のhttpd.confのVirtualHost以下関係個所を全て引用します。是非参考にして下さい。

# httpd.confの末尾 VirtualHostの設定:ポート80 これは使わないが残しておく

NameVirtualHost:*:80
<VirtualHost *:80>
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/html5karanoippo.site
    ServerName html5karanoippo.site
    ServerAlias *.html5karanoippo.site
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/html
    ServerName shibainu-kuro.com 
    ServerAlias *.shibainu-kuro.com
<Directory "/var/www/html>
    Options Indexes FollowSymLinks
    Options -MultiViews
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/ichikarano-programming.site
    ServerName ichikarano-programming.site
    ServerAlias *.ichikarano-programming.site
<Directory "/var/www/ichikarano-programming.site/">
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/ichikarano-programming.site
    ServerName hajimeteno-linux.site
    ServerAlias *.hajimeteno-linux.site
<Directory "/var/www/ichikarano-programming.site/>
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/ichikarano-programming.site
    ServerName notepc-env.site
    ServerAlias *.notepc-env.site
<Directory "/var/www/ichikarano-programming.site>
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

# ここからがSSL/TLS通信の設定 ポート443
# 最初の4行をポート80の設定に書き加える

NameVirtualHost *:443
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/shibainu-kuro.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/shibainu-kuro.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/shibainu-kuro.com/fullchain.pem
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/html5karanoippo.site
    ServerName html5karanoippo.site
    ServerAlias *.html5karanoippo.site
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/shibainu-kuro.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/shibainu-kuro.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/shibainu-kuro.com/fullchain.pem
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/html
    ServerName shibainu-kuro.com
    ServerAlias *.shibainu-kuro.com
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    Options -MultiViews
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/shibainu-kuro.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/shibainu-kuro.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/shibainu-kuro.com/fullchain.pem 
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/ichikarano-programming.site
    ServerName ichikarano-programming.site
    ServerAlias *.ichikarano-programming.site
<Directory "/var/www/ichikarano-programming.site/>
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/shibainu-kuro.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/shibainu-kuro.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/shibainu-kuro.com/fullchain.pem
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/ichikarano-programming.site
    ServerName hajimeteno-linux.site
    ServerAlias *.hajimeteno-linux.site
<Directory "/var/www/ichikarano-programming.site/">
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/shibainu-kuro.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/shibainu-kuro.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/shibainu-kuro.com/fullchain.pem 
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/ichikarano-programming.site
    ServerName notepc-env.site
    ServerAlias *.notepc-env.site
<Directory "/var/www/ichikarano-programming.site/>
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
</VirtualHost>

私の場合このように設定して動作がきちんと行われているようです。vhost.confやssl-vhost.confを使った設定は私はわかりませんのであしからず。初心者の方は大半httpd.confにVirtualHostの設定をここ等などで行っているでしょうから私を含めこの設定を採用させていただきます。

WordPressへの対応

基本的には上述の設定で問題ありません。私は通常サイト一つ html5karanoippo.site WordPress通常サイト一つshibainu-kuroとWordPressマルチサイトが一つ(親サイトがichikarano-programming.site 子サイト1がこのサイトであるhajimeteno-linux.site子サイト2がnotepc-env.site)で運用しています。マルチサイトの場合上で述べた通りポート80での設定がきちんとできていると、ほとんどそのコピーであるポート443の設定で正しく機能します。後はページ内リンクの設定をhttpからhttpsに変えてWordPressの一般設定でサイト内アドレスを変え、リダイレクト処理で80に来たアクセスを443に飛ばすくらいかな?アフェリエイトをサイト内に貼っている場合、広告URLでhttpsに非対応の場合は混在コンテンツで問題になるみたいです。リダイレクト設定のコードは以下のようになります。これをルートディレクトリにある.htaccessへSSH等でアクセスしてコピーします。この辺りはこちらが詳しいですよ。ここで注意点ですがWordPressの親サイトのアドレスはデータベースをいじらなければいけないようです。とりあえず保留中です。あとWordPressのマルチサイト用のhttpd.confの書き方は私のこの記事を参照してくださいね。というか、このサイトのhttpd.confを参考にするとWordPressのマルチサイト用にそのまま流用できますよ。ここは悩みました…ただWordPressのマルチサイトは確かにプラグインが一元管理できるメリットがあるのですが、一方で色々制約があるかもです…

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

まとめ

いかがだったでしょうか?やってみれば意外と簡単にできます。ただしコンテンツが一杯あるサイトの方は尻込みするのもわかります。失敗したら…っていう恐怖心がありますものね?でも上の手順を追えばポート80のhttp通信もフォローできますので失敗とかは考えなくていいのかもしれませんね。GoogleさんやMozillaさんがSSL/TLS通信に積極的に動いている今、全面的にサイトのhttps化も考えていかなければいけないのでしょうね。いつやるか?と問われれば「今でしょ!」ってことになるのかな…(笑)

今回https化した私のサイトのURLを貼っておきます。いかにコンテンツがないかわかりますよ。一つだけリダイレクトを入れてないのが通常サイトのhtml5karanoippo.siteです。httpとhttps両方からのアクセスが可能です。あとのサイトはhttpsに強制リダイレクトされます。リダイレクトリンクは貼るなというGoogleさんの教えによりhttpsサイトのURLを記します。

https://html5karanoippo.site

https://shibainu-kuro.com

https://ichikarano-programming.site

https://hajimeteno-linux.site

https://notepc-env.site

スポンサーリンク

シェアする

フォローする

スポンサーリンク