さくらのレンタルサーバにLet’s EncryptのSSL環境を導入してみた

【2017.10.22追記】
重要:2017/10/17にさくらのレンタルサーバ側で公式にLet’s Encryptのサポートが始まり、ここに書いた内容は古くなった。
現在のさくらインターネット公式サポートを使用したLet’s Encryptの導入方法については、
さくらのレンタルサーバにLet’s EncryptのSSL環境を導入してみた:改訂版 | ちゃたろうふぁんくらぶ
に改訂記事を書いたのでそちらを参考にしてほしい。
【2017.10.22追記ここまで】

以前、うちのサーバでも共有SSLを試したことがある。もう10年ぐらい前の話。共有SSLなので、『https://○○.sakura.ad.jp/アカウント名/XXX』的なアドレスになって、独自ドメインそのものではSSLできなかった。その出口だけ専用に.htaccess書いたり、そもそも共有SSLに脆弱性が見つかって一時的に運用停まったり、とあまり良いものではなかった。
が、今は独自ドメインで簡単にSSLが使える(しかも証明書維持も無料に出来るようになった)、と言うのでので試してみた。

結論から言うと、Let’s Encryptによるサーバ証明書は無料で使えるものの、90日の期限があり、更新作業が結構煩雑(root権限を要求するので『さくらのレンタルサーバ』上で自動的に更新できない)ので、さくらのレンタルサーバで使うにはあくまで一時的な実験向けと感じた。
恒久的にSSL環境を導入したいのなら、
さくらのSSL | SSLサーバー証明書ならさくらインターネット
を使ってラピッドSSLを活用すればいい。ラピッドSSLなら3年払いで3,200円+taxなのでそれほどの負担感はないはずだ。
あるいは、さくらのレンタルサーバではなくさくらのVPSを使えばいい。さくらのVPSならLet’s Encryptの更新もcrontabで自動化できるらしいし、維持費的にもさくらのレンタルサーバさくらのSSLのコストがさくらのVPSの安いプランとほとんど大差ないからだ。

Let’s Encryptの導入手順は公式によくまとまっている。
Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル
手順を読んでいけばわかるが、残念ながらさくらのレンタルサーバ(スタンダード含めて)はroot権限がないので「letsencrypt -auto」コマンドが発行できず、証明書を作成することができない。
そこで、別の環境で証明書を作ってコピーしてくる手順が必要になる。
自分のPCの中に仮想環境を作ってもいいが、今回はさくらのVPSのお試し期間を使い、証明書を作ってみた。

まず、さくらのVPS
VPS(仮想専用サーバ)|さくらインターネット – 無料お試し実施中



からVPSをお試しすればよい。どうせ本契約をするつもりはなく、作業的にも大して負荷のかかる作業をするわけでもないので一番安いプランでよい。
で、申し込みが完了したらOSをインストール。
ここから何故かSSH含めたコンソール接続できるようになるまでやたら待つ必要がある。以前は数分も待たされなかった気がするのだが、今はインストール後すぐにTTSSH接続すると『ホストに接続できません』だの『接続が拒否されました』だののメッセージが出て接続が切断されてしまう。そこで次のさくらのレンタルサーバ側の手続きをしながら気長に待つ(TTSSH接続できるようになるまで、だいたい30分はかかるようだ)。

さくらのレンタルサーバでSSL用ドメインの用意

まず、さくらのVPSの作業を本格的に始める前に、さくらのレンタルサーバ側でSSL用ドメインの登録を行う。
登録したドメインがDNS浸透するまで数時間かかるからだ。
今回は、ssl.chatarou.netと言うサブドメインをSSL向けに割り振ってみた。実験なので、ssl.chatarou.netで表示する内容はwww.chatarou.netと同じ(もちろん別にすることも出来る)。

2016-02-07_01
さくらインターネット コントロールパネルに入り、【ドメイン設定】→【新しいドメインの追加】と進む。

2016-02-07_02
今回はchatarou.netにサブドメインを追加する。

2016-02-07_03
ドメイン名『ssl』を追加。

2016-02-07_04
ドメイン追加の確認画面。

2016-02-07_05
詳細設定へ進む。

2016-02-07_05b
1. 設定をお選びください
「wwwを付与せずマルチドメインとして使用する(上級者向け)」を選ぶ
(まさかwww.ssl.chatarou.netとか言う冗長なドメイン使う人はいないでしょう)
2. マルチドメインの対象のフォルダをご指定ください
フォルダパスを指定する。今回はテストなので「www.chatarou.net」と同じパスを指定しているが、ここに違うパスを入れれば当然別サイトとして運営も可能。
4. SSLの利用を選んでください
共有SSL、SNI SSLを利用しない」を選ぶ。現時点ではSSL証明書が出来上がっていないので利用登録が出来ないので。

2016-02-07_06
ssl.chatarou.net』が追加されたことを確認。
この状態で放置しておけば、大まかに2時間程度でDNS浸透して使えるようになる。

さくらのVPSの環境構築

次にさくらのVPSの方に移って作業を進めていく。以下しばらくはさくらのVPSでの作業。
さくらのVPS サーバの初期設定ガイド|さくらインターネット公式サポートサイト
に従って作業を進めていく。
どうせ一時的に使うだけなので、3.sudoの設定と4.SSHの設定は必ずしもやらなくてもいい。

※3.sudoの設定について
現時点(2016.02.09)では上記のガイドに不備があるのか、書かれている通りにやってもSSHでsudoは使えないようだ。
なんでか%wheelを一般ユーザに追加してもsudo実行できないので、一般ユーザ名を直接visudoで書いた方がよさそう。

iptablesの設定

上記のさくらのVPS公式の初期設定、6.iptablesの設定を参考にしながらやる。
さくらのVPS公式設定に加えて、あらかじめSSH、ftp、http、のポートを開けておく。
こっちはLet’s Encryptを実行させるためのサーバでしかないので、httpsを開けておく必要はない。
以下の通りコマンドを打ち込んで、設定を書き込んでいく。
最後のセーブを忘れると設定が消えるのでちゃんと最後まで書くこと。

<code>
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p icmp -j ACCEPT

# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

# iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 50000:50030 -j ACCEPT

# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT

# service iptables save

# /etc/rc.d/init.d/iptables restart
# iptables -L
</code>

補足:
80番portはhttp
20番portはftp
21番portはftp
50000-53000番portはftpのpasvポート
22番portはSSH

なお、

<code>
# vi /etc/sysconfig/iptables
</code>

を叩いてiptablesを直接編集してもよい。
viのかんたんな使い方は
viエディタの使い方
を参照。

vsftpdの構築

出来上がった証明書を持ってくるのに必要なので構築する。
さくらのVPSを使ってみる【9】-vsftpdをインストールしてみる | 初心者プログラマー奮闘記
を参考にした。

<code>
# sudo yum -y install vsftpd
</code>

まずvsftpdをインストール。

<code>
# vi /etc/vsftpd/vsftpd.conf
#匿名アクセス禁止
anonymous_enable=YES
  ↓
anonymous_enable=NO
#ファイルのパーミッションが644になってしまうので、グループ書き込み可の664にします
local_umask=022
  ↓
local_umask=002
#アスキーモード有効
#ascii_upload_enable=YES
#ascii_download_enable=YES
  ↓
ascii_upload_enable=YES
ascii_download_enable=YES
#シグニチャ隠蔽
#ftpd_banner=Welcome to blah FTP service.
  ↓
ftpd_banner=Welcome to blah FTP service.
#ホームディレクトリのみ参照するユーザー設定
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
  ↓
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#サブフォルダを含む一括アップロード・ダウンロードを許可
#ls_recurse_enable=YES
  ↓
ls_recurse_enable=YES
#-----ファイルの最後に設定を追加-----
#/etc/vsftpd/user_listのユーザーだけを許可
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
#タイムスタンプ時間をローカル時間にする
use_localtime=YES
#ユーザーの初期アクセスディレクトリ
#ここに書いたディレクトリが最初に開く。
#local_rootを書かないとホームディレクトリ
local_root=/var/www/html
#ユーザのホームディレクトリより、上位のディレクトリへの移動を不許可に
chroot_local_user=YES
#設定を簡単にするためにPASVのポート範囲を限定
pasv_min_port=50000
pasv_max_port=50030
</code>

次にftp用のユーザを設定。

<code>
# vi /etc/vsftpd/user_list
</code>

別にftp専用ユーザを作る必要もないので、さくらのVPS初期設定で作った一般ユーザを一行追記。
なお、rootは

<code>
# vi /etc/vsftpd/ftpusers
</code>

でftpアクセスが禁止されている(/etc/vsftpd/user_listに最初から書かれてるユーザの殆どもそう)なので
rootでftpは出来ないものと考えたほうがいい。

<code>
# vi /etc/vsftpd/chroot_list
</code>

さくらのVPS初期設定で作った一般ユーザを一行追記。

最後はvsftpdの自動起動設定を書いて、vsftpdデーモンの再起動。

<code>
# chkconfig vsftpd on
# chkconfig --list vsftpd
# /etc/rc.d/init.d/vsftpd restart
</code>

httpdの構築

WEBサーバーの設定 | 初心者でもわかる!さくらVPS | Sakura VPS 設定マニュアル
を参考にした。

<code>
# yum -y install httpd
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
# vim /etc/httpd/conf/httpd.conf
# service httpd configtest
</code>

httpd.confの書き換えは省略。

最後はhttpdの自動起動設定を書いて、httpdデーモンの再起動。

<code>
# chkconfig httpd on
# chkconfig --list httpd
# /etc/rc.d/init.d/httpd restart
</code>

Let’s Encryptの導入

Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル
Let’s Encryptを他のサーバでやってみる – ねころくぶろぐ
あたりを参考にした。

さくらのVPSLet’s Encryptをインストール

Let’s Encryptの証明書発行コマンドを実行

証明書発行コマンドの途中で指定された認証用ファイルをさくらのレンタルサーバの方に置く(実際にはさくらのレンタルサーバの方でSSHコマンドをコピペで打つ)

Let’s Encryptの証明書発行コマンドが完了して、さくらのVPSに証明書ファイルが出来上がる。

さくらのVPSの証明書ファイルをローカルにダウンロードする。

と言う手順。

<code>
# cd /usr/local/src
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt/
# ./letsencrypt-auto --help
# ./letsencrypt-auto certonly --manual -d ssl.chatarou.net
</code>

最後のコマンドの独自ドメインは自分のサイトのを指定しましょう。

2016-02-08_01
こんな風にTTSSH上でTUI(テキストユーザインタフェース)の画面が走る。メールアドレスを登録して、

2016-02-08_02
OKでどんどん作業を進めていく。

で、TUIがいったん途切れて以下のメッセージが出るので、

<code>
If you don't have HTTP server configured, you can run the following
command on the target server (as root):
</code>

メッセージの下のコードを実行する。と言ってもそこのコードは/tmp/以下にファイルを作っちゃうので、さくらのレンタルサーバ向けにコマンドのパスは若干修正を行う必要がある。

さくらのVPSTTSSH画面は開いたまま放置しつつ、新しくTTSSHを立ち上げてさくらのレンタルサーバにSSHログインして以下の作業を行う。

<code>
% cd /home/chatarou/www/net.chatarou/
% mkdir -p ./.well-known/acme-challenge
% printf "%s" TntiiNWUdGnQfcmJdPdHa8Lyat8I5Ho7QkCppc3DAaY.f5FIj4fCpysa4Kyw8NlUDD1-PUgx_61UWy67sh_7L2s > .well-known/acme-challenge/TntiiNWUdGnQfcmJdPdHa8Lyat8I5Ho
</code>

1行目はssl.chatarou.netの公開ルートパス(さくらインターネット コントロールパネルから指定した場所)
2行目は公開ルートパスの下にSSH認証用のフォルダを作るコマンド
3行目の書き込む『謎の文字列』は毎回違うので、さくらのVPSのTTSSH画面のコマンドをちゃんとコピペする事。

最後にさくらのVPSのTTSSH画面でエンターを押せば認証が完成して証明書が出来る。
のでさくらのVPSのサーバからftpでローカルに落としてくる。
ファイルは/etc/letsencrypt/live/ssl.chatarou.net/にあるのだけど、そのディレクトリにはftpアクセスできないので一旦SSHでtmpにファイルを移動させてから落とす。

<code>
# cd /etc/letsencrypt/live/ssl.chatarou.net/
# cp cert.pem /tmp/
# cp chain.pem /tmp/
# cp fullchain.pem /tmp/
# cp privkey.pem /tmp/
</code>

これで/tmp/にFFFTPなどでアクセスして上記ファイルをダウンロードしてくる。

さくらのレンタルサーバにSSL証明書を登録

再びさくらインターネット コントロールパネルに入り、【ドメイン設定】へ進む。

2016-02-08_04
ssl.chatarou.netの証明書の追加を行う。

2016-02-09_03
まずは秘密鍵のアップロード。さっき落としてきたprivkey.pemを登録し、アップロードする。

2016-02-09_05
次に証明書をインストールする。さくらインターネット コントロールパネルのテキスト欄に、cert.pem(中身はテキストファイル)の中身をまるっとコピペするだけでいい。

<code>
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
</code>

の文字列もちゃんとコピペする事。END PRIVATE KEYの後ろに余計な改行はたぶんない方がいいと思う。

2016-02-09_06
証明書が登録され、内容が表示される。
引き続いて中間証明書のインストールに入る。

2016-02-09_07
今度は、chain.pem(中身はテキストファイル)の中身をまるっとコピペする。
なお、fullchain.pemcert.pemchain.pemの両方が書いてあるだけのファイルで、最初の証明書インストールにこっちを使えば一気に中間証明書までインストールできるはず…なのだがうまくいかなかったのでうちでは使わなかった。

2016-02-09_08
これで証明書、中間証明書の登録が完了。引き続いてドメイン設定へ。

2016-02-09_09
4. SSLの利用を選んでください
「SNI SSLを利用する」が選べるようになっているのでこれを選ぶ。
これで全作業完了。

2016-02-08_07
登録が終わってもこの画面が出るときは、1、2時間程度待ってみる。2時間待ってもこの画面の時は途中の作業を間違っている可能性が高い(特にSSL証明書の登録内容を間違えている可能性が高い)のでやり直す。
僕はDNSの浸透に時間がかかっているのかと思って12時間放置してもダメだったが、もう一度やり直したらやり直した後は3分で繋がるようになった。

2016-02-09_00
SSL接続できるようになった後の画面。
画面がおかしいのは、wordpressの設定上このサイトはwww.chatarou.netで見せるようになっており、cssなどへのパスがwww.chatarou.net経由でソースに書き込まれているため(つまりcssのないページ表示になっている)。
この辺を問題なくやろうと思ったら、サイトをssl.chatarou.netへ完全に移す(wordpressの一般設定から、サイトアドレス (URL)を変更する)か、Let’s Encryptの証明書発行コマンドで

<code># ./letsencrypt-auto certonly --manual -d ssl.chatarou.net -d www.chatarou.net</code>

等のようにwww.chatarou.netも含む形でコマンド発行すればいいかと思う。
どっちみちうちのサイトはflicker badgeでiframe使ってるからエラーメッセージはきそうではあるけど。

Comment

  1. […] とで、別マシンのLinuxとかUbuntu on Windows10とか考えた。 参考: さくらのレンタルサーバにLet’s EncryptのSSL環境を導入してみた さくらレンタルサーバーのサイトを、Let’s EncryptでHTTPS化 […]

コメントを残す