diff --git a/src/ModernHttpClient/Android/OkHttpNetworkHandler.cs b/src/ModernHttpClient/Android/OkHttpNetworkHandler.cs index 6839410..a774a17 100644 --- a/src/ModernHttpClient/Android/OkHttpNetworkHandler.cs +++ b/src/ModernHttpClient/Android/OkHttpNetworkHandler.cs @@ -38,6 +38,12 @@ public NativeMessageHandler(bool throwOnCaptiveNetwork, bool customSSLVerificati if (customSSLVerification) client.SetHostnameVerifier(new HostnameVerifier()); noCacheCacheControl = (new CacheControl.Builder()).NoCache().Build(); + + // If less than Android Lollipop + if (((int)Build.VERSION.SdkInt) < 21) + { + client.SetSslSocketFactory(new TlsSSLSocketFactory()); + } } public void RegisterForProgress(HttpRequestMessage request, ProgressDelegate callback) diff --git a/src/ModernHttpClient/Android/TlsSSLSocketFactory.cs b/src/ModernHttpClient/Android/TlsSSLSocketFactory.cs new file mode 100644 index 0000000..d4bd9f7 --- /dev/null +++ b/src/ModernHttpClient/Android/TlsSSLSocketFactory.cs @@ -0,0 +1,79 @@ +using Javax.Net.Ssl; + +namespace ModernHttpClient +{ + + public class TlsSSLSocketFactory : SSLSocketFactory + { + readonly SSLSocketFactory factory = (SSLSocketFactory)Default; + + public override string[] GetDefaultCipherSuites() + { + return factory.GetDefaultCipherSuites(); + } + + public override string[] GetSupportedCipherSuites() + { + return factory.GetSupportedCipherSuites(); + } + public override Java.Net.Socket CreateSocket(Java.Net.InetAddress address, int port, Java.Net.InetAddress localAddress, int localPort) + { + SSLSocket socket = (SSLSocket)factory.CreateSocket(address, port, localAddress, localPort); + socket.SetEnabledProtocols(socket.GetSupportedProtocols()); + socket.SetEnabledCipherSuites(socket.GetSupportedCipherSuites()); + + return socket; + } + + public override Java.Net.Socket CreateSocket(Java.Net.InetAddress host, int port) + { + SSLSocket socket = (SSLSocket)factory.CreateSocket(host, port); + socket.SetEnabledProtocols(socket.GetSupportedProtocols()); + socket.SetEnabledCipherSuites(socket.GetSupportedCipherSuites()); + + return socket; + } + + public override Java.Net.Socket CreateSocket(string host, int port, Java.Net.InetAddress localHost, int localPort) + { + SSLSocket socket = (SSLSocket)factory.CreateSocket(host, port, localHost, localPort); + socket.SetEnabledProtocols(socket.GetSupportedProtocols()); + socket.SetEnabledCipherSuites(socket.GetSupportedCipherSuites()); + + return socket; + } + + public override Java.Net.Socket CreateSocket(string host, int port) + { + SSLSocket socket = (SSLSocket)factory.CreateSocket(host, port); + socket.SetEnabledProtocols(socket.GetSupportedProtocols()); + socket.SetEnabledCipherSuites(socket.GetSupportedCipherSuites()); + + return socket; + } + + public override Java.Net.Socket CreateSocket(Java.Net.Socket s, string host, int port, bool autoClose) + { + SSLSocket socket = (SSLSocket)factory.CreateSocket(s, host, port, autoClose); + socket.SetEnabledProtocols(socket.GetSupportedProtocols()); + socket.SetEnabledCipherSuites(socket.GetSupportedCipherSuites()); + + return socket; + } + + protected override void Dispose(bool disposing) + { + factory.Dispose(); + base.Dispose(disposing); + } + + public override Java.Net.Socket CreateSocket() + { + SSLSocket socket = (SSLSocket)factory.CreateSocket(); + socket.SetEnabledProtocols(socket.GetSupportedProtocols()); + socket.SetEnabledCipherSuites(socket.GetSupportedCipherSuites()); + + return socket; + } + } +} \ No newline at end of file