I have a server to which many clients connect using SSL. Recently I'm observing SSL handshake errors in the server logs (ex SSL MAC error). The error itself is not important, but I want to see why some clients are able to connect while others are failing, and also need to identify which clients are failing.
For debugging this issue, I want to capture all SSL handshakes happening at server and since I don't know when the problematic clients connect, I don't want to capture all the traffic till that happens. I just want to capture all the SSL handshakes and later analyze them with Wireshark. Assume that I only have access to tcpdump and no other tools for capturing.
I don't know what exactly you are calling handshake, but I propose this command that will probably capture more than 95% of what you can want:
tcpdump -ni eth0 "tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)"
Now what does it do:
tcp[12]
means capturing the 13th byte of the tcp packet, corresponding to first half being the offset, second half being reserved.
The offset, once multiplied by 4 gives the byte count of the TCP header, meaning ((tcp[12] & 0xf0) >> 2)
provides the size of the TCP header.
The first byte of a TLS packet define the content type. The value 22 (0x16 in hexadecimal) has been defined as being "Handshake" content.
As a consequence, tcp[((tcp[12] & 0xf0) >> 2)] = 0x16
captures every packet having the first byte after the TCP header set to 0x16
.
More filtering can be performed, but this strictly answers your question.