ここは僕の冷蔵庫。後はあれして食べるだけ。

I love the frozen FOOD.

SSL証明書は、結構な運用経費がかかるもの。
かといって、「オレオレ証明書」では運用できない。

今回は、手数料無料でSSL証明書を発行できる Let’s Encrypt を使ってみる。

Let’s Encrypt

非営利団体のISRGが運営しておる証明書関連プロジェクト。
非営利だけあって証明書発行なども無料。商用もOKだそうな。
この団体のスポンサーは、シスコやモジラ財団なども入っており、いわゆる大手企業・大手団体がサポートしている感じだそうな。

必要条件

証明書を設定するためには、最低限、下記の環境(条件)が必要。

  • sshで接続可能なLinuxなどのサーバ
  • パッケージをインストールしたりできること

注意事項

2016.4.13現在、証明書の有効期間は90日間。
60か月程度で更新する必要あり。

証明書について

主要ブラウザでhttps使えます。スマフォでもいけました。
IEだの、chorome,firefoz,safariなどなど。

手順

letsencryptをgitから取得

一般ユーザでsshでサーバにログインした後、letsencryptツールをダウンロードする。
※証明書を取得するツール

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

letsencrypt環境作成

当該ツールで必要な環境を作ってくれるコマンドを実行する。

cd letsencrypt/
./letsencrypt-auto –help

Phythonなどインストールされていない環境の場合は、勝手にすべてインストールされます。
尚、このコマンド実行時に sudo が使われているようですが、こととき、

sudoers ファイル内にありません。この事象は記録・報告されます。

というエラーがある場合、下記にしたがい sudo 環境を作ってくだされ。

su –
visudo

viでsudoの設定ファイルが開く。このファイルの中に

Allows people in group wheel to run all commands
#%wheel ALL=(ALL) ALL

となっている行があるので、 #wheel の # を外してください(コメントを外す)。
次に、先ほどsshでログインしたユーザID(ここでは仮にtestとします)に、グループ権限を等を追加。

usermod -G wheel test

この状態で、

su – test

としてあげれば、test ユーザにて sudo が実行可能。

証明書を取得する

環境が出来たので実際に証明書を取得する。
たとえば、私のサイト www.nemuizo.com を取得する場合は、下記のようにコマンドを実行する。

./letsencrypt-auto certonly -a standalone -d gem-one.jp -d inquiry.gem-one.jp

ブルーバックになり、

  • メールアドレス
  • 利用規約
  • ドメイン

などきかれる。素直に入力しよう。

尚、ここでエラーが出てくる場合がある。
2パターンあるので個別に紹介。

●すでにWebサーバが立ち上がってる場合のエラー

The program httpd (process ID 30656) is already listening on TCP port 80.
This will prevent us from binding to that port.
Please stop the httpd program temporarily and then try again.

的なエラーが出る場合がある。
letsencryptツールは、実行時にhttpポート(80)を使うので、当該ポートですでにwebサーバなどが立ち上がっている場合、エラーとなる。
この場合は、素直に一度Webサーバを停止させておこう。
ルートで apache をストップする場合はこんな感じ。

/etc/rc.d/init.d/http stop

尚、letsencryptツールが終了したら、Webサーバを立ち上げておくことを忘れずに。
この後、再度、「./letsencrypt-auto certonly~」のコマンドを実行すればよい。

●証明書取得エラー zName ….

証明書の取得に失敗する場合は、マニュアルモードで実行するとよい。

./letsencrypt-auto certonly -a standalone -d gem-one.jp -d inquiry.gem-one.jp -a manual

ブルーバックの状態から、急に

If you don’t have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf “%s” xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxx > .well-known/acme-challenge/xxxxxxxxxxxxxxxxxxxxxxxx
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
“import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer((”, 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()”
Press ENTER to continue

というメッセージが出る場合は、他のシェルを立ち上げ、root権限にてmkdir コマンド以降を順次実行しよう。
尚、最後の 「$(command -v 」で始まるコマンドは、常駐コマンドのため入力が復帰しないのに注意。
最後のコマンドを実行して10秒程度待ったら、先ほどのシェル(Press ENTER to continueが出ている方のシェル)に戻り、リターンキーを押す。

うまくいけば、

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/inquiry.gem-one.jp/fullchain.pem. Your cert
will expire on 2016-07-12. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.

が出てきて、めでたく証明書発行の終了。

証明書の保存場所

Letsencryptの情報は、

/etc/letsencrypt/

に格納されてる

証明書  :/etc/letsencrypt/live
証明書本体:/etc/letsencrypt/archive

尚、「証明書」は「証明書本体」にある「本体」のシンボリックリンク。「本体」は証明書の有効期限が過ぎしだい、随時アップデートされるが、シンボリックリンク先は不変。
したがってapacheなどの設定にて証明書を使う場合は、「証明書」のディレクトリにある証明書を使えばいい。

尚、上記ディレクトリ直下に発行対象のドメインディレクトリがあり、その直下に下記のファイルがある。

サーバ証明書(公開鍵) cert.pem

中間証明書 chain.pem

サーバ証明書(秘密鍵) privkey.pem

Apache設定

conf.d/vhost.conf などで、 virtual hostの設定を。

参考サイト