场景:我们在课堂上围绕可信连接和 SSL 进行一些实验,我想演示中间人攻击中的 SSL 握手请求。
我有一台带有自签名证书的 Apache 服务器。一切正常,但日志记录似乎不完整,因为无法获取 SSL 尝试列表。一旦客户端接受“异常”,我就会收到每个请求的正常访问日志消息。但是,我需要知道哪个 SSL 请求导致它失败。以下是我的日志指令:
LogLevel warn ErrorLog logs/ssl_error_log CustomLog logs/ssl_access_log combined #组合后就是你的平均自定义日志
我希望得到尝试的每次 SSL 握手的列表。我遗漏了什么才能产生类似以下内容?(显然不需要确切的词语,但大致如此)
0/0/0 00:00:00 - 192.168.1.10 - hijk.lmnop.edu - SSL 不匹配
答案1
SSL 连接具有CustomLog 的额外选项但他们不会逐一解释连接状态。你可能想试试LogLevel debug
,但这会给你带来大量需要你处理的额外垃圾。
老实说,对于此类来说,更好的想法是使用命令进行演示openssl s_server
,因为它可以配置为显示 SSL 状态机的逐步进度,您将能够准确地看到客户端在哪个步骤断开了连接。
就像是
openssl s_server -key [somekey.pem] -cert [somecert.pem] -accept 443 -state -www
当有人连接时,它会打印出连接的步骤:
SSL_accept:before/accept initialization
SSL_accept:SSLv3 read client hello A
SSL_accept:SSLv3 write server hello A
SSL_accept:SSLv3 write certificate A
SSL_accept:SSLv3 write key exchange A
SSL_accept:SSLv3 write server done A
SSL_accept:SSLv3 flush data
SSL_accept:SSLv3 read client key exchange A
SSL_accept:SSLv3 read finished A
SSL_accept:SSLv3 write change cipher spec A
SSL_accept:SSLv3 write finished A
SSL_accept:SSLv3 flush data
-www 选项使得当有人使用网络浏览器实际连接时,它会打印一些信息。如果用户离开时没有接受假证书,那么我猜连接会在中间某个地方断开。
您可以openssl s_client
以类似的方式使用该命令,但我不确定它在接受或不接受无效证书方面的灵活性如何。
答案2
证书协商是在您的浏览器和进行中间人攻击的代理之间进行的。在服务器端,您能看到的唯一区别是客户端的 IP。
但是,您可以在服务器上配置客户端证书来验证客户端。服务器将只接受来自受信任客户端的连接。如果连接被篡改,客户端证书将有所不同,服务器将关闭连接。