二つのOpenVPN証明書と一つのCCD名:何が起きたのか
シリアル番号は発行者の中でしか一意ではありませんが、OpenVPNはCCDファイルを名前で選びます。登録時にその実効名を予約し、更新を管理してください。
シリアル番号、鍵、さらには完全なサブジェクトまで異なる二つのクライアント証明書でも、サーバーがそれらのどれも見ていないため、同じポリシーファイルに解決されることがあります。サーバーは証明書から名前を読み取り、対応するクライアント設定ファイルを開きます。両方の証明書が同じ名前を持てば、二つ目は接続した瞬間に一つ目のポリシーを継承します。
衝突は登録時に作られ、接続時に初めて発見されますが、通常はあるデバイスが別のマシンに属するアドレスやルートセットを受け取ったときに現れます。防ぐには、サーバーがどのフィールドをマッピングするかを合意し、何かに署名する前にその値を予約する必要があります。
X.509 内部の一意性と OpenVPN ポリシー名の一意性は別々のシステムが強制する別々の要件なので、証明書ツールは警告しません。
サーバーが見るのは指紋ではなく名前
通常の証明書ベースのマッピングでは、サーバーは提示された証明書からコモンネームを取り出し、クライアント設定ディレクトリでその名前のファイルを探します。そのファイルは固定アドレスの割り当て、ルートのプッシュ、クライアントごとのファイアウォールマークの適用を行えます。検索はファイル名との文字列一致なので、大文字小文字、空白、句読点のすべてが重要です。
一部の導入では、認証済みのユーザー名がコモンネームの代わりになるよう意図的にマッピングを入れ替えるため、その場合はユーザー名が一意でなければなりません。いずれにせよ、ポリシーを選ぶ値こそが予約すべき値です。何かを発行する前にどちらなのかを決めてください;衝突後に推測するのは質問するより高くつきます。
二つの機関が同じ名前で重なる場所
複数の発行機関から証明書を受け入れる組織は、一つの名前空間に書き込む二つの独立した登録プロセスを運用します。各機関の一意性ルールはその内部でのみ適用されるため、どちらも同じコモンネームに対して正当に発行でき、どちらも異常に気づきません。
シリアル番号は助けになりません。X.509 はシリアル番号が発行者の範囲内で一意であることを要求しますが、それはその機関の帳簿上の性質であり、デバイスのグローバルな身元ではありません。サブジェクトの検査もコモンネームの検査とは別のテストで、二つの証明書は CN を共有しながら組織単位で異なり、そのため別々のサブジェクトを持ちます。こうした性質がすべて成り立っていても、サーバーは両方の証明書を一つのファイル名にマッピングしてしまいます。
OpenSSL CA のドキュメントは、自身のデータベースの判断を左右する unique_subject 設定を扱っており、正直な出発点は、特定の EasyRSA や OpenSSL の既定値が適用されると仮定するのではなく、発行設定を読むことです。
署名の前に実効名を予約する
デバイスを承認済みレコードに、さらにそこから正確なポリシーファイル名に対応付ける台帳を維持し、名前を一度だけ割り当てて割り当てたままにします。予約はアトミックでなければならず、実際には割り当ててから署名する手順を囲むデータベース制約かロックを意味し、二人が編集する表計算ではありません。
次に検査を発行の一部にします:要求された名前がすでに存在する場合は署名を拒否し、別の機関が予約した名前も同じように使用済みなので、その検査にはサーバーが信頼するすべての機関を含めます。明確な理由を伴う拒否は、他の誰かの固定アドレスを受け取り続けるデバイスについてのチケットより安く済みます。
更新は意図的に名前を再利用する
既存のデバイスへの再発行は、同じポリシー名の下で新しいシリアル番号を生み出すべきであり、それは衝突ではなく正当な再利用です。事前に決めておくべきは、古い証明書と新しい証明書を同時に有効にしてよいか、そして古い資格情報をどう退役させるかという重なりの扱いです。
これを解決するために duplicate-cn に頼らないでください。このサーバーオプションは同じ名前を提示する同時接続を制御するもので、登録をロックするわけではなく、有効にしても一つの共有固定アドレスが同時に二台のマシンにとって安全になるわけではありません。失効は通常、発行者とシリアル番号で証明書を識別するため、サーバーが正しい失効データを受け取って適用している限り、古い資格情報の退役がその代替を無効にする必要はありません。
マシン上のツールでマッピングを確認する
デバイスに新しい資格情報を渡す前に、サーバーが読むのと同じ方法で証明書から名前を読み取り、選択されると期待するポリシーファイルと比較します。
openssl x509 -in device42.crt -noout -subject -nameopt sep_multiline
ls -l /etc/openvpn/ccd/device42
grep -n "duplicate-cn" /etc/openvpn/server.conf
最初のコマンドはサブジェクトのフィールドを個別に出力するので、はぐれた組織単位や二重の空白がすぐに見えます。二つ目はその名前でポリシーファイルが存在することを確認し、三つ目はサーバーが一つの名前で複数セッションを許可する設定かどうかを示します。まだ間違いがインシデントではなく署名の代償で済むうちに、登録手順を離れる前に三つすべてを新しい証明書で実行してください。出力はチケットと一緒に保管し、次の担当者がサーバーに実際に渡された名前を確認できるようにします。
実際の接続で締めくくり、割り当てられたアドレスとプッシュされたルートを、書くつもりだった内容ではなくポリシーファイルと比較します。二台のデバイスが同じ固定アドレスを報告するなら、台帳には証明書の検査では決して明らかにならない衝突があります。