Created
August 23, 2018 14:42
-
-
Save ademar111190/052de9e03f62bb0b2f4063c39774c79f to your computer and use it in GitHub Desktop.
An implementation of TLSSocketFactory discussed at https://stackoverflow.com/questions/28943660/how-to-enable-tls-1-2-support-in-an-android-application-running-on-android-4-1#33139635
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package br.com.dotz.core.repository.security | |
import java.net.InetAddress | |
import java.net.Socket | |
import javax.net.ssl.SSLSocket | |
import javax.net.ssl.SSLSocketFactory | |
class TLSSocketFactory constructor( | |
private val internalSSLSocketFactory: SSLSocketFactory | |
) : SSLSocketFactory() { | |
private val protocols = arrayOf("TLSv1.2", "TLSv1.1") | |
override fun getDefaultCipherSuites(): Array<String> = internalSSLSocketFactory.defaultCipherSuites | |
override fun getSupportedCipherSuites(): Array<String> = internalSSLSocketFactory.supportedCipherSuites | |
override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean) = | |
enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)) | |
override fun createSocket(host: String, port: Int) = | |
enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)) | |
override fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int) = | |
enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)) | |
override fun createSocket(host: InetAddress, port: Int) = | |
enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)) | |
override fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int) = | |
enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)) | |
private fun enableTLSOnSocket(socket: Socket?) = socket?.apply { | |
if (this is SSLSocket && isTLSServerEnabled(this)) { | |
enabledProtocols = protocols | |
} | |
} | |
private fun isTLSServerEnabled(sslSocket: SSLSocket) = sslSocket.supportedProtocols.any { it in protocols } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment