Posted at

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

More than 3 years have 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通信できたっぽい