ルモーリン

MojoliciousでLet's Encryptのサーバー証明書を取得

投稿:2019-06-13

ただいまVPSの引っ越し作業中です。 引っ越し先は、VPS運営会社のサブドメインなので引っ越し元(www.lemorin.jp)の証明書を使えません。 でもWebサーバーの動作チェックをしたいので臨時の証明書が欲しい。

Let's Encryptはツールcertbotを使ってサーバー証明書を取得します。 初めに、スーパーユーザーからcertbotを実行するとシステムのWebサーバーに介入、サーバー外からそれと分かる痕跡を残せるようにします。 次に、certbotからLet's Encryptのサーバーにアクセスしてドメイン名/メールアドレスを申請、痕跡のテキストを取得します。 続いて、Webサーバーに痕跡のテキストを残し、Let's Encryptのサーバーからアクセスさせ、ドメイン名/介入できていることを確認させます。 最後に、サーバー証明書を取得してファイルに保存します。

ウチのサイトはMojoliciousを一般ユーザーで運用しています。 certbotはスーパーユーザーが実行する前提なので相性が悪い。 それをよく表しているのがディレクトリ/etc/letsencryptを作ろうとして(一般ユーザーなので)ハネられてしまうトコ。 スーパーユーザーからcertbotを実行するけれどWebサーバーへの介入をさせずに、Let's Encryptへアクセスしてもらい、 私がWebサーバーへ介入します。

スーパーユーザーでcertbotを実行します。 証明書取得だけのコマンド、手動オプションを指定してあります。

certbot certonly --manual

実行中にドメイン名、メールアドレスを入力すると、ドメイン名に続くディレクトリ(?)と痕跡のテキストが指定され、 Webサーバーでの準備ができたらキーを押すようにプロンプトが待ちます。 この状態のまま、Mojoliciousに介入します。

ディレクトリ→/.well-known/acme-challenge/tRYsXFvgspECTvf_imL4c9fNIT4MgKcS0lpOBcwmOF0
テキスト→tRYsXFvgspECTvf_imL4c9fNIT4MgKcS0lpOBcwmOF0.ec8AxGgAmNw6eAm4U1WMbg4hoWtNPNyRkOVMiyc5-0I

certbotのプロンプト待ちのまま、Mojoliciousに介入したいので、certbotのほうはそのままにします。 Tera Termをもう1個起動、Mojoliciousの運用アカウントにログインします。 myapp.confの中にディレクトリ名と痕跡のテキストを追加します。

certbot => 1,
certbot_directory => "tRYsXFvgspECTvf_imL4c9fNIT4MgKcS0lpOBcwmOF0",
certbot_text => "tRYsXFvgspECTvf_imL4c9fNIT4MgKcS0lpOBcwmOF0.ec8AxGgAmNw6eAm4U1WMbg4hoWtNPNyRkOVMiyc5-0I",

Mojoliciousにディレクトリを指定されたら痕跡を返すルーターを定義します。 場所はlib/Myapp.pmのstartupです。

# SSL証明取得
$r->get("/.well-known/acme-challenge/$config->{certbot_directory}")->to(cb => sub {
	my $c = shift;
	$c->render(text => $config->{certbot_text});
}) if $config->{certbot};

修正後、Mojoliciousを再起動、ブラウザでアクセス、痕跡のテキストが表示されるのを確認します。 上手いこと痕跡を残せたらcertbotのプロンプトに答えて、Let's Encryptからアクセスさせて証明書を発行してもらいます。 certbotが証明書を保存、無事に終了したら痕跡を消して良いのでルーターを復元しますが、せっかく入れたコードを残したいので設定で無効化します。 設定(myapp.conf)を保存したらMojoliciousを再起動して痕跡がないのを確認して完了です。

certbot => 0,

ここにありました。 certbotは継続して運用するのが目的なので、シンボリックリンクになっていてREADMEにも「コピーするな、リンクしろよ」と書いてあります。 ウチの利用は引っ越しの事前チェック用だし、Webサーバーを運用している一般ユーザーだけからアクセスしたいのでコピーしました(おい)。

ディレクトリ→/etc/letsencrypt/live/ドメイン名
(ファイルの一覧と言ってもREADME以外はリンク)
README
cert.pem
chain.pem
fullchain.pem
privkey.pem