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