さくらのVPS
さくらVPS
HTTPS
letsencrypt

Let's Encryptを用いてさくらVPSをHTTPS対応させる

More than 1 year has passed since last update.

背景

自前で借りてるさくらVPSでサイトを公開しているが、HTTP2の流れもあってSSL/TLS対応したくなってきました。
Let's Encryptで無料で証明書を発行できるとのことなので試してみました。

Let's Encrypt公式サイト

今回https化したサイトはこちら
https://foresta.me

環境

さくらVPS

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

手順

前提として、作業はさくらVPSにSSHで接続して行います。
https化するサイトドメインは「example.com」として説明します。

ざっくりとした手順は、以下のとおりです。

  1. 証明書の発行
  2. VirtualHostの設定

証明書の発行

# 1
$ sudo yum update

# 2. 任意のディレクトリへ移動
$ cd 任意のディレクトリ

# 3. let's Encript本体のリポジトリをcloneしてくる
$ git clone https://github.com/letsencrypt/letsencrypt

# 4. cloneしたディレクトリへ移動
$ cd letsencrypt

# 5. ここで足りないものなどがインストールされる
$ ./letsencrypt --help

# 6. 証明書の発行
$ ./letsencrypt certonly -a standalone -d example.com

6の途中でメールアドレスの入力、規約の同意を求められるので答えていきます。
6まで行うと証明書の発行は完了です。

自分の環境だと、6の実行でエラーが出ました。
以下はその対処法です。

pythonのバージョンが古い問題

let's encryptで使用しているpythonが2.7以降じゃなければいけないのですが、CentOS6系のデフォルトのPythonは2.6のためバージョンを上げなければいけません。

python2.7のインストールですが、単純にyum installでupdateできないっぽいです。
そのため以下のサイトを参考にpython2.7をインストールしました
CentOS6 で Let's Encrypt #letsencrypt

$ sudo yum install centos-release-SCL
$ sudo yum install python27 phthon27-python-tools
$ sudo yum install dialog

# python27を有効化
$ sudo scl enable python27 bash

80, 443ポートが空いていない問題

Let's Encryptでこの二つのポートを使用するため両方が使用可能な状態である必要があります。

httpdが起動している場合は停止します。

$ sudo service httpd stop

ファイアウォールでポートをふさいでいる場合は、空けます。
iptablesの書き方は別途調べてください。
以下は自分の環境で必要だった記述となります。

$ sudo vim /etc/sysconfig/iptables

# 以下のような記述をする
--- 省略 ---

-A RH-Firewall-1-INPUT -m state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state NEW -m tcp -p tcp --dport 443 -j ACCEPT

--- 省略 ----

# iptablesの反映
$ sudo service iptables restart

(iptablesの反映を忘れてて30分くらいハマったのはここだけの話。)


以上二つの対応をして再度以下のコマンドを入力して成功することを確認。

$ ./letsencrypt certonly -a standalone -d example.com

無事証明書が発行されると以下の場所にいろいろ作られます。

$ ls /etc/letsencrypt
accounts/  archive/  csr/  keys/  live/  renewal/

$ sudo ls /etc/letsencrypt/live/example.com
cert.pem  chain.pem  fullchain.pem  privkey.pem

.pemファイルの場所はVirtualHostの設定の際に使用するので確認しておく。

VirtualHostの設定

今回はvhost.confにSSLの設定も記述しました

$ sudo vim /etc/httpd/conf.d/vhost.conf

--- 省略 ---

NameVirtualHost *:80
NameVirtualHost *:443  # ここを追加

<VirtualHost *:443>
  ServerAdmin email@example.com # 自分の場合、証明書発行時に入力したemailを記載した
  DocumentRoot /path/to/your/site # 適宜読み替えてください
  ServerName example.com # 適宜読み替えてください
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

--- 省略 ---

記入後httpdを再起動します。

$ sudo service httpd restart

ブラウザで確認
スクリーンショット 2016-05-19 2.20.22.png

まとめ

思ってたより簡単にHTTPSを導入できました。
途中pythonのバージョンなどに詰まったりしましたがそれでも、1,2時間でサクッと出来たんじゃないかと思います。
Let's Encryptは証明書の有効期限が切れるのが早めなので更新の運用をどうしていくのかはこれから考えていきたいと思います。

参考にさせていただいたサイト様

Let's Encryptの使い方
お薦め無料SSL証明書 - Let’s Encrypt
telnetとnetstatでポート番号の状態を確認する
Let’s EncryptのSSL証明書を使ってお手軽 HTTP/2対応
Github letsencrypt-auto doesn't work with Python 2.6 #1046
ネームベースのバーチャルホストでSSL通信できたっぽい