What version of Go are you using (go version)?
$ go version
go version go1.16.5 linux/amd64
Does this issue reproduce with the latest release?
Yes
What did you do?
This issue is to revisit #3930
That issue was closed because there weren't any strong use-cases that were still making use of SSLv2 Client Hello for compatibility: #3930 (comment)
We have a use-case at our company that we are unable to work around without considerable effort. We have a reverse proxy that performs TLS termination that has been deployed for thousands of services in tens of thousands of environments. We have written a new implementation of that proxy in Go.
The majority of those environments are behind hardware load balancers operating in TCP mode. We don't perform TLS termination with those load balancers because they are difficult and slow to update. The load balancers have been configured to use "ssl-ping" for health checks, where the load balancer sends an HTTPS request to /ping. We use this instead of "tcp-ping" because that mode only verifies that the load balancer can establish a TCP connection.
For health checks the hardware load balancers send an SSLv2 Client Hello to then negotiate up to TLS 1.0 in order to send the HTTPS request to /ping. Because crypto/tls does not support the SSLv2 Client Hello, our proxy rejects the request signaling to the load balancer that it is not healthy.
Options we see:
- Support for SSLv2 Client Hello is added to the standard library. 🎉
- We maintain a patch I adapted from issue 3930. Maintaining a patch that adds functionality, without external or expert review, is not ideal. This is our current stance.
- We update all of the hardware load balancers to use a TLS Client Hello. The team that owns the hardware load balancers is unwilling.
- We migrate all of the health checks from "ssl-ping" to "tcp-ping". This would be an availability risk since the ability to properly connect to the proxy will not be exercised when determining health.
What did you expect to see?
Successful TLS 1.0 handshakes from the load balancer using SSLv2 Client Hello for health checks.
What did you see instead?
TLS handshake failures.
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
Yes
What did you do?
This issue is to revisit #3930
That issue was closed because there weren't any strong use-cases that were still making use of SSLv2 Client Hello for compatibility: #3930 (comment)
We have a use-case at our company that we are unable to work around without considerable effort. We have a reverse proxy that performs TLS termination that has been deployed for thousands of services in tens of thousands of environments. We have written a new implementation of that proxy in Go.
The majority of those environments are behind hardware load balancers operating in TCP mode. We don't perform TLS termination with those load balancers because they are difficult and slow to update. The load balancers have been configured to use "ssl-ping" for health checks, where the load balancer sends an HTTPS request to
/ping. We use this instead of "tcp-ping" because that mode only verifies that the load balancer can establish a TCP connection.For health checks the hardware load balancers send an SSLv2 Client Hello to then negotiate up to TLS 1.0 in order to send the HTTPS request to
/ping. Because crypto/tls does not support the SSLv2 Client Hello, our proxy rejects the request signaling to the load balancer that it is not healthy.Options we see:
What did you expect to see?
Successful TLS 1.0 handshakes from the load balancer using SSLv2 Client Hello for health checks.
What did you see instead?
TLS handshake failures.