Blog Detail

無料でサーバー証明書を取得してウェブサイトを暗号化しよう!Let’s Encrypt!

2016年10月18日
Linux, ウェブ開発
, , ,
4 comments

Let’s Encrypt という無料でサーバー証明書を発行してくれるサービスがあります。
(´-`).。oO(いい時代になったなぁー

サーバー証明書とは、インターネットであなた(クライアント)とサービス提供者(サーバー)との間の通信を秘密にする為に必要なものです。
ウェブで言うと、ウェブブラウザとウェブサーバー間で暗号通信を行う為に必要なものという事です。
サーバー証明書はサービス提供者(サーバー)側で暗号化通信のサービスを提供する為に必要になるものです。

ブログサイトを持っているという事は、ブログというサービスを提供する側になったという事です。(有用なサービスかはともかく…)
暗号化された安全な通信手段を提供するかどうかはサービス提供者側に責任があります。
とはいえ、これまではサーバー証明書を入手するには認証局(CA)業者から ”有償で” 発行してもらうしか手段がありませんでした。
個人で非営利目的のサーバーを運用している場合、これはなかなかハードルが高いものでした。

現実世界では多くの国で「通信の秘密」というのが重要とされ守られています。日本もそうです。
封書で私の恥ずかしい駄文を送っても、配送途中で封筒を開けられ誰かに読まれるという心配はありません。
現実世界では当たり前の様に考えられている事がインターネットではまだ実現出来ていません。これは由々しき事です
暗号化されていないデータは、ネットの通信経路の間で簡単に読まれてしまう危険性がある事をもっと認識すべきです。

Let’s Encryptが正式サービスを始めた事で、サーバー証明書入手のハードルは無くなりました。
サーバー運用者のみなさんは迷う事無くLet’s Encryptのサーバー証明書を入手し、暗号化された安全な通信を提供出来る様にしましょう!Let’s Encrypt!

  • Let’s Encrypt 総合ポータル
    https://letsencrypt.jp/
    ↑サイト運営者が誰なのかいまいち良く解りませんが、日本語で情報提供を行っているサイトです。

さて、前置きが長くなりましたが、サーバー証明書入手とサーバー設定をやって行きましょう。


 

以下CentOS7の場合です。

Let’s Encryptクライアントソフトウェアのインストール

Let’s Encryptの利用に必要なソフトウェアはEPELリポジトリから取得可能です。
パッケージ名は「certbot」です。サクッとインストールしちゃいましょう。

CentOS6では何やらいろいろとエラー対策が必要な様なのですが、CentOS7では特に何も無く簡単に使い始める事が出来ます。

取得するホスト名(FQDN)の決定

Let’s Encryptで取得できるサーバー証明書は「マルチドメイン」に対応しています。
正確には、x509 証明書のSubject Alternative Names(サブジェクト代替名)、いわゆるSANの機能に対応しています。

これによって、一つの証明書で複数のホスト(FQDN)に利用可能になります。
一般的な利用方法としては、www.hogehoge-k.com とホスト名を省略したドメインのみの hogehoge-k.com を一つにサーバー証明書にまとめてしまうという様な使い方になるでしょうか。
今回はこれらに加え blog.hogehoge-k.com も加えてみる事にしました。

  1. www.hogehoge-k.com
  2. hogehoge-k.com
  3. blog.hogehoge-k.com

以下このホスト名(FQDN)の場合です。

DNSの設定

申し込むホスト名(FQDN)であなたのサーバーのIPアドレス(グローバルアドレス)が正引き出来る様に設定しておいて下さい。

ドメイン使用権者の認証方法の決定

Let’s Encryptはサーバー証明書を発行する際(certbotコマンドを実行する際)に、申し込みのあったホスト名(FQDN)のサーバーが本当にあなたが所有しているものなのかどうかを確認します。
確認方法はいくつか選択出来ますが、今回は一番よく使われると思われる 「Standalone」 の方法で進めたいと思います。

Standaloneでの認証(ドメイン使用権者の認証)は、certbotコマンドが一時的にウェブサーバーになりLet’s Encryptのサーバーからアクセスを受け付ける事で行います。
この為、作業を行うサーバーはインターネットからポート80もしくは443でアクセス出来る環境にある事が必要になります。
また、ウェブサーバーを稼働中の場合はcertbotコマンドにポートを使わせる為に作業中は一時停止させる必要があります。

LAN内にあるマシンなどで作業する場合は、Standaloneでの認証はそのままでは行えません。「Manual」の方法であればどんな環境でも作業を行えると思いますので調べてみて下さい。
この場合でも一時的にPort Forwardで飛ばしてくれば、DMZやLAN内のマシンでもStandaloneで認証する事は出来るでしょう。私はこの方法で行いました。仕組みが解ればいろいろ策は打てると思います。

certbotコマンドの実行

管理者のメールアドレスを登録する必要があります。受信可能なあなたのメールアドレスを指定して下さい。
緊急の通知や、証明書の有効期限の通知、鍵を紛失したときの復旧時に使用されるそうです。
ここでは「webmaster@hogehoge-k.com」とします。

オプションの説明

  • certonly
    サーバ証明書の取得のみを行います。「のみ」と言うのは、他にもウェブサーバーの設定を自動で書いてくれる機能があるらしいのですが、これはちょっと怖いので試していません。
  • –standalone
    Standalone方式での認証を行います。
  • –email メールアドレス
    管理者のメールアドレスを指定します。
  • –text
    デフォルトはTUIのユーザーインターフェースですがTUIが嫌な人は付けましょう。重要では無いです。お好みで
  • -d ホスト名(FQDN)
    マルチドメイン対応である為、証明書に含めたいホスト名(FQDN)をずらずらと必要な分だけ繰り返し書いていきます。
    最初に記述したホスト名(FQDN)が証明書の Subject(発行先)コモンネーム(CN) になる様です。他はSubject Alternative Names(SAN)に登録されます。
    指定する順番は気を付けた方が良さそうです。

では実行しましょう。

これで終わりかよー、簡単過ぎるーー

そうそう、重要な事を忘れてました。
Let’s Encryptが発行してくれるサーバー証明書の有効期限は3か月です。
現在のところ1年や複数年など長い期間の証明書は得られません。期限切れに気を付けましょう。

証明書の確認

関係するファイルは /etc/letsencrypt/ 下に作成されます。

サーバ証明書、中間証明書、サーバ証明書と中間証明書の結合ファイル、秘密鍵のファイル4つが /etc/letsencrypt/archive/ホスト名(FQDN)/ 下に作成されます。
ファイル名に番号が付いていますが、証明書の更新を行う度に順番に生成されていくものと思われます。cert1.pem、cert2.pem、cert3.pemの様に。
また、/etc/letsencrypt/live/ホスト名(FQDN)/ 下には実体を参照するシンボリックリンクが作成されます。これは更新の度に最新のファイルを参照する様に張りなおされると思いますので、ウェブサーバーの設定にはこれを指定しておくと便利です。

今回の場合では以下のパスをウェブサーバーに設定すればOKです。

  • サーバ証明書(公開鍵)
    /etc/letsencrypt/live/www.hogehoge-k.com/cert.pem
  • 中間証明書
    /etc/letsencrypt/live/www.hogehoge-k.com/chain.pem
  • サーバ証明書と中間証明書の結合ファイル
    /etc/letsencrypt/live/www.hogehoge-k.com/fullchain.pem
  • 秘密鍵
    /etc/letsencrypt/live/www.hogehoge-k.com/privkey.pem

証明書の中身を確認しておきましょう。

SubjectのCN と X509v3 Subject Alternative Name の値を確認します。
指定したホスト名(FQDN)が登録されていればOKです。

CSRを用いたサーバー証明書の取得

自身で作成したプライベートキーを使いたい場合は、CSRを用いたサーバー証明書の取得も可能な様です。
「–csr」オプションについて調べてみて下さい。

試してみましたが、CSRに入力した情報、国名(C)/都道府県名(S/ST)/市町村名(L)/組織名(O)/組織単位名(OU) などの情報は一切サーバー証明書には含まれていませんでした。

特別な理由が無い限りは、プライベートキーの生成から何から全部お任せの今回の方法が便利で良いと思います。

Apacheの設定

CentOS6、Apache 2.2系の設定例です。(CentOS7じゃないよ)
名前ベースの仮想ホストの設定を行う場合。

暗号化無しのhttp:(ポート80)でアクセスされた場合はhttps:(ポート443)にパーマネントでリダイレクトしてあげるのが良いでしょう。

こんな感じで当ブログのサーバー証明書の取得と設定も完了し、暗号化されたウェブサイトになりました。
ブラウザのURL欄に鍵マークが付いていると安心感が違いますよね。

サーバー証明書が無料で入手出来るとは、良い時代になったなぁーーーと思います。
みなさまも是非試してみて下さい。

4 Comments

  1. kenji00 10月 18, 2016 at 9:48 pm Reply

    はじめまして。

    私のサイトもLet’s EmcryptでSSL化してます。CentOS6ですがw
    ちなみに更新はcron任せで自動化できますよ。仮に毎日廻しても更新期限が先のものはSKIPしてくれるので楽チンです。

    私はこんな感じにしてます。
    0 4 20 * * service httpd stop ; /usr/bin/certbot-auto renew ; service httpd start

  2. hogehoge.k 10月 18, 2016 at 11:23 pm Reply

    どうもー、はじめまして!

    CentOS6ならまだまだ現役ですよー。我が家には5の現役サーバーがまだ居ますからw

    3ヶ月毎の更新になりますから、やっぱり更新忘れが怖いですね。
    私も何か対策を考えないといけないです。とりあえずGoogleカレンダーには登録しときました。(いいのかこんなんで…w

    とりあえず、3ヶ月後の最初の更新時には手動で更新作業を行って、どんな作業になるのかまた記事にして紹介してみたいなと思っています。
    その後で自動更新を始めてみたいと思います。

    アドバイスありがとうございますー。また遊びに来てくださいね。
    ではでは

    • kenji00 10月 22, 2016 at 10:59 am Reply

      私はやっと手元で管理しているCentOS5を全て移行完了したところです。来年3月でEOLですもんね……

      あ、Let’s Encryptは更新まで20日切るくらいのタイミングでexpiry@letsencrypt.orgから通知メール来るから更新忘れる心配の方は大丈夫ですよw

      • hogehoge.k 10月 22, 2016 at 10:47 pm Reply

        私も5からの移管作業を急がなけりゃいけませんねー
        いくつかお手製のプログラムが動いていて、一つ一つ移管先での動作確認を行わなくてはならず、面倒なので先送り先送りで今まで来てしまいました。
        たぶん5から7だとすんなり動いてくれませんねーw 大変だw

        Let’s Encryptのプロジェクトはしっかりしてるみたいですね。
        この件に関しては私自身で経験した事をまた記事にしたいと思っています。

Leave A Comment