in ktor-network/ktor-network-tls/ktor-network-tls-certificates/jvm/src/io/ktor/network/tls/certificates/Certificates.kt [28:75]
public fun generateCertificate(
file: File,
algorithm: String = "SHA1withRSA",
keyAlias: String = "mykey",
keyPassword: String = "changeit",
jksPassword: String = keyPassword,
keySizeInBits: Int = 1024
): KeyStore {
val daysValid: Long = 3
val keyStore = KeyStore.getInstance("JKS")!!
keyStore.load(null, null)
val keyPairGenerator = KeyPairGenerator.getInstance(keysGenerationAlgorithm(algorithm))!!
keyPairGenerator.initialize(keySizeInBits)
val keyPair = keyPairGenerator.genKeyPair()!!
val id = Counterparty(
country = "RU", organization = "JetBrains", organizationUnit = "Kotlin", commonName = "localhost"
)
val from = Date()
val to = Date.from(LocalDateTime.now().plusDays(daysValid).atZone(ZoneId.systemDefault()).toInstant())
val certificateBytes = buildPacket {
writeCertificate(
issuer = id, subject = id,
keyPair = keyPair,
algorithm = algorithm,
from = from, to = to,
domains = listOf("127.0.0.1", "localhost"),
ipAddresses = listOf(Inet4Address.getByName("127.0.0.1"))
)
}.readBytes()
val cert = CertificateFactory.getInstance("X.509").generateCertificate(certificateBytes.inputStream())
cert.verify(keyPair.public)
keyStore.setCertificateEntry(keyAlias, cert)
keyStore.setKeyEntry(keyAlias, keyPair.private, keyPassword.toCharArray(), arrayOf(cert))
file.parentFile?.mkdirs()
file.outputStream().use {
keyStore.store(it, jksPassword.toCharArray())
}
return keyStore
}