概要
みなさんこんにちはcandleです。2014年の後期にmozillaあたりが主導して、無料のssl証明書作ろうという動きがありました。ついに去年の12月にβ版がでたので、早速試してみました。
ちなみに、メージャーアップがあるらしく、今鍵を作ると、今年の3月末までしか使え無いっぽいですね。
いろいろ試行錯誤してわかったのですが、let’s encryptのssl証明書の取得の仕組みは以下のようになっています。
最初に、あなたの公開しているサーバにドメインを紐付けておきます。説明ではhttp://hoge.comというのを例に使用します。
vagrantのubuntuにlet’s encryptのソフトウェアをインストールします。
let’s encryptサーバに向けて、ドメイン名を送信します。let’s encryptサーバは与えられたドメイン名を見て、トークンをvagrantのubuntuに返してきます。この時、ドメインが実際に公開サーバに紐付けらている必要はないっぽいです。逆に言うと、この時lets encryptサーバはドメインにアクセスしていない。
返ってきたトークンをあなたが公開しているサーバにセットしてどこからでもアクセスできるようにしておきます。一般にトークンは長いので、無作為なアクセスではそのトークンを取得できないようになっています。
サーバーにトークンをセットしたことをlet’s encryptサーバに送ります。encrypt サーバはあなたが公開しているサーバーにトークンがあるか確認しに行きます。もしも、トークンがあれば、let’s encryptサーバーはipアドレスとドメイン名をもとに、ssl証明書を作成し、vagrantに送信してきます。
あとは、このssl証明書をサーバーに設定すればおkです。
ところで、なんでsslの取得を公開サーバーでやらないのかという意見もあると思います。
1つはlet’s encryptが一番ベストに動くのはubuntuだからです。centosやec2のような公開サーバーを使っているともしかするとうまく動かないかもしれないからです。
もう1つはlet’s encryptは自動で、必要なパッケージをインストールします。サーバーになるべく不要なものはのせたく無いのは誰でも同じだと思います。
ここまで解説でした。
実際にやっていきましょう。
前提
公開しているサーバがある。このブログではnginxで動いているサーバーで説明します。わかっている人はapacheで応用してできると思います。
vagrantがインストールされている。
vagrantを立ち上げる
ubuntuは14.10を使います。おそらく13とかでも動くと思います。
vagrantのboxが無い方は以下のコマンドでboxを足します。
vagrant box add ubuntu14.10 https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/14.10/ubuntu-14.10-amd64.box
次にvagrantのディレクトリを作成します。私はホームディレクトリにvagrantというフォルダを作りその中にlets_encryptというフォルダを作ります。
mkdir vagrant cd vagrant mkdir lets_encrypt cd lets_encrypt
以下のコマンドでvagrantを初期化します。
vagrant init ubuntu14.10
Vagrantfileが生成されるので、開いて、ipアドレスのところをコメントインします。
config.vm.network "private_network", ip: "192.168.33.10"
保存したら、vagrantを立ち上げます。
vagrant up
vagrant sshでログインします。
vagrant ssh
sshしたら、まずはapt-getをアップデートします。
sudo apt-get update
let’s encryptを試す
let’s encryptのソフトウェアをダウンロードするにはgitが良いので、gitをインストールします。
sudo apt-get install git
let’s encryptのソフトウェアをダウンロードします。
git clone https://github.com/letsencrypt/letsencrypt
letsencryptフォルダに移動します。
cd letsencrypt
一般に以下のコマンドで手続きが始まります。
./letsencrypt-auto certonly -a manual --server https://acme-v01.api.letsencrypt.org/directory
これで起動すると自動的にあれこれやってくれます。しばらくたつと下のような画面に成ると思います
メールアドレスを入力しましょう。これはkeyを無くした時に使います。
規約を了解するかでてくるので「agree」を選んで、エンターを押します。
ドメイン名の入力がでてくるので、公開しているサーバのドメイン名を入力します。例えば、http://hoge.comなら「hoge.com」と入力します。
IPアドレスをを保存してよいか聞いてくるので「Yes」を選びます。
唐突にGUIが終わります。そして幾つかのコマンドが表示されます。ここが重要です。カーソルがまだ待機モードになっていることを確認してくさい。おそらく「Press ENTER to contine」でカーソルが止まっていると思います。これはサーバに必要な設定を行ってからエンターを押すので、絶対にエンター押さ無いください。
Make sure your web server displays the following content at http://hoge.com/.well-known/acme-challenge/fewaoijfeowiangeawg-jgioewaj90igaeigjaewqo before continuing: feafoiweahjefioawejfgowaeibgeagaewougieajfoaiwgerjgaiowergha If you don't have HTTP server configured, you can run the following command on the target server (as root): mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge cd /tmp/letsencrypt/public_html printf "%s" ffeafoiweahjefioawejfgowaeibgeagaewougieajfoaiwgerjgaiowergha > .well-known/acme-challenge/fewaoijfeowiangeawg-jgioewaj90igaeigjaewqo # run only once per server: $(command -v python2 || command -v python2.7 || command -v python2.6) -c \ "import BaseHTTPServer, SimpleHTTPServer; \ s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \ s.serve_forever()" Press ENTER to continue
上のメッセージはそれです。多少適当に変更しています。
設定などはmkdir、cd、printfの下りを真似すればいけます。上のメッセージではサーバーはpythonを使えばいいよと成っていますが、私の場合はすでに止められないnginxが動いているので、そっちで行います。
公開サーバーの設定
それでは公開サーバの設定をやっていきましょう。
私はec2のnginxでやります。nginxのnginx confを記述します。
cd /etc/nginx/conf.d/ sudo touch letsencrypt.conf
letsencrypt.confを開いて以下を記述します。
server { listen 80; server_name hoge.com; location / { root /usr/share/nginx/letsencrypt; index index.html index.htm; } }
公開ディレクトリに移動します。
cd /usr/share/nginx sudo mkdir letsencrypt sudo chown ec2-user:nginx -R letsencrypt cd letsencrypt
このletsencryptフォルダで先ほど、vagrantで表示された項目を実行します。
mkdir -p .well-known/acme-challenge printf "%s" ffeafoiweahjefioawejfgowaeibgeagaewougieajfoaiwgerjgaiowergha > .well-known/acme-challenge/fewaoijfeowiangeawg-jgioewaj90igaeigjaewqo
サーバーを再起動します。
sudo service nginx restart
正しく設定できたかどうか確認するには、vagrantのubuntuに表示された。urlを叩けばわかります。
例えば、hogeなら以下のようになっています。
http://hoge.com/.well-known/acme-challenge/fewaoijfeowiangeawg-jgioewaj90igaeigjaewqo
これにアクセスして、作成したファイルがダウンロードできるかどうか確認します。できればうまくいっています。
サーバの設定は以上です。
vagrantのubuntuの設定の続き
varantのubuntuは「Press ENTER to continue」で待機しています。
公開サーバの設定ができたので、エンターを押しましょう。
特に問題なく以下のメッセージが出れば成功です。
IMPORTANT NOTES:
– If you lose your account credentials, you can recover through
e-mails sent to alice@hoge.com
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/hoge.com/fullchain.pem. Your cert
will expire on 2016-04-10. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
鍵は/etc/letsencrypt/live/hoge.comに入っています。
sudo su cd /etc/letsencrypt/live/hoge.com/
で確認できると思います。
cert.pem chain.pem fullchain.pem privkey.pem
のファイルがあります。
ls -laするとシンボリックリンクになっているので、実態はこっちのパスにあるようです。
/etc/letsencrypt/archive/hoge.com
うまく取得できましたね。
まとめ
ここから実際にnginxにsslを設置してhttps通信を行うのですが、それは様々なブログが取り上げているので、私は特に解説しなくてもいいかなと思っています。1つだけあげるとしたら、letsencryptで取得した鍵はprivateとcertだけでは信頼に問題があり、ブラウザで赤いマークがでました。chainファイルも設定したら、うまくいきました。