2022/02/09

MyDNS.jp を使用した TLS 証明書の取得

今回も証明書ストア(CertStore.nsf)と CertMgr(タスク)の話題です。


CertMgr がベータ版で登場した頃に私が利用していた MyDNS.jp という DDNS(ダイナミック DNS)がウリの DNS プロバイダは、Certbot 用に PHP のもとで動くスクリプトを提供しているものの REST API 仕様の公開は無く、Domino の CertMgr では使いづらいと感じていました。まあ DDNS を本番環境には採用しないだろうと想像するとこのエントリは趣味寄りあるいは検証向けではあるように思います。


先日、このスクリプトを Python で書き換えて利用している方のブログ記事を拝見して「これはいけるかも」と思い立ちチャレンジしてみたところ、証明書の取得に成功しました。

とは言えまだまだ MyDNS.jp と CertMgr の仕組みや設定について私の理解が足りない部分があるような気がしていて、もしかするともっと良い設定方法があるかもしれませんが、現時点での成功例としてここに残しておきたいと思います。


今回は dominocertmgr.site というドメインにある certmgrtest というホスト名の TLS証明書を取得する、というシナリオです。FQDNは certmgrtest.dominocertmgr.site です。

以下、設定内容です。


まずは、MyDNS.jp です。

まずは、MyDNS.jp へアクセスして JOIN US から新規登録します。登録が完了するとメールで Master ID と Password が通知されます。この Master ID を使って LOG IN します。

ログインできたら USER INFO の画面に切り替え、パスワード欄の下にある「追加する子IDの数」の数字を 0 から 1 に書き換えて[確認]ボタンを押します。

追加が完了するとメールで Child ID と Password が通知されます。

DOMAIN INFO の画面に切り替え、「Domain」欄へ dominocertmgr.site をタイプします。「Hostname, Type, Content, Target ID」欄へ下表の様に入力(または選択)します。Target ID は、Type が CNAME のほうに Master ID を、Type が DELEGATE のほうに Child ID をそれぞれ選択します。

Hostname Type Content Target ID
_acme-challenge CNAME certmgrtest.dominocertmgr.site mydns12345
certmgrtest DELEGATE
mydns54321

※ここでは TLS 証明書取得に無関係のレコードタイプを省略しています

MyDNS.jp の API では、ドメイン名の頭に "_acme-challenge." を付加した TXT レコードの追加は可能ですが、FQDN の頭に "_acme-challenge." を付加したものを追加しようとすると 307 エラーが返ってくることから、CNAME で別名として参照させることで回避しました。

そして certmgrtest というホスト名(サブドメイン)を Child ID へ移譲(DELEGATE)する設定(にしたつもり)です。そんな訳で TXT レコードは Child ID のほうへ追加される想定です。

MyDNS.jp の設定は以上です。


続いて「証明書ストア」アプリケーション(CertStore.nsf)です。

証明書ストアを開き、左側のナビゲーションメニューから「DNS 設定」をクリックしてビューが表示されている状態で、Notes ウィンドウ上部の「アクション - DXL のインポート」をクリックし、こちらからダウンロードした DXL ファイルをインポートします。

すると MyDNS.jp の DNS プロバイダ設定文書が作成されます。


下図は、インポートして作成された「DNSプロバイダ設定」文書の「操作」タブの内容です。

脱線して少し説明します。
「操作」タブの「投稿データ式:」に次のような式があります。3つのパラメータをアンパサンド「&」で区切っています。
"EDIT_CMD=REGIST&CERTBOT_DOMAIN=" + param_RegisteredDomain + "&CERTBOT_VALIDATION=" + param_DnsTxtValue

EDIT_CMD には、TXTレコードの追加なら "REGIST"、削除なら "DELETE" を指定します。
CERTBOT_VALIDATION には、TXTレコードへセットする文字列が生成されている param_DnsTxtValue の値がセットされるようにします。
CERTBOT_DOMAIN の値は、当初 FQDN を設定すると 307 が返り Redirect のエラーになりました。この値が MyDNS.jp の「Domain」欄に指定する名前 "dominocertmgr.site" と異なるとエラーになり、名前と同じだと "_acme-challenge" というホスト名のTXTレコードが追加されたのです。しかしながら TXT レコードは「"_acme-challenge." + ホスト名 + ドメイン名」でないと認証に失敗します。そこで DNS へ Type に CNAME と DELEGATE の2つのレコードを設定して「ホスト名+ドメイン名」を Child ID へ移譲することで回避することにしました。MyDNS.jp では Type に NS を選択できないのでこの Type の組み合わせとしています。

話を戻します。

次にナビゲーションメニューの「DNS プロバイダ」をクリックして、画面右側に開いたビューの上部にある「アカウントの追加」ボタンをクリックします。

「DNS プロバイダアカウント」文書が編集モードで開いたら、「基本」タブの「DNS アカウント」のエリアにある「登録済みドメイン」へ FQDN(certmgrtest.dominocertmgr.site)を入力、「DNS プロバイダ設定」に MyDNS.jp を選択します。


そして「基本」タブの「設定値」のどこかに認証情報を設定します。認証情報とは、MyDNS.jp へ TXT レコードを追加/削除できるアカウントの情報です。

Certbot 用に PHP のもとで動くスクリプトでは、MyDNS.jp へ要求を POST するときにヘッダーへ追加する "Authorization: Basic " に、IDとパスワードをコロン「:」で区切った文字列をbase64エンコードしたものを続けて指定していました。仮に ID が "MyUserID" でパスワードが "Password" の場合、base64エンコードした文字列は "TXlVc2VySUQ6UGFzc3dvcmQ=" となり、ヘッダーには最終的に次のようになるよう式を組み立てます。

Authorization: Basic TXlVc2VySUQ6UGFzc3dvcmQ=

今回は「certmgrtest.dominocertmgr.site」の TXT レコードを MyDNS.jp の Child ID で管理するほうへ追加することを想定しているので、Child ID とそのパスワードをコロン「:」でつなげた文字列を base64 エンコードしたものになります。

文字列の base64 エンコードは残念ながらヘッダー式の中で実行できないため、Windows のコマンドプロンプトから certutil -encode コマンドを利用したり、nsftools で公開されている LotusScript のコードなどを利用してあらかじめ生成しておきます。

base64エンコードして生成した文字列を、今回は「基本」タブの「設定値」にある「カスタム値」フィールドへ設定しました。「カスタム値」の値は、先にインポートした「DNS プロバイダ設定」文書の「ヘッダー式」の中で cfg_CustomValue というフィールド名で参照しています。

「DNS プロバイダアカウント」文書では、上の画像にあるフィールドの他はこの「カスタム値」フィールドだけ設定して保存します。


最後はナビゲーションメニューの「TLS 証明書 - ホスト名別」をクリックして、表示されたビュー上部にある「TLS 証明書の追加」ボタンをクリックします。

「TLS 証明書」文書では、「ホスト名」と「共通名(CN)」に FQDN を、「アクセスできるサーバー」に TLS 証明書を使う Domino サーバー名を(、その他の項目は私があらかじめ設定しておいたグローバル設定のまま)入力したら「要求の送信」ボタンをクリックします。


(CertMgr タスクが起動していれば)しばらく待つと TLS 証明書文書が更新されてステータスが「発行」になりました。こうなれば成功です。

成功した TLS 証明書を開き、フォーム上部にあるボタン「証明書の調査」をクリックすると、証明書の発行者と有効期限などを確認できます(下図)。



DXLからインポートして作成した「DNS プロバイダ設定」文書の詳細にはあまり触れませんでしたが、もしご興味があれば DXL ファイルをインポートして作成される文書を確認してみてください。

ネットで検索してみると PHP のもとで動くスクリプトではワイルドカードの証明書も取得できるようでした。もう少し試してみようと思います。

0 件のコメント:

コメントを投稿