Your last paragraph is correct: indeed, in the ClientHello
message, the client announces its "maximum supported version". So a client that supports both SSL 3.0 and TLS 1.0 will say "I know up to TLS 1.0" (internally, "TLS 1.0" is encoded as "SSL 3.1"), but will still accept to use SSL 3.0. The protocol version which will be used is chosen by the server (in its ServerHello
message).
What you observe, though, is an artefact from another peculiarity of SSL, which is that the version is indicated twice. Namely, all traffic in SSL is sent as records, and all records have a five-byte header that indicates:
- The type of data in the record (type being "handshake message", "alert", "change cipher spec" or "application data")(one byte).
- The record protocol version (two bytes).
- The record length (two bytes).
So the report line you observe:
http-8443-14, READ: SSLv3 Handshake, length = 87 *** ClientHello, TLSv1
probably means: "A record of type 'handshake message', version SSL 3.0 and length 87 bytes, has been observed. Its contents turned out to be a ClientHello
message that internally says 'I, the client, support protocol versions up to TLS 1.0'."
It is customary for SSL clients to use a "low" version (3.0) on the first record because there are old and broken SSL servers that not only do not support TLS, but also panic and die when faced with a record tagged "TLS 1.0", even though the format of an unencrypted TLS 1.0 record is absolutely identical to that of an unencrypted SSL 3.0 record (except for the version in the record header).
For more information on such details about SSL, read this.