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

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

[Let's Encrypt公式サイト](https://letsencrypt.org/)

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

# 環境
さくらVPS

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

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

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

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

## 証明書の発行

```bash
# 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まで行うと証明書の発行は完了です。

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

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

python2.7のインストールですが、単純に```yum install```でupdateできないっぽいです。
そのため以下のサイトを参考にpython2.7をインストールしました
[CentOS6 で Let's Encrypt #letsencrypt](https://bayashi.net/diary/2015/1124)

```bash
$ 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が起動している場合は停止します。

```bash
$ sudo service httpd stop
````

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

```bash
$ 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分くらいハマったのはここだけの話。）

---

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

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

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

```bash
$ 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の設定も記述しました

```bash
$ 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を再起動します。

```bash
$ sudo service httpd restart
```

ブラウザで確認
<img width="1049" alt="スクリーンショット 2016-05-19 2.20.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/26081/a0768fba-e084-f4c0-39a1-988402a6c5a3.png">


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

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

[Let's Encryptの使い方]
(https://letsencrypt.jp/usage/)
[お薦め無料SSL証明書 - Let’s Encrypt](http://sankame.github.io/ssl-tls/letsencrypt_setup/)
[telnetとnetstatでポート番号の状態を確認する]
(http://togattti.hateblo.jp/entry/2014/01/19/124912)
[Let’s EncryptのSSL証明書を使ってお手軽 HTTP/2対応]
(http://qiita.com/srockstyle/items/b645e096d73f302b7177)
[Github letsencrypt-auto doesn't work with Python 2.6 #1046]
(https://github.com/certbot/certbot/issues/1046)
[ネームベースのバーチャルホストでSSL通信できたっぽい]
(http://d.hatena.ne.jp/eth0jp/20090920/1253394739)