Hello Akshay C S,
Thank you for reaching out to the Microsoft Q&A platform.
Based on the details and stack trace provided, the issue is not with Azure DevOps Server, but rather with how Reactor Netty handles timeouts and DNS resolution during the SOCKS5 proxy connection phase.
The fact that the timeout occurs at exactly 10 seconds, despite you increasing the handshakeTimeout to 60 seconds, indicates that the default channel connection timeout is being hit. In Reactor Netty, the default connection timeout (ChannelOption.CONNECT_TIMEOUT_MILLIS) is 10 seconds (10000ms). This timeout covers the TCP connect and the proxy connection steps. If the tunnel takes longer than 10 seconds to establish, it fails before your 60-second SSL handshake timeout logic is fully applied.
To directly answer your questions:
1. Is HTTPS over SOCKS5 supported for Azure DevOps Server 2022.2?
Yes, it is fully supported. Azure DevOps Server operates at the application and transport layers (HTTPS/TLS) and is completely unaware of the client-side SOCKS5 tunnel. There are no DevOps-specific limitations for proxied SSL/TLS connections.
2. Are there specific TLS/SSL requirements for Azure DevOps Server?
- TLS Versions: As per Microsoft standards, Azure DevOps Server 2022 defaults to requiring TLS 1.2. Older protocols (TLS 1.0/1.1) are disabled by default.
- Cipher Suites: Standard FIPS and non-FIPS cipher suites for TLS 1.2 are supported. The JVM default cipher suites are perfectly sufficient.
- Client Certificates: Unless explicitly configured by your server administrator for mutual TLS (mTLS), client certificates are not required.
Possible Resolution: To resolve this, you need to increase the Netty channel connection timeout and defer DNS resolution to the proxy. If Netty tries to resolve the Azure DevOps Server hostname locally before routing through the proxy, it can cause routing failures or timeouts.
Please update your HttpClient configuration as follows:
import io.netty.channel.ChannelOption;
import io.netty.resolver.NoopAddressResolverGroup;
import reactor.netty.http.client.HttpClient;
import reactor.netty.transport.ProxyProvider;
import java.time.Duration;
HttpClient httpClient = HttpClient.create()
// 1. Increase TCP Connect and Proxy Connect timeout to 60 seconds
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 60000)
// 2. Defer DNS resolution to the SOCKS5 proxy
.resolver(NoopAddressResolverGroup.INSTANCE)
.proxy(proxy -> proxy
.type(ProxyProvider.Proxy.SOCKS5)
.host("localhost")
.port(8888))
// 3. Keep your existing SSL handshake timeout
.secure(ssl -> ssl.handshakeTimeout(Duration.ofSeconds(60)));
Note: If you ever transition to using the Azure SDK's client builder, you can achieve the same using the NettyAsyncHttpClientBuilder.
References:
Please try this configuration and let me know if it resolves the handshake timeout issue.
Note: This response is drafted with the help of AI systems.