shimabox.netをcertbot(let’s encrypt)でSSL対応したけど苦戦した話

投稿日:

というわけで、shimabox.netを常時HTTPS化させました。
その際、結構苦戦した所があったのでメモとして残しておきます。
※ 苦戦したのはmod_sslのインストールですが、詳しくは後述します

2017/05/13 追記

注意

今現在のバージョン(0.14.0 – 2017-05-04)だと、certbot-auto コマンドを打った後、TUIでなくCLIで設定を進めていくかたちになっています。

また、CLIで出される設問への解答次第ではSSL環境へのリダイレクト処理をconfファイルに書き込んでくれたりと更に便利になっていたりしています。

Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

この様に途中で聞かれて、 2 を選択すると

Added an HTTP->HTTPS rewrite in addition to other RewriteRules; you may wish to check for overall consistency.
Redirecting vhost in /etc/httpd/conf.d/virtual.hoge.conf to ssl vhost in /etc/httpd/conf.d/virtual.hoge-le-ssl.conf

既存のconfファイルにRewriteRulesを追記してくれて、新たにSSL環境用のconfファイルを作ってくれます。

その為、下記の 5. 再度certbotの環境構築 以降の情報はかなり古いものになりますので別途ググったほうがよいです。
※ 4-3. mod_sslのインストール(CentALTリポジトリを使って) までは参考になる人もいらっしゃるんじゃないかなぁと

2017/05/13 追記 ここまで

背景

Google様のこれとか

Apple様のこれ

とかあって時代がHTTPSを求めているなと。これはこの先を考えるとやるしかないなと。でも証明書の料金がなぁ。。こんなショボいサイトに金使うのかぁ。。。とグズグズしながら、無料 SSL証明書 でググってみると、ざわ、ざわ…ざわ…、Let’s Encrypt?というキーワードが巷で溢れかえっているではありませんか。

Let’s Encrypt – Free SSL/TLS Certificates

こちら、なんと無料です。

で、更に使い方を調べてみると、Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータルに出会います。
このサイトは CentOS 6 で発生するエラーの対処法 – Let’s Encrypt 総合ポータルよくある質問 – Let’s Encrypt 総合ポータル というような救いの手をきちんと書いてくれていたので、こちらを参考に進めました。

環境

導入手順を書く前に、自分の環境を。

$ cat /etc/redhat-release
CentOS release 6.7 (Final)

あと、opensslは入っていたけど、mod_sslは入っていませんでした。

自分が実際に行った手順

基本的に、上記Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータルの通りに進めれば上手く行くと思いますが、一応自分が実際に行った手順を書いていきます。

1. 443番ポート(HTTPS)の確認

ファイヤーウォールで80番は開けていても、443番は開けていない場合もあると思うので、
まず443番ポートが開いているか確認します。  
自分は開いていなかったので以下の通り、iptablesに追記しました。

$ sudo vim /etc/sysconfig/iptables
# これを追加
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
# 反映
$ sudo service iptables restart

2. Certbotのインストール

gitからCertbotクライアントを落とします。
場所はどこでもいいみたいです。自分はユーザーのHOMEに置きました。

$ git clone https://github.com/certbot/certbot

※ ちょっと前まではletsencryptだったみたいだけど、今はcertbotになった様です

3. pythonを2.6から2.7へアップデート

まず、certbotを使うにはpython2.7以上が必要だそうです。
CentOS6.x系はデフォルトで2.6が入っているのでそのままでは使えません。
その為以下の手順を行って、pythonを2.7系にします。

$ sudo yum install centos-release-SCL
$ sudo yum install python27 python27-python-tools
$ sudo yum install dialog
# python27を有効化(勝手にrootになるよ)
$ sudo scl enable python27 bash
$ python -V
Python 2.7.8

4. certbotの環境を整える

以下コマンドを打つと、Certbotクライアントを実行できる環境を整えてくれます。  
※ 依存関係のあるパッケージを入れてくれたりとか

$ cd certbot/
$ ./certbot-auto

4-1. ここでエラー (mod_sslが入らない)

で、なんということでしょう。僕はここで以下のエラーが発生してしまいました。

エラー: パッケージ: 1:mod_ssl-2.2.15-53.el6.centos.x86_64 (base)
             要求: httpd = 2.2.15-53.el6.centos
            インストール: httpd-2.2.27-1.el6.x86_64 (@CentALT)
                httpd = 2.2.27-1.el6
            利用可能: httpd-2.2.15-53.el6.centos.x86_64 (base)
                httpd = 2.2.15-53.el6.centos
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest
Could not install OS dependencies. Aborting bootstrap!

うっそ~ん、mod_sslが入れられない…だと? Why! Japanese People! Why?? と、終始1時間は悩んだでしょうか。だって、certbotの導入で同じエラーが出たっていう情報がなかなか無い。
これはもしやcertbotの導入以前の問題??と思って冷静にエラーメッセージを見てみたところ(早く見ろ)、mod_sslを必要とするんだけど、httpdが依存関係になっているがhttpdのバージョンがなんかおかしいよっ!ていう雰囲気を感じ取りました。ってか、インストールされているhttpdのバージョンはhttpd-2.2.27-1.el6.x86_64 (@CentALT)なのに、mod_sslが求めているバージョンはhttpd-2.2.15-53.el6.centos.x86_64って言っていますね。
実際に調べてみると

$ yum list httpd
インストール済みパッケージ
httpd.x86_64    2.2.27-1.el6    @CentALT

と出ました。

4-2. エラー原因判明

そこでピコーン!と思い出したわけです。そういえば、apache(httpd)のバージョンをあげていたことに。
確か、脆弱性のあるバージョンだったから

を参考にバージョンを上げていたのでした(CentALTリポジトリ使ってインストールしてますね)。
じゃあ、mod_sslもCentALTリポジトリを使ってインストールすればいけるんじゃね? ってことで調べてみると、

$ yum list --enablerepo=CentALT | grep mod_ssl
httpd24-mod_ssl.x86_64                   1:2.4.18-10.el6          @centos-sclo-rh
mod_ssl.x86_64                           1:2.2.27-1.el6           CentALT

ビンゴ!ありました。

4-3. mod_sslのインストール(CentALTリポジトリを使って)

そうとなれば、以下を実行してインストールです。

$ sudo yum -y install --enablerepo=CentALT mod_ssl
$ rpm -q mod_ssl
mod_ssl-2.2.27-1.el6.x86_64

無事、mod_sslが入りました。

5. 再度certbotの環境構築

mod_sslも入ったので、再度certbotを実行します。

$ ./certbot-auto

色々進む

=======================================================================================
 パッケージ                 アーキテクチャ  バージョン             リポジトリー   容量
=======================================================================================
インストールしています:
 python-devel               x86_64          2.6.6-64.el6           base          172 k
 python-pip                 noarch          7.1.0-1.el6            epel          1.5 M
 python-tools               x86_64          2.6.6-64.el6           base          870 k
 python-virtualenv          noarch          1.10.1-1.el6           epel          1.3 M
依存性関連でのインストールをします。:
 python-setuptools          noarch          0.6.10-3.el6           base          336 k

トランザクションの要約
=======================================================================================
インストール         5 パッケージ

総ダウンロード容量: 4.1 M
インストール済み容量: 13 M
これでいいですか? [y/N]y
・
・

無事最後まで行きました(やった)。
最後まで行くと以下のようにTUI(こういうのTUIっていうんですね)が表示されました。
apacheの設定を見ているのか分かりませんが、confファイルで設定しているServerNameが全部出てきました。何かを選べと言っているように見えますが、ここでは取り消しを選びました。
※ TUIの表示内容が上記のLet’s Encrypt の使い方 – Let’s Encrypt 総合ポータルと違ったので怯んだ

6. certbotの実行

certbotを実行する環境は整ったので、後はcertbotの実行です。と、その前にapacheを止めときます。  
※ apacheを止めない方法(--webrootを使う)もありますが、僕は止めました

$ sudo service httpd stop

6-1. certbotの実行

$ ./certbot-auto certonly --standalone -d example.jp -d www.example.jp

※ オプション「-d」で指定されている「example.jp」「www.example.jp」は、サーバ証明書の取得を希望するドメイン名・サブドメイン名に置き換えてください

6-2. メールアドレスの入力

上記実行後、少し待つと以下のTUIが出てくると思いますので、メールアドレスを入力して了解を選択します。ここで入力したメールアドレスは緊急の通知、鍵を紛失したときの復旧、証明書の有効期限が近付いた場合の通知に使用される様です。

6-3. 利用規約への同意

次は、利用規約への同意です。Agreeを選びます。

すると以下のメッセージが出てくると思います。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.jp/fullchain.pem. Your cert will
   expire on 20xx-xx-xx. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Congratulations!の言葉通り、これで証明書が発行されました。
/etc/letsencrypt/live/指定したドメイン/ 以下に各証明書のシンボリックリンクが張られていると思いますので、conf(VirtualHost)などの設定はこちらを使います。※このへんはググります

設定が終わったら、忘れずにapacheの再スタートをします。

$ sudo service httpd start

ここまで済んだら、無事アドレスバーに緑の鍵マークが表示されると思います。

7. 今後すること

Let’s Encryptで発行した証明書の期限は90日なのでどこかのタイミングで更新をしないといけません。こちらは再度6. certbotの実行を手動で行うか、shellを書いてcronで定期的に実行するしか今のところありません。※後者の方法はググ(ry  

まとめ

  • mod_sslを入れる時にエラーで怒られたら、httpdのバージョンに注意する
    • エラーが出ても怯まずにエラーメッセージをよく読む
  • 上記に出くわさなければ、Let’s Encryptで簡単に証明書が発行出来る

参考にさせて頂きました

2016/06/29 追記

というわけで、ブログもはてなからhttps://blog.shimabox.netに舞い戻りました。よろしくお願いします。

作成者: shimabox

Web系のプログラマをやっています。 なるべく楽しく生きていきたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください