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
という設定ファイルで設定しています。
ローカルでは Node
の forever
を使用してデーモン化を行っています。
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を取る設定について書きます。
作業ログを後から加筆修正しているのでミスがあるかもしれません。気づいた方は指摘お願いします。