我遇到了 SSL 会话缓存问题。为了测试服务器配置是否正常,我使用以下命令:
echo | openssl s_client -connect <server.com>:443 -reconnect 2>/dev/null| egrep -iw "New|Reused|Session-ID:"
第一个请求输出“New”,然后输出“Reused”。所以服务器配置似乎没问题。
当我查看 apache2 access.log 时,我可以看到对于某些客户端,它按预期工作。到目前为止,我发现诊断 SSL 会话恢复的最佳方法是查看发送的字节数 (%O)。
工作客户端日志的示例:
IP - - [D:10:36:59] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 5142 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:00] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 482 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:03] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 635 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:04] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 482 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:06] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 482 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:09] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 635 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:11] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 482 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:13] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 635 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:15] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 482 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:17] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 482 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
IP - - [D:10:37:19] "GET /rest/instant_message/TEST HTTP/1.1" 200 13 635 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; iot800n Build/OPM6.171019.030.K1)"
在上面的日志中,你可以看到第一个请求响应是 5142 字节(内容长度为 13)。并且所有后续请求响应都是 482 或 635 字节(内容长度相同)。
然而对于一些客户端来说,所有请求响应都是~5kb。如下面的示例日志所示:
IP - - [D:10:30:45] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:31:00] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:31:15] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:31:30] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:31:45] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:32:00] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:32:15] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:32:30] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
IP - - [D:10:32:45] "GET /rest/instant_message/BOM1 HTTP/1.1" 200 419 5549 "-" "Dalvik/2.1.0 (Linux; U; Android 9; SM-T395 Build/PPR1.180610.011)"
有时,同一个客户端(同一个ip)有时会使用会话恢复,然后停止使用,然后重新使用等等。
所有客户端都是相同的 Android 平板电脑 (SMT395),使用 Volley 库运行相同的应用程序来处理 http 请求。它们通过 SIM 卡连接到互联网。
服务器配置是:
SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
SSLSessionCacheTimeout 300
什么原因可能导致 https 会话无法恢复?我可以使用哪些工具来调试 https 会话?
答案1
到目前为止,我发现诊断 SSL 会话恢复的最佳方法是查看发送的字节数
首先,启用mod_status并设置扩展状态设置为开启。确保此状态页面不可公开访问,可能使用访问控制列表或者基本身份验证使用强密码。
您应该能够从 httpd 状态页面中看到会话缓存的使用情况,例如
SSL/TLS Session Cache Status:
cache type: SHMCB, shared memory: 512000 bytes, current sessions: 1
sub-caches: 32, indexes per sub-cache: 133
time left on oldest entries' SSL sessions: avg: 297 seconds, (range: 297...297)
index usage: 0%, cache usage: 0%
total sessions stored since starting: 1
total sessions expired since starting: 0
total (pre-expiry) sessions scrolled out of the cache: 0
total retrieves since starting: 1 hit, 1 miss
total removes since starting: 0 hit, 0 miss
这样,您就可以大致了解 TLS/SSL 缓存的使用情况。这将验证您的缓存是否已满(高索引和/或缓存使用率),从而需要您增加缓存大小;或者,如果您的客户端数量很少,则客户端表现不佳。
还要检查缓存命中和未命中情况,以验证您的服务器和您的客户端正在使用会话恢复。
然后,启用debug
日志记录例如mod_ssl
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_engine.log
LogLevel ssl:debug
</IfModule>
就足够了。
这将输出巨大的有关 httpd 实例中的 SSL 模块的详细日志,包括会话生成、恢复和过期。使用正常和有故障的客户端进行测试以查看差异。
有时,同一个客户端(同一个ip)有时会使用会话恢复,然后停止使用,然后重新使用等等。
有多少客户端连接到服务器?服务器有多少 RAM?shmcb
是共享内存缓存,对于低流量服务器,512kB 应该足够了,但我怀疑 512kB 不足以满足您的实现要求。
什么原因导致 https 会话无法恢复?
很多。这取决于您的 TLS 版本(< 1.3,>= 1.3?SSL 会话恢复至少从 v1.1 开始就已经在 TLS 中,但在 v1.3 中进行了改进)、您的客户端应用程序、您的客户端 SSL 库等。