背景
自前で借りてるさくらVPSでサイトを公開しているが、HTTP2の流れもあってSSL/TLS対応したくなってきました。
Let's Encryptで無料で証明書を発行できるとのことなので試してみました。
今回https化したサイトはこちら
https://foresta.me
環境
さくらVPS
$ cat /etc/redhat-release
CentOS release 6.7 (Final)
手順
前提として、作業はさくらVPSにSSHで接続して行います。
https化するサイトドメインは「example.com」として説明します。
ざっくりとした手順は、以下のとおりです。
- 証明書の発行
- 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
まとめ
思ってたより簡単にHTTPSを導入できました。
途中pythonのバージョンなどに詰まったりしましたがそれでも、1,2時間でサクッと出来たんじゃないかと思います。
Let's Encryptは証明書の有効期限が切れるのが早めなので更新の運用をどうしていくのかはこれから考えていきたいと思います。
参考にさせていただいたサイト様
[Let's Encryptの使い方]
(https://letsencrypt.jp/usage/)
お薦め無料SSL証明書 - Let’s Encrypt
[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)