简介
本文档介绍思科身份服务引擎(ISE)中的传输层安全(TLS)会话恢复。
先决条件
要求
- 传输层安全(TLS)握手流程知识。
- 受保护的可扩展身份验证协议(PEAP)流知识
- 思科身份服务引擎知识
使用的组件
本文档中的信息基于以下软件和硬件版本
- 思科身份服务引擎3.2
- ISE虚拟机(VM)
- Windows 10 PC
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
TLS会话恢复是一种用于消除初始TLS握手开销的技术。它允许以前建立TLS会话的客户端和服务器恢复该会话,而无需重复资源密集型握手过程。
优势
- 它通过避免初始握手的资源密集型步骤和所需的时间来减少延迟。
- 它还通过跳过密集的密钥交换和证书验证过程来减少服务器上的计算负载。
配置
在ISE上,要启用TLS会话,请恢复PEAP:
Administration > System > Settings > Protocols > PEAP >选中Enable PEAP Session Resume
默认情况下,ISE将会话保持7200秒。
或者,您可以启用Enable Fast Reconnect,从而绕过PEAP的内部方法,并允许更快的重新身份验证。在无线漫游等应用中,这是理想选择。
ISE PEAP会话恢复配置
还必须在Supplicant客户端中启用快速重新连接。
此配置适用于Windows原生Supplicant客户端以启用快速重新连接。
Windows 10请求方配置
此配置适用于AnyConnect网络访问模块(NAM)配置文件编辑器,以启用快速重新连接。
AnyConnect NAM配置
验证
初始身份验证
在初始PEAP身份验证中,您可以看到在TLS握手期间,Client Hello中的Session ID字段为空。
初始TLS握手
ISE使用服务器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
接下来,客户端使用客户端密钥交换和更改密码规范进行响应。
客户端密钥交换和其他属性
最后,服务器还以更改密码规范进行响应,并完成TLS握手。
从服务器端更改密码规范
在RADIUS实时日志步骤中,您可以看到完整的TLS握手在第一次身份验证期间发生。
RADIUS实时日志TLS握手步骤
内部方法还执行完整的Microsoft质询握手身份验证协议(MSCHAPv2)身份验证。
RADIUS实时日志内部方法步骤
重新身份验证期间
在重新身份验证期间,客户端将在从初始身份验证获知的客户端Hello中发送相同的会话ID 869175266faf4eec5fb4334f819e25221fa0cf3cbf0e458806369063dba59207。
会话恢复期间的客户端呼叫
然后,ISE确认此会话ID存在于安全套接字层(SSL)会话缓存中,并且它们都会经历所谓的缩写TLS握手。在简短TLS握手过程中不会交换证书或密钥信息,并且会重复使用以前协商的密钥。
会话恢复中的服务器hello
在prrt-server.log中,您可以看到,在收到客户端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快速重新连接
常见问题解答
1)会话恢复和快速重新连接是否相互独立?
是,快速重新连接是一种可选功能,可绕过内部身份验证方法。启用Session Resume时,无需启用Fast Reconnect。
2)启用会话恢复是否会导致任何安全风险?
服务器在与浏览器(客户端)的初始握手期间分配一个随机会话ID。 客户端和服务器存储此会话ID以及会话密钥和连接状态。要恢复会话,客户端将存储的会话ID和第一条协议消息(ClientHello)发送到服务器。如果服务器识别到连接并愿意恢复会话,它会使用相同的会话ID来回复以重新建立相应的会话。这样可以快速建立安全连接,并且不会因重复使用之前协商的会话数据而丢失安全性。
3)TLS会话ID是否复制到其他节点?
否,TLS会话ID存储在PSN本身上。它不会复制到其他PSN。如果PSN重新启动或服务重新启动,所有会话ID都可能会从缓存中丢失,并且下次必须进行完全TLS握手。