Last active
April 7, 2024 09:36
-
-
Save amir-khassaia/04347ca88526f4b958b3326968a905c0 to your computer and use it in GitHub Desktop.
TLS Socket Client Handshaker in Kotlin with Java8 runtime defaults
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
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