Let's Encrypt
Webサーバの後ろにある他のサーバでLet's Encryptの証明書を取得する方法を考える。
環境
下記のような環境でLet's Encryptで証明書を取得する方法を考えてみる。
[作業マシン(プライベートネット内のマシン)]-------[Web Server(DMZ)]----[Router]-----[インターネット]
Let's Encryptはホストの認証にWebサーバ内の.well-knownディレクトリにホスト確認用のチャレンジングトークンを配置 し、証明書を作成しようとするホストが確かに申請者の管理下のものであることを判定する。 そのため、基本的には、certbotコマンドはWebサーバ上で実行する必要がある。 ただし、Webサーバが本番環境であったり、あるいは古い環境でcertbotが正しく動作しない場合、 他のマシンでLet's Encryptの証明書をなんとか取得できないか考えてみた。
まず、Let's Encryptのサーバからトークンを確認できる必要がある。それは、.well-knownディレクトリ に配置されることを前提に動作する。
簡単に証明書の作成を行いたいので、Dockerコンテナを利用することにしたが、sshfsボリュームプラグイン を利用して、DockerコンテナにWebサーバの/var/www/html/.well-knownディレクトリをボリュームとして アタッチすることにした。sshfsは、sshを利用してリモートのマシンを直接マウントできるので、NFSなどを 利用する必要がないメリットがある。
/var/www/html/.well-known <----(sshfs)---- /var/www/html/.well-known (Dockerコンテナ) [作業マシン(プライベートネット内のマシン)]-------[Web Server(DMZ)] 123.30.2.12
では、やってみよう。
1. 作業マシン上にDockerを入れる
ここは、適当にDocker環境を用意してください。
2. Docker sshfsプラグインをインストール
下記のコマンドで、sshfsプラグインをインストールします。
# docker plugin install vieux/sshfs
3. Webサーバ上の/var/www/.well-knownディレクトリからボリュームを作成
Webサーバ上で/var/www/.well-knownディレクトリを作成する。 そして、作業マシン上で、下記のようなコマンドで.well-knownディレクトリ からDockerボリュームを作成する。
# docker volume create -d vieux/sshfs -o sshcmd=myaccount@123.30.2.12:/var/www/.well-known -o password=mypasswd letsencrypt-well-known
4. 証明書の作成
作業マシン上で、Let's Encrypt SSLの証明書取得コンテナを実行し、証明書を取得する。
# docker run -it --name ssltest --rm -v /etc/letsencrypt:/etc/letsencrypt -v "letsencrypt-well-known:/var/www/html/.well-known" quay.io/letsencrypt/letsencrypt:latest \ certonly --preferred-challenges http-01 -d ssltmp1.ultimania.org -d ssltmp2.ultimania.org -d ssltmp3.ultimania.org
実行がうまくいけば、Conguratulation!のメッセージと共に 作業マシン上の/etc/letsencrypt/live/xxxx(ホスト名)に証明書と秘密鍵が作成される。