Skip to content

Instantly share code, notes, and snippets.

@amir-khassaia
Last active April 7, 2024 09:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save amir-khassaia/04347ca88526f4b958b3326968a905c0 to your computer and use it in GitHub Desktop.
Save amir-khassaia/04347ca88526f4b958b3326968a905c0 to your computer and use it in GitHub Desktop.
TLS Socket Client Handshaker in Kotlin with Java8 runtime defaults
import java.io.IOException
import java.security.KeyManagementException
import java.security.NoSuchAlgorithmException
import java.security.Security
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocket
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
object SslSocketClient {
private const val host = "host"
private const val port = 443
@JvmStatic
@Throws(NoSuchAlgorithmException::class, IOException::class, KeyManagementException::class)
fun main(args: Array<String>) {
Security.setProperty("crypto.policy", "limited")
System.setProperty("javax.net.debug", "ssl:handshake")
System.setProperty("jdk.tls.namedGroups", "secp256r1, secp384r1, secp521r1, secp160k1")
System.setProperty("javax.net.debug", "ssl:handshake")
System.setProperty("jdk.tls.client.enableStatusRequestExtension", "false")
System.setProperty("jsse.enableFFDHEExtension", "false")
System.setProperty("jdk.tls.client.protocols", "TLSv1.1,TLSv1.2")
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, arrayOf<TrustManager>(object : X509TrustManager {
override fun checkClientTrusted(x509Certificates: Array<X509Certificate>, s: String) {
println("Skip trust check for: " + x509Certificates[0])
}
override fun checkServerTrusted(x509Certificates: Array<X509Certificate>, s: String) {
println("Skip trust check for: " + x509Certificates[0])
}
override fun getAcceptedIssuers(): Array<X509Certificate?> {
return arrayOfNulls(0)
}
}), null)
(sslContext.socketFactory.createSocket(host, port) as SSLSocket).use { sslSocket ->
sslSocket.useClientMode = true
sslSocket.addHandshakeCompletedListener {
evt -> println("Handshake completed: ${evt.session.protocol} - ${evt.session.cipherSuite}, ${evt.socket}")
}
sslSocket.startHandshake()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment