さくらレンタルサーバーのサイトを、Let's EncryptでHTTPS化する方法(Mac El Capitan版)

  • 投稿日:
  • by
  • カテゴリ:

<追記>
さくらインターネット側でLet's Encryptに対応したので、
そちらに従ってやれば一瞬です。

はじめ方
1、コントロールパネルからログインします
2、ドメイン一覧から証明書を設定したいドメインを選びます
3、証明書の登録を押します
4、「無料SSLを設定」ボタンを押して設定完了です
無料SSLサーバー証明書 Let's Encrypt - レンタルサーバーはさくらインターネット

なので、この記事は読まなくてOK!(白目)

<追記ここまで>

Entering Public Beta

ということで、Let's Encryptが2015/12/4にPublic Betaになり、
申請不要で証明書をゲットすることができるようになりました。

無料でSSL/TLSが使えるようになり、
Webサイトの送信フォームを暗号化して、
保護したりできるようになります。

また、Let's Encryptは、クライアントソフトを使うことで、
自動でSSL/TLS証明書を発行したり、更新したりという
作業を自動化できるのが特長です。

証明書の期限は3ヶ月なので、
自動化できるのはありがたいですね。

しかし、です。

このソフトで作業を自動化するには、
Webサーバ上でroot権限でコマンドを入力できる
という条件があります。

つまり、
ロリポップやさくらインターネットなどの
レンタルサーバーでは、この自動化ツールは使えない

というわけです。

レンタルサーバーにサイトを置いている人は、
Webサーバーとは別の端末で証明書を発行し、
Webサーバーに手動で証明書をインストールする必要があります。

私はこの辺りがよくわかっておらず、盛大につまづいたので、
「Let's Encryptってなになに?おいしそうなの?」
というあんまり詳しくない方は気をつけてください。

以下、作業手順をメモしておきます。

動作環境

  • Webサーバー : さくらのレンタルサーバ
  • 証明書発行端末 : Mac OSX El Capitan

作業手順

手順としては、

  1. 端末にクライアントソフトをインストール
  2. 端末でSSL/TLS証明書を発行
  3. Webサーバーに証明書をインストール

となります。

1. 端末にクライアントソフトをインストール

端末(ここでは OSX El Capitan)で、
以下の記述に従って作業します。

アプリケーション→ユーティリティ→ターミナル を起動し、
以下のコマンドを打ち込みます。
El Capitanなので、gitはインストールされている前提です。

git clone https://github.com/letsencrypt/letsencrypt

しばらく待つと、クライアントソフトが
letsencrypt ディレクトリにインストールされるので、
移動します。

cd letsencrypt

次に、Let's Encrypt ツールが実行できる
環境が整っているか、テストします。

El Capitanをクリーンインストールしている場合

ターミナルに以下のコマンドを打ち込み、
クライアントソフト実行環境のテストをします。

./letsencrypt-auto --server --debug \
https://acme-v01.api.letsencrypt.org/directory --help

「OSX環境での動作はexperimentalなので、
覚悟の上 「--debug」フラグを付けてやってね」

とのことなので、付けておきます。

おそらく、色々と文字がニョロニョロと表示された後、
以下のメッセージが出て、めでたく準備完了になるはずです。
「2. 端末でSSL/TLS証明書を発行」に進んでください。

letsencrypt [SUBCOMMAND] [options] [-d domain] [-d domain] ...

The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing the cert. Major SUBCOMMANDS are: ...

もし、上記メッセージではなくエラーが出る場合は、
以下を当たってみてください。

El Capitanを上書きアップグレードしている場合

まず、以下のコマンドをやっておきましょう。
後で出るエラーを回避できます。
(参考: Mac install failure (Python errors) · Issue #1196 · letsencrypt/letsencrypt · GitHub

sudo chown -R $(whoami):admin /usr/local
sudo chown -R $(whoami):admin /Library/Python/2.7/site-packages/

次に、以下のチェックをします。

brew doctor

おそらく

Warning: Your Homebrew is outdated. You haven't updated for at least 24 hours. This is a long time in brewland! To update Homebrew, run brew update.

とも言われると思いますので、素直に

brew update

と打ち込んで、再度

brew doctor

とします。

Your system is ready to brew.

となったら準備OK、
クライアントソフト実行環境のテストをしましょう。

ターミナルに以下のコマンドを打ち込みます。

./letsencrypt-auto --server --debug \
https://acme-v01.api.letsencrypt.org/directory --help

「OSX環境での動作はexperimentalなので、
覚悟の上 「--debug」フラグを付けてやってね」

とのことなので、付けておきます。

これで、クライアントソフトの実行に必要なものを、
勝手に色々とインストールしてくれます。

Warning: The post-install step did not complete successfully You can try again using brew postinstall python

と言われたので、素直に

brew postinstall python

とします。以下のコマンドで再度テストすると、

./letsencrypt-auto --server --debug \
https://acme-v01.api.letsencrypt.org/directory --help

augeasがなんだとか、
dialogがなんだとか文句を言われたので、
指示通りに対応します。

brew unlink augeas
brew unlink dialog

再度挑戦。

./letsencrypt-auto --server --debug \
https://acme-v01.api.letsencrypt.org/directory --help

今度は、virtualenv(Webサーバーではなく端末で
証明書を発行するための仮想環境)の
インストールのところでエラーが出ました。

Traceback (most recent call last): File "/Library/Python/2.7/site-packages/virtualenv.py", line 17, in import zlib ImportError: No module named zlib

そこで以下を実行します。
(参考: Mavericks(MacOS10.9)でpythonzのCpython2.7.6をコンパイルした後、 - 都内在住エンジニアの思考整理録

xcode-select --install
brew reinstall python

これで、エラーなしで通りました。

./letsencrypt-auto --server --debug \
https://acme-v01.api.letsencrypt.org/directory --help

をして、以下のメッセージが出れば、準備完了です。
お疲れさまでした。

letsencrypt [SUBCOMMAND] [options] [-d domain] [-d domain] ...

The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing the cert. Major SUBCOMMANDS are: ...

2. 端末でSSL/TLS証明書を発行

クライアントソフトの実行環境が整ったので、
端末で証明書を発行してみます。

root権限を持たないレンタルサーバーではなく、
別の端末(Mac OSX El Capitan)で証明書の発行のみ行い、
インストールは手動で行うため、
「certonly」「--manual」を指定します。

./letsencrypt-auto certonly --manual -d ドメイン名 --server HTTPS://acme-v01.api.letsencrypt.org/directory

「ドメイン名」は、SSL/TLS証明書を発行したいドメイン名です。

以下のようにして、一度に複数のドメインに対する
証明書を発行することもできます。
www有りとなし両方でアクセスされる可能性がある場合は、
両方指定したほうがいいです。
例えば当サイトであれば、

./letsencrypt-auto certonly --manual -d umurausu.info -d www.umurausu.info --server HTTPS://acme-v01.api.letsencrypt.org/directory

みたいな感じです。
SNIっていうの?よく知りませんが。

コマンドが間違っていなければ、
突如ターミナルが青い背景の画面に突入するので、
連絡用にメールアドレスを入力したり、
利用規約にAcceptしたりします。

ターミナルなので、マウスでクリックしても
反応がなく困ったのですが、
「Accept」の「A」を押したりしたら進めました。

押しても反応がなかったら、Tabを何回か押して
「Accept」などをハイライトさせて試してみてください。

次に、以下のような謎のコマンドが表示されます。

mkdir -p /tmp/letsencrypt/publichtml/.well-known/acme-challenge cd /tmp/letsencrypt/publichtml printf "%s" すごく長い文字列 > .well-known/acme-challenge/結構長い文字列 ... Press ENTER to continue

表示される画面や手順は、
以下のサイトを参考にしてください。
.well-known/acme-challenge

で、これらの3つのコマンド(mkdir と cd とprintf)を
Webサーバ上で実行せよ、ということです。
(本当はもう一つコマンドが下にありますが、
これはやらなくても大丈夫です)

「すごい長い文字列」「結構長い文字列」は、
ランダムな數十桁の文字列です。

一番下に

Press ENTER to continue

とありますが、次の作業を行う前に
ENTERを押すと失敗するので、
そのまま放置しておきます。

このコマンドたちが行うことは、

  • ドメイン名/.well-known/acme-challenge ディレクトリを作る
  • 上のディレクトリに、「すごく長い文字列」が書かれた、
    「結構長い文字列」という名前のテキストファイル
    を置く

ということです。

Webサーバー(レンタルサーバー)にsshで接続できれば、
上記の3つのコマンドを実行すればOKです。

ちなみに、さくらレンタルサーバーの場合は、
1つ目と2つ目のコマンドは以下のようになります。

mkdir -p /home/アカウント名/www/.well-known/acme-challenge
cd /home/アカウント名/www/

sshが使えない場合は、FTPで上記フォルダを作成して、
「すごく長い文字列」が書かれた
「結構長い文字列」という名前のファイルを作って、
そのフォルダにアップロードしてください。

ファイルを置けたら、端末のターミナルで、
ENTERを押します。認証が成功すると、

IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.takipone.com/fullchain.pem. Your cert will expire on 2016-01-24. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.

と端末のターミナルに表示され、

/etc/letsencrypt/live/ドメイン名/

みたいなところに

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

の4つのファイルが生成します。
これが証明書です!やった!

ちなみにこれらは

/etc/letsencrypt/archive/ドメイン名

にある - certN.pem - chainN.pem - fullchainN.pem - privkeyN.pem

というファイルへのシンボリックリンクです。
Nは数字で、証明書を作る度にカウントアップするっぽいです。

何回証明書を作っていても、
/live 以下のファイルを見ていれば、
最新版の証明書ファイルにリンクされている!
というわけです。
(参考: 無限無料 SSL/TLS 証明書 - 知らないけどきっとそう。

便利そうだけど、こちとら手動インストールだから
関係ないね!

3. Webサーバーに証明書をインストール

さくらレンタルサーバーの場合

他社で取得したSSL証明書を使用する|さくらインターネット公式サポートサイト の記載の通り進めます。

「ドメイン設定」 で、
SSL証明書を登録したいドメインの行の
「SSL証明書」 > 「登録」 をクリック。

「秘密鍵をすでにお持ちの場合には、
アップロードをしてください」

の方を選択。

/etc/letsencrypt/live/ドメイン名/privkey.pem

を選択。

次に独自SSLの設定
「証明書のインストールを行います」
では、

/etc/letsencrypt/live/ドメイン名/cert.pem

の内容をコピペ。

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

BEGINとENDから始まる、最初と最後の行を含む
(最後に空白行も追加しない)ことに注意です。

次に中間証明書のインストールをします。
同様に、

/etc/letsencrypt/live/ドメイン名/chain.pem

の内容をコピペします。

通ると、

「証明書の表示」「中間証明書の表示」が
表示されるようになります。

次に、 ドメイン設定 > 「ドメイン詳細設定」
に行き、

  1. SSLの利用を選んでください

SNI SSLを利用する

にチェック、設定すればOK!

ちなみにMovable TypeのサイトをSSL/TLS化しようとすると、
結構大変なことになるので注意。

 replace="http:",""

が活躍。

参考 - MovableTypeで // から始まるURL、スラッシュから始まる絶対パスを使う - HTTPSとHTTPを上手に使い分ける小技 - IMPOV::In My Point Of View

WordPressは、「WordPress HTTPS」というプラグインで行けるらしい。


参考