2018-12-06 22:38:49 +01:00
|
|
|
package jp.juggler.util
|
|
|
|
|
|
|
|
import java.io.IOException
|
|
|
|
import java.net.InetAddress
|
|
|
|
import java.net.Socket
|
|
|
|
import java.net.UnknownHostException
|
|
|
|
import java.security.KeyStore
|
|
|
|
import javax.net.ssl.*
|
|
|
|
|
|
|
|
object MySslSocketFactory : SSLSocketFactory() {
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
private val log = LogCategory("MySslSocketFactory")
|
|
|
|
|
2022-12-27 07:09:47 +01:00
|
|
|
private var debugCipherSuites = false
|
|
|
|
|
2021-06-20 15:12:25 +02:00
|
|
|
private val originalFactory: SSLSocketFactory =
|
|
|
|
SSLContext.getInstance("TLS").apply {
|
|
|
|
init(null, null, null)
|
|
|
|
}.socketFactory
|
|
|
|
|
|
|
|
private fun check(socket: Socket?): Socket? {
|
|
|
|
// 端末のデフォルトでは1.3が含まれないので追加する
|
|
|
|
(socket as? SSLSocket)?.enabledProtocols = arrayOf("TLSv1.1", "TLSv1.2", "TLSv1.3")
|
|
|
|
|
|
|
|
// デバッグフラグが変更された後に1回だけ、ソケットの暗号化スイートを列挙する
|
|
|
|
if (debugCipherSuites) {
|
|
|
|
debugCipherSuites = false
|
|
|
|
(socket as? SSLSocket)?.enabledCipherSuites?.forEach { cs ->
|
|
|
|
log.d("getEnabledCipherSuites : $cs")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return socket
|
|
|
|
}
|
|
|
|
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun getDefaultCipherSuites(): Array<String> =
|
|
|
|
originalFactory.defaultCipherSuites
|
2021-06-20 15:12:25 +02:00
|
|
|
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun getSupportedCipherSuites(): Array<String> =
|
|
|
|
originalFactory.supportedCipherSuites
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
@Throws(IOException::class)
|
2023-01-13 07:33:28 +01:00
|
|
|
override fun createSocket(): Socket? =
|
|
|
|
check(originalFactory.createSocket())
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
@Throws(IOException::class)
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun createSocket(
|
|
|
|
s: Socket,
|
|
|
|
host: String,
|
|
|
|
port: Int,
|
|
|
|
autoClose: Boolean,
|
|
|
|
): Socket? = check(
|
|
|
|
originalFactory.createSocket(
|
|
|
|
s,
|
|
|
|
host,
|
|
|
|
port,
|
|
|
|
autoClose
|
2021-06-20 15:12:25 +02:00
|
|
|
)
|
2022-12-27 07:09:47 +01:00
|
|
|
)
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
@Throws(IOException::class, UnknownHostException::class)
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun createSocket(
|
|
|
|
host: String,
|
|
|
|
port: Int,
|
|
|
|
): Socket? = check(
|
|
|
|
originalFactory.createSocket(
|
|
|
|
host,
|
|
|
|
port
|
2021-06-20 15:12:25 +02:00
|
|
|
)
|
2022-12-27 07:09:47 +01:00
|
|
|
)
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
@Throws(IOException::class, UnknownHostException::class)
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun createSocket(
|
|
|
|
host: String,
|
|
|
|
port: Int,
|
|
|
|
localHost: InetAddress,
|
|
|
|
localPort: Int,
|
|
|
|
): Socket? = check(
|
|
|
|
originalFactory.createSocket(
|
|
|
|
host,
|
|
|
|
port,
|
|
|
|
localHost,
|
|
|
|
localPort
|
2021-06-20 15:12:25 +02:00
|
|
|
)
|
2022-12-27 07:09:47 +01:00
|
|
|
)
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
@Throws(IOException::class)
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun createSocket(
|
|
|
|
host: InetAddress,
|
|
|
|
port: Int,
|
|
|
|
): Socket? = check(
|
|
|
|
originalFactory.createSocket(
|
|
|
|
host,
|
|
|
|
port
|
2021-06-20 15:12:25 +02:00
|
|
|
)
|
2022-12-27 07:09:47 +01:00
|
|
|
)
|
2021-06-20 15:12:25 +02:00
|
|
|
|
|
|
|
@Throws(IOException::class)
|
2022-12-27 07:09:47 +01:00
|
|
|
override fun createSocket(
|
|
|
|
address: InetAddress,
|
|
|
|
port: Int,
|
|
|
|
localAddress: InetAddress,
|
|
|
|
localPort: Int,
|
|
|
|
): Socket? = check(
|
|
|
|
originalFactory.createSocket(
|
|
|
|
address,
|
|
|
|
port,
|
|
|
|
localAddress,
|
|
|
|
localPort
|
2021-06-20 15:12:25 +02:00
|
|
|
)
|
2022-12-27 07:09:47 +01:00
|
|
|
)
|
2021-06-20 15:12:25 +02:00
|
|
|
|
2022-12-27 07:09:47 +01:00
|
|
|
// App1, TestTootInstance 等で使われる
|
2021-06-20 15:12:25 +02:00
|
|
|
val trustManager: X509TrustManager by lazy {
|
2022-12-27 07:09:47 +01:00
|
|
|
val list = TrustManagerFactory
|
2021-06-20 15:12:25 +02:00
|
|
|
.getInstance(TrustManagerFactory.getDefaultAlgorithm())
|
|
|
|
.apply { init(null as KeyStore?) }
|
|
|
|
.trustManagers
|
|
|
|
|
2022-12-27 07:09:47 +01:00
|
|
|
list?.firstNotNullOfOrNull { it as? X509TrustManager }
|
|
|
|
?: error("missing X509TrustManager in $list")
|
2021-06-20 15:12:25 +02:00
|
|
|
}
|
|
|
|
}
|