はじめに
目的
本記事はSSL/TLSプロトコルで見かける「SSL_NULL_WITH_NULL_NULL」について、意味と役割、利用される場面、注意点をわかりやすく解説します。専門用語は最小限にし、具体例を交えて説明します。
読者想定
ネットワークやサーバ管理に関心のある方、TLS設定を確認しているエンジニアや運用担当者を想定しています。暗号の深い知識がなくても読み進められるよう配慮しています。
本記事の流れ
第2章で定義と基本的な意味を説明し、第3章でハンドシェイク中の挙動、第4章でなぜ存在するかを考察します。第5章では実際に表示されるケースと注意点を示し、第6章で関連仕様を挙げます。最後に第7章で要点をまとめます。
読者が安全なTLS設定を判断できるよう、実務での見方を重視して説明します。
SSL_NULL_WITH_NULL_NULLとは
概要
SSL_NULL_WITH_NULL_NULLは、暗号化も認証も行わない特別な暗号スイートです。通信の内容は平文のままで、データの秘匿や改ざん防止が働きません。
名前の意味
名前は「プロトコル_鍵交換_WITH_暗号アルゴリズム_MACアルゴリズム」の形式で、ここでは鍵交換も暗号化もMAC(認証)も“NULL(何もない)”を示します。
何が行われないか(具体例)
・通信データの暗号化なし(平文がそのまま送受信されます)
・サーバーやクライアントの認証なし(相手が本物か確認できません)
出現する場面と検出方法
通常のインターネット通信では使われません。テスト目的や誤設定で表示されることがあります。検出は通信ログやTLSクライアント(例: openssl s_client)で利用中のスイートを確認します。
注意点と対策
社内や開発環境で使う以外は無効化してください。サーバー設定やクライアントの設定でNULLスイートを除外し、強力な暗号スイートを優先することをおすすめします。
SSL/TLSハンドシェイクとデフォルトスイート
概要
ハンドシェイク開始直後は、まだ暗号や認証方法が決まっていません。そのため通信スタックは一時的に「何もしていない」状態を表す仮のスイートを用います。これがSSL_NULL_WITH_NULL_NULLの意味合いです。
ハンドシェイクの流れ(簡単な例)
- クライアントがClientHelloを送信し、使える暗号スイート候補を列挙します。例:「AES」「RSA」「SHA」などの組み合わせ。
- サーバが候補から一つを選びServerHelloで応答します。
- 鍵交換や証明書のやり取りをして、両者が共通の鍵を作成します。
デフォルトスイートの役割
初期状態では暗号処理が未設定のため、メッセージを誤解しないようにNULLスイートを内部的に使います。これは実際の通信で暗号化される前の“安全でない”仮のラベルに過ぎません。
ChangeCipherSpec以降
両者が鍵とアルゴリズムで合意すると、ChangeCipherSpecメッセージを交換して実際の暗号スイートへ切り替えます。以降のデータは合意した方式で暗号化・認証されます。
なぜNULLスイートが必要なのか
役割と意図
SSL_NULL_WITH_NULL_NULLは暗号スイートの未決定状態を明示する内部マーカーです。ハンドシェイクの途中で「まだ暗号方式が合意されていない」ことを実装やログに示します。これにより、開発者やプロトコル実装は安全でない状態を認識しやすくなります。
具体的な利用例
たとえばライブラリが接続開始直後に内部変数を初期化するときや、テスト環境で暗号化を行わない通信を意図的に行う場合に使います。ログやダンプでNULLスイートが出ていれば「暗号は未設定」であると判断できます。
危険性と対処
本番でNULLスイートが選ばれると通信は保護されません。したがって、本番環境ではNULLを無効化し、使用可能な安全なスイートを明示的に設定してください。サーバ設定やライブラリのデフォルトを確認し、定期的にテストツールで検査することをおすすめします。
実際に表示されるケースと注意点
SSL_NULL_WITH_NULL_NULLがログやプロトコル解析ツールに出る場面は主に二つあります。ひとつはハンドシェイク開始直後の一時表示で、まだ暗号方式が確定していないタイミングです。もうひとつは実際にNULLスイートが選択され、通信が暗号化されていない場合で、こちらは重大な問題です。
現場での確認手順(簡単な順)
- パケットキャプチャを取る(Wiresharkやtcpdump)。ClientHelloとServerHelloを見て、最終的に選ばれたCipherSuiteを確認します。最初にNULLが見えてもServerHelloで別のスイートが選ばれれば問題ありません。
- opensslやsslscanで接続テストを行い、サーバがどのスイートを受け入れるか確認します。
- サーバ・クライアントの設定を確認し、NULLや匿名(aNULL)を明示的に無効化してください。
運用上の注意点
- ハンドシェイク終了後もNULLスイートが有効なら直ちに通信を遮断して設定を修正します。暗号化されない通信は情報漏えいリスクが高いです。場合によってはライブラリやサーバソフトの更新が必要です。
- 現代の主要実装はデフォルトでNULLを無効化しますが、古い設定やカスタムビルドでは残ることがあるため、定期的に確認してください。
トラブル時はログ・パケット・設定の三点を比較して、どの時点でNULLが現れるかを特定すると対応が早くなります。
関連する仕様と参考情報
命名規則と公式文書
SSL/TLSの暗号スイートは「SSL_<鍵交換>WITH<暗号>_」の形式で表記されます。公式仕様では、NULLスイートは未交渉状態や暗号化なしを表すために定義されています。代表的な文書としては、SSL 3.0(RFC 6101)、TLS 1.0(RFC 2246)、TLS 1.2(RFC 5246)、TLS 1.3(RFC 8446)があります。
仕様上の扱い
多くのRFCでコード値0x0000(TLS_NULL_WITH_NULL_NULLやSSL_NULL_WITH_NULL_NULL)が予約され、暗号化やMACが適用されないことを示します。仕様はこの値をプロトコル上で扱うために残していますが、安全な通信で使うことを想定していません。
実装と参照先
実際の確認には次を参照すると分かりやすいです。
– IANAのTLS Parameters(Cipher Suites)レジストリ:割り当て状況を確認できます。
– OpenSSLやその他ライブラリのドキュメント:NULLスイートの表示や無効化方法が書かれています。
– Wiresharkなどのパケット解析ツール:00 00として表示されることが多いです。
以上を踏まえ、仕様上の存在と実運用での非推奨性を区別して理解してください。
まとめ
以下に本稿の要点と実務での注意点をまとめます。
-
本質:SSL_NULL_WITH_NULL_NULLは暗号化も認証もしない特殊なスイートで、プロトコル内部の一時的な状態や「未選択」を示します。実際の通信は必ずハンドシェイクで強力なスイートに切り替わる必要があります。
-
表示を見たときの対応:デバッグやログでNULLスイートが出ても、まずハンドシェイク完了後にどのスイートが選択されたか確認してください。まだNULLのままであれば接続設定や証明書の問題を疑ってください。
-
運用上の鉄則:本番環境でNULLスイートを許可してはいけません。サーバーの暗号スイート設定からNULLや匿名スイートを除外し、ライブラリを最新に保ちます。簡単な確認例として、openssl s_clientで接続時の選択スイートを確認します。
-
チェックリスト(短縮):
- サーバ設定でNULLを無効にする
- ハンドシェイク後の選択スイートを確認する
- 証明書や鍵が正しく設定されているか検証する
- 暗号ライブラリを更新する
これらを守れば、NULLスイートによる意図しない無保護通信のリスクを回避できます。安全な運用を心がけてください。












