webサーバーのhttps化が完了したので、備忘録としてまとめます。
参考にさせていただいたページ
上記を参考させていただきました。
Let's Encryptとは
誰でも無料で使えるSSL/TLS証明書発行サービスです。
証明書の発行 / 更新をコマンドライン上から行うことができます。
注意事項としては、証明書の期限が取得してから90日間と、短期間になっていますので、期限が切れる前に更新を行う必要があります。
ただし、コマンドライン上から更新を行うことが可能ですので、cronを設定しておけば良いわけです。
作業環境
OS: CentOS 6.7
サーバー: さくらVPS
STEP1: ポートを解放する
SSL証明書取得のためには80番と443番のポートを解放しておく必要があります。
- もしWebサーバー等が立ち上がっていて、ポートを占有している状況であれば、一旦停止します。
iptables
を確認し、ポートが解放されているか確認します。vi /etc/sysconfig/iptables
にて、iptablesの設定を確認し、80番と443番に関する記述がなければ、以下の通り、記述を追記します。
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
- 設定を読み込ませるため、
iptables
を再起動します。sudo /etc/init.d/iptables restart
STEP2: Let's Encryptクライアントのダウンロード、証明書の取得
- クライアントをダウンロードし、インストールします。
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/
sudo ./letsencrypt-auto --help
- 証明書取得のため、以下のコマンドを実行します
./letsencrypt-auto certonly -a standalone -d xxx.com(取得したい証明書のドメイン名)
青い画面が立ち上がるので、メールアドレスを記述し、利用規約を確認し、'AGREE'を選択
正常に取得が完了すれば、以下の通り表示される
Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/xxx.com/fullchain.pem. Your cert will
expire on 20xx-xx-xx. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
以下のディレクトリに証明書の実体が作成されます。
/etc/letsencrypt/archive/ドメイン名/
以下のディレクトリに証明書のシンボリックリンクが作成されます。
/etc/letsencrypt/live/ドメイン名/
証明書の更新を行う際に、実体の方のファイル名が変更される可能性があるので、サーバーに読み込ませる場合は、シンボリックリンクのパスを指定します。
更新を行った際に、自動的に最新のファイルにリンク先が更新されるようです。
作成されるファイルの内容は以下の通りです。
- cert.pem: サーバ証明書
- chain.pem: 中間証明書
- fullchain.pem: サーバ証明書と中間証明書が結合されたファイル
- privkey.pem: 秘密鍵
STEP3: 確かめる
ここでは、node.jsでサーバーを立てて確かめてみます。
以下のファイルを作成します。
var https = require('https');
var fs = require('fs');
var ssl_server_key = '/etc/letsencrypt/live/xxx.com/privkey.pem';
var ssl_server_crt = '/etc/letsencrypt/live/xxx.com/cert.pem';
var port = 443;
var options = {
key: fs.readFileSync(ssl_server_key),
cert: fs.readFileSync(ssl_server_crt)
};
https.createServer(options, function (req,res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end("Hello, world\n");
}).listen(port);
nodeサーバーを立ち上げます。
sudo node test.js
httpsで対象のドメインにアクセスし、問題なく接続でき、ブラウザから警告がでなければ成功です。
念のためブラウザから証明書を確認してみます。成功すれば以下の通り表示されると思います。
STEP4: 証明書を定期的に更新するようにする
- 90日間で有効期限が切れてしまうので、cronで毎月1日に自動更新するようにセットします。
crontab -e
* 以下の記述を追加し、保存します。
00 00 01 * * cd /クライアントのパス/letsencrypt;./letsencrypt-auto certonly -a standalone -d xxx.com --renew-by-default
これで、証明書の期限切れが防げます。
何かおかしな箇所がありましたら、コメントにてご指摘いただければ幸いです...