certbot(letsencrypt)でSSL対応しました。https://t.co/0AWfPeSSTi
— しまぶ (@shimabox) June 20, 2016
というわけで、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様のこれとか
- Google ウェブマスター向け公式ブログ: HTTPS ページが優先的にインデックスに登録されるようになります
- Tech TIPS:Chromeブラウザで現在地情報を正しく取得できない場合の原因と対策 – @IT
- これ、対応に迫られた方は結構多いんじゃないでしょうか
Apple様のこれ
- Webに接続するiOSアプリは2017年1月からHTTPSの使用が絶対条件になる、デベロッパーはご注意を | TechCrunch Japan
- 2017年1月以降もHTTPS非対応サイトへのiPhoneからのアクセスは激減しない
※こんな感じで、こっちは何かまだ進展ありそうですが
とかあって時代が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に舞い戻りました。よろしくお願いします。