ScientificLinux6+Nginx+Ghost+SSL+LetsEncrypt

このブログで使用しているドメイン blog.ikenie3.org をhttps対応しました。

今までhttpで済ませていたのは「Secureじゃなくても別にいいかな」という適当な考えだったのですが、httpsの環境を作る必要が出たので対応方法の勉強のために対応しました。

このブログ環境の構成

  • サーバ: さくらVPS
  • OS: Scientific Linux 6
  • Webサーバ: Nginx
  • ブログエンジン: Ghost

最終目標

blog.ikenie3.org をhttpsに対応して、httpのリクエストはhttpsにリダイレクトする。

やったこと

OSのアップデート

OSはScientific Linux 6といっても6.2と古かったので6.6(final)にマイナーアップデートを行いまいました。

# OSバージョンの確認
cat /etc/redhat-release
rpm -qa sl-release --qf '%{v}\n'

# リポジトリ更新
sudo yum --releasever=6.6 update sl-release

# パッケージの更新(200個くらいあって時間がかかった)
sudo yum update

# 再起動
sudo shutdown -r now

# 古いカーネルの削除
sudo package-cleanup --oldkernels

参考

python2.7のインストール

Scientific Linux6系(CentOS6系)はpythonが標準のままでは2.6系しかインストールできないので、Software Collectionsを使用してpython2.7系をインストール。

# rootで行いました
sudo su -
# gccをインストール
wget http://linuxsoft.cern.ch/cern/scl/slc6-scl.repo -O /etc/yum.repos.d/slc6-scl.repo
yum install devtoolset-3
# devtoolset-3を有効化
scl enable devtoolset-3 bash

# pythonをインストール
yum install python27
# python27を有効化
scl enable python27 bash

# バージョン確認
python2.7 -V
# Python 2.7.5

# path
which python2.7
# /opt/rh/python27/root/usr/bin/python2.7

# virtualenvを構築
mkdir -p ~/.local/share
virtualenv -p /opt/rh/python27/root/usr/bin/python2.7 ~/.local/share/letsencrypt
. ~/.local/share/letsencrypt/bin/activate

# rootログイン時にpython2.7のvirtualenvを使用できる様にbashrcに追記
echo ". ~/.local/share/letsencrypt/bin/activate" >> ~/.bashrc

Nginxの設定を変更

今回Let's Encryptで証明書を発行する関係で、Ghostそのままだと問題が出る場合があるので対策をします。

Ghostは /etc/nginx/conf.d/ghost.conf という設定ファイルで設定しています。

ローカルでは Nodeforever を使用してデーモン化を行っています。

Before
server {
    listen 80;
    server_name blog.ikenie3.org;

    access_log /var/log/nginx/blog.ikenie3.org.access.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }
}
After
server {
    listen 80;
    server_name blog.ikenie3.org;

    access_log /var/log/nginx/blog.ikenie3.org.access.log;

    # Let's Encrypt Support
    location /.well-known {
         root /home/www/www.ikenie3.org;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }
}

location / {...} の前に

    location /.well-known {
         root /home/www/www.ikenie3.org;
    }

を追記しました。

Let's Encryptでは証明書作成時にwebrootディレクトリ配下の /.well-known にhtmlファイルを自動生成して認証に使用するため blog.ikenie3.org/.well-known/*.html というURLにアクセス可能となっている必要がるため設定を追記しました。

あとはnginxの設定を検証してリロードします

# (pythonのインストールに引き続き)rootで行いました
# sudo su -

# 設定を検証
nginx -t
# 検証に問題がなければリロード
/etc/init.d/nginx reload

証明書を作成

証明書を作成します。

# (pythonのインストールに引き続き)rootで行いました
# sudo su -

# コマンドをダウンロード
cd /usr/local/src
git clone https://github.com/certbot/certbot
ln -s /usr/local/src/certbot/certbot-auto /usr/bin/certbot-auto

# コマンド実行確認(yumのインストールなどが走る)
certbot-auto --help

# 対話式で証明書を作成
certbot-auto certonly

証明書の作成が完了すると /etc/letsencrypt/live/blog.ikenie3.org/ にpemファイルが書き出されます。厳密にはシンボリックリンクで、実体は /etc/letsencrypt/archive/ 配下です。

Nginxの設定をhttps対応に書き換える

## blog.ikenie3.org
server {
    listen 443 ssl;
    server_name blog.ikenie3.org;

    ssl on;

    ssl_certificate /etc/letsencrypt/live/blog.ikenie3.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.ikenie3.org/privkey.pem;

    access_log /var/log/nginx/blog.ikenie3.org.s.access.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }
}

server {
    listen 80;
    server_name blog.ikenie3.org;

    # Let's Encrypt Support
    location /.well-known {
        root /home/www/www.ikenie3.org;
    }

    # Redirect to https
    location / {
        rewrite ^/(.*)$ https://blog.uso400.net/$1;
    }
}

これでhttps用の設定が書けたので、またnginxの設定検証とリロードを行う

# 設定を検証
nginx -t
# 検証に問題がなければリロード
/etc/init.d/nginx reload

以上でhttps対応は完了です。次は SSLの設定評価でAを取る設定について書きます。

作業ログを後から加筆修正しているのでミスがあるかもしれません。気づいた方は指摘お願いします。