はじめに
このドキュメントでは、Cisco Identity Services Engine(ISE)でのTransport Layer Security(TLS)セッションの再開について説明します。
前提条件
要件
- Transport Layer Security(TLS)ハンドシェイクプロセスに関する知識
- Protected Extensible Authentication Protocol(PEAP)フローの知識
- Cisco Identity Services Engine(ISE)に関する知識
使用するコンポーネント
このドキュメントの情報は、次のソフトウェアとハードウェアのバージョンに基づいています。
- Cisco Identity Services Engine 3.2
- ISE仮想マシン(VM)
- Windows 10 PC
このドキュメントの情報は、特定のラボ環境にあるデバイスに基づいて作成されました。このドキュメントで使用するすべてのデバイスは、クリアな(デフォルト)設定で作業を開始しています。本稼働中のネットワークでは、各コマンドによって起こる可能性がある影響を十分確認してください。
背景説明
TLSセッション再開は、初期TLSハンドシェイクのオーバーヘッドを排除するために使用される手法です。 これにより、以前にTLSセッションを確立したクライアントとサーバは、リソースを大量に消費するハンドシェイクプロセスを繰り返すことなく、そのセッションを再開できます。
長所
- 最初のハンドシェイクでリソースを大量に消費する手順と、その手順の実行に必要な時間を回避することで、遅延を低減します。
- また、集中的なキー交換および証明書検証プロセスを省略することで、サーバの計算負荷を軽減します。
設定
ISEで、TLSセッションを有効にするには、PEAP用に再開します。
Administration > System > Settings > Protocols > PEAP > check the Enable PEAP Session Resume
デフォルトでは、ISEは7200秒間セッションを保持します。
オプションで、Enable Fast Reconnectを有効にできます。これにより、PEAPの内部方式がバイパスされ、さらに高速な再認証が可能になります。これは、ワイヤレスローミングなどのアプリケーションで望ましい動作です。
ISE PEAPセッション再開設定
サプリカントでも高速再接続を有効にする必要があります。
この設定は、高速再接続を有効にするWindowsネイティブサプリカント用です。
Windows 10サプリカントの設定
この設定は、AnyConnect Network Access Module(NAM)プロファイルエディタ用であり、高速再接続を有効にします。
AnyConnect NAMの設定
確認
初期認証
最初のPEAP認証では、TLSハンドシェイク時のClient HelloのSession IDフィールドが空白になっています。
最初のTLSハンドシェイク
ISEがServer Helloで応答します。これには、証明書とサーバキーとともに、セッションID 869175266faf4eec5fb4334f819e25221fa0cf3cbf0e458806369063dba59207が含まれています。
セッションIDを持つ初期サーバHello
prrt-server.logでは、セッションIDとともにハンドシェイクメッセージを確認できます。また、ハンドシェイクメッセージがキャッシュに保存されていることも確認できます。
Crypto,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x14), ret: 1, long string: SSLv3/TLS read client hello,SSLConnection.cpp:4495
Crypto,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY received client hello message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 5,SSLConnection.cpp:4510
Eap,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,cntx=0000452308,sesn=labpan01/494696177/7940,CPMSessionID=0A6A25D0000000100030EDBC,user=host/LABPCSK.vmlab.local,CallingStationID=B4-96-91-26-DE-2E,FramedIPAddress=10.106.37.25,CLIENT HELLO, new session,EapTlsProtocol.cpp:1463
Eap,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,cntx=0000452308,sesn=labpan01/494696177/7940,CPMSessionID=0A6A25D0000000100030EDBC,user=host/LABPCSK.vmlab.local,CallingStationID=B4-96-91-26-DE-2E,FramedIPAddress=10.106.37.25,Session id
0000: 86 91 75 26 6f af 4e ec 5f b4 33 4f 81 9e 25 22 ..u&o.N._.3O..%"
0010: 1f a0 cf 3c bf 0e 45 88 06 36 90 63 db a5 92 07 ...<..E..6.c.... ,EapTlsProtocol.cpp:1473
Crypto,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x16), ret: 1, long string: SSLv3/TLS write server hello,SSLConnection.cpp:4495
Crypto,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent server hello message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:13:20,542,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 9,SSLConnection.cpp:4510
Crypto,2024-02-12 19:13:20,543,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x17), ret: 1, long string: SSLv3/TLS write certificate,SSLConnection.cpp:4495
Crypto,2024-02-12 19:13:20,543,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent server certificate,SSLConnection.cpp:4498
Crypto,2024-02-12 19:13:20,543,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 11,SSLConnection.cpp:4510
Crypto,2024-02-12 19:13:20,581,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x18), ret: 1, long string: SSLv3/TLS write key exchange,SSLConnection.cpp:4495
Crypto,2024-02-12 19:13:20,581,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent server key exchange message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:13:20,581,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 13,SSLConnection.cpp:4510
Crypto,2024-02-12 19:13:20,581,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x1a), ret: 1, long string: SSLv3/TLS write server done,SSLConnection.cpp:4495
Crypto,2024-02-12 19:13:20,581,DEBUG,0x7f8f923fc700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent server done message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:13:20,737,DEBUG,0x7f8f91df9700,NIL-CONTEXT,shutting session id
0000: 86 91 75 26 6f af 4e ec 5f b4 33 4f 81 9e 25 22 ..u&o.N._.3O..%"
0010: 1f a0 cf 3c bf 0e 45 88 06 36 90 63 db a5 92 07 ...<..E..6.c.... ,SSLConnection.cpp:337
Crypto,2024-02-12 19:13:20,737,DEBUG,0x7f8f91df9700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.pvDone - session is being preserved in cache,SSLConnection.cpp:355
次に、クライアントがClient Key Exchange and Change Cipher Specで応答します。
Client Key Exchangeおよびその他の属性
最後に、サーバも暗号仕様変更で応答し、TLSハンドシェイクが完了します。
サーバ側からの暗号仕様の変更
RADIUSライブログの手順では、最初の認証時に完全なTLSハンドシェイクが発生することを確認できます。
RADIUSライブログTLSハンドシェイクの手順
内部方式では、完全なMicrosoftチャレンジハンドシェイク認証プロトコル(MSCHAPv2)認証も実行されます。
RADIUSライブログ内部方式の手順
再認証中
再認証中に、クライアントは最初の認証から学習したClient Helloで同じセッションID 869175266faf4eec5fb4334f819e25221fa0cf3cbf0e458806369063dba59207を送信します。
セッション再開中のClient Hello
次に、ISEはこのセッションIDがSecure Socket Layer(SSL)セッションキャッシュ内にあることを確認し、両方とも短縮TLSハンドシェイクと呼ばれる処理を実行します。短縮TLSハンドシェイク中に証明書またはキー情報は交換されず、以前にネゴシエートされたキーが再利用されます。
セッション再開時のServer Hello
prrt-server.logでは、Client Helloを受信した後、ISEによってセッションが再使用されていることが確認され、証明書とキー交換がスキップされることが確認できます。
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x14), ret: 1, long string: SSLv3/TLS read client hello,SSLConnection.cpp:4495
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY received client hello message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 5,SSLConnection.cpp:4510
Eap,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,cntx=0000452772,sesn=labpan01/494696177/7949,CPMSessionID=0A6A25D0000000110043ACB0,user=host/LABPCSK.vmlab.local,CallingStationID=B4-96-91-26-DE-2E,FramedIPAddress=10.106.37.25,CLIENT HELLO, session reused,EapTlsProtocol.cpp:1463
Eap,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,cntx=0000452772,sesn=labpan01/494696177/7949,CPMSessionID=0A6A25D0000000110043ACB0,user=host/LABPCSK.vmlab.local,CallingStationID=B4-96-91-26-DE-2E,FramedIPAddress=10.106.37.25,Session id
0000: 86 91 75 26 6f af 4e ec 5f b4 33 4f 81 9e 25 22 ..u&o.N._.3O..%"
0010: 1f a0 cf 3c bf 0e 45 88 06 36 90 63 db a5 92 07 ...<..E..6.c.... ,EapTlsProtocol.cpp:1473
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x16), ret: 1, long string: SSLv3/TLS write server hello,SSLConnection.cpp:4495
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent server hello message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 9,SSLConnection.cpp:4510
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x23), ret: 1, long string: SSLv3/TLS write change cipher spec,SSLConnection.cpp:4495
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent change cipher spec message,SSLConnection.cpp:4498
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Call TLS Notify Callback, event 1,SSLConnection.cpp:4510
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS LOG: where: (0x2001), ssl state (0x24), ret: 1, long string: SSLv3/TLS write finished,SSLConnection.cpp:4495
Crypto,2024-02-12 19:33:48,821,DEBUG,0x7f8f925fd700,NIL-CONTEXT,Crypto::Result=0, Crypto.SSLConnection.tlsNotifyLog - TLS log: TLS_NOTIFY sent finished message (server is ready to finish handshake),SSLConnection.cpp:4498
最後に、クライアントが暗号仕様変更で応答すると、TLSハンドシェイクが完了します。
クライアント暗号仕様変更セッション再開
RADIUSライブログの手順では、再認証中に短縮TLSハンドシェイクが発生することを確認できます。
RADIUSライブログのTLSセッション再開手順
再認証では、内部方式がスキップされることが確認できます。
RADIUSライブログPEAP高速再接続
よく寄せられる質問(FAQ)
1)セッション再開と高速再接続は互いに独立していますか。
はい。高速再接続は、内部認証方式がバイパスされるオプションの機能です。セッション再開が有効な場合は、高速再接続を有効にする必要はありません。
2)セッション再開を有効にすると、セキュリティリスクが発生しますか。
サーバは、ブラウザ(クライアント)との最初のハンドシェイク中にランダムなセッションIDを割り当てます。 クライアントとサーバは、このセッションIDと、セッションキーおよび接続状態を保存します。セッションを再開するには、クライアントは保存されたセッションIDと最初のプロトコルメッセージ(ClientHello)をサーバに送信します。サーバが接続を認識し、セッションを再開する場合、サーバは同じセッションIDで応答し、それぞれのセッションを再確立します。これにより、以前にネゴシエートされたセッションデータを再利用するので、セキュリティを損なうことなくセキュアな接続を迅速に確立できます。
3) TLSセッションIDは他のノードに複製されますか。
いいえ、TLSセッションIDはPSN自体に保存されます。他のPSNには複製されません。PSNのリブートまたはサービスの再起動の場合、キャッシュからすべてのセッションIDが失われる可能性があり、次回フルTLSハンドシェイクが発生する必要があります。