OpenVPN の TLS 暗号エラー: まず両側のピアを比較する
「共通の暗号がない」というエラーは data-ciphers ではなく TLS 制御チャネルの問題です。まずバージョン、次にスイート一覧、最後にネゴシエーションを証明します。
「共通の暗号がない」というエラーは設定を一つ変えれば済むように聞こえますが、多くの人が変える設定は間違っています。OpenVPN は TLS ハンドシェイクを行う制御チャネルと、トンネル内でパケットを運ぶデータチャネルに別々のポリシーを持ち、エラーは前者を指しているのに、人は後者を編集します。各ピアが何を許可しているかを正しい順序で比較すれば、当て推量は二つか三つの判断、すなわちバージョン、次にスイート一覧、最後に認証情報に変わります。
この順序を間違えると、一度も参照されない一覧に AES の名前を足すことに一時間を費やすことになります。
二つの暗号一覧、ハンドシェイクを壊すのは片方だけ
制御チャネルは TLS セッションをネゴシエートし、そのポリシーは tls-cipher で TLS 1.2 用に、tls-ciphersuites で TLS 1.3 用に書きます。データチャネルは別に data-ciphers で設定し、ここでの不一致は接続が確立したあと通信を通せない状態を生みます。どちらも暗号に触れるエラーを出すため混同されます。決して完了しないハンドシェイクは制御チャネルを指し、確立したのにパケットを落とすトンネルはデータチャネルを指します。
最初の一行ではなくメッセージ全体を読む。バージョンの不一致、欠けたスイート、ピアが拒否する証明書署名アルゴリズム、ホスト名検証の失敗はいずれも TLS エラーで終わり、そのうちスイート一覧に関係するのは一つだけです。これらの分類を切り分けることが診断の大半です。
スイートより先にバージョンを比較する
TLS 1.2 に限定されたピアと 1.3 を必須とするピアは共通のバージョンを持たず、どんな暗号文字列でもそれを橋渡しできません。両側の tls-version-min と tls-version-max を記録してください。使っているビルドの既定値でもかまいません。ディストリビューションの OpenSSL ポリシーは、OpenVPN のどのオプションも告げずに下限を引き上げることがあるからです。片側がアプライアンスや第三者クライアントなら、そのウィンドウはファームウェアが許す範囲であり、ウィンドウが重なって初めてスイートの比較に意味が出ます。
その記録には実際のバイナリ名も書くべきです。ノート PC のコマンドライン openvpn が、インポートしたプロファイルを扱うクライアントとは限りません。
TLS 1.2 と TLS 1.3 の一覧は混ぜられない
TLS 1.2 のスイート名は ECDHE-RSA-AES256-GCM-SHA384 のような形で、tls-cipher に入り、OpenSSL の暗号文字列を受け取ります。TLS 1.3 のスイートは TLS_AES_256_GCM_SHA384 のような名前で、tls-ciphersuites に入り、1.2 の文字列に一つ足しても 1.3 の一覧は設定されず、パーサーは一度も一致させないままテキストを受け入れることがあります。あるバージョンに正しいフィルターは、もう一方については何も語りません。どの一覧がどのバージョン向けかを書き留めてください。
openvpn --show-tls はローカルのビルドが何をサポートするかを出力しますが、それは一覧であって約束ではありません。遠い側のピアがそのスイートを許可しないことも、有効なプロファイルがそれを有効にしないこともあるため、スイートをまったく提示できないビルドを除外するために使い、そのうえで設定済みの一覧を比較してください。
新しい接続でネゴシエーションを証明する
成功したハンドシェイクだけが証拠になり、しかも本物のクライアントが本物のプロファイルで行う必要があります。サーバーの詳細度を上げて一度接続し、最初に提示された値が勝ったと決めつけずに、ログからネゴシエートされたプロトコルバージョンとスイートを読み取ってください。次に、ハンドシェイクが動くこととデータチャネルが失敗することは別の修理なので、トンネルを通る通信でデータチャネルを別に確認してください。古いクライアントプロファイルはよくある偽陰性なので、設定を変えたら毎回やり直してください。
承認された共通設定が存在しない場合、答えはアップグレードか移行計画であり、弱めたポリシーではありません。tls-version-min を下げること、検証を切ること、すべての旧スイートを有効にすることは、その拒否を生んだセキュリティ要件を満たさないまま拒否を取り除くだけです。
変更チケットに、ネゴシエートされたバージョン、スイート、データ暗号を記録してください。次に TLS エラーに遭う人は、フォーラム投稿で見つけた暗号文字列からではなく、その記録から始められます。