我正在制作一个非常安全的应用程序,其中服务器有自己的自签名证书并且还签署了客户端证书。所以现在我必须让我的 Kotlin android 应用程序信任服务器的证书,并发送自己的客户端证书进行授权。
经过一番搜索后,我发现了如何信任服务器的 .crt,但我一直在纠结如何发送客户端的 .crt。现在让我感到惊讶的一件事是我已经在我的设备上安装了两个 crt,但它没有将它们用于请求。所以我在我的项目中的 res/raw 中添加了这两个文件。这有多安全?
到目前为止,我已经写了这个:
private fun getSocketFactory(): SSLSocketFactory
{
val cf: CertificateFactory = CertificateFactory.getInstance("X.509")
val caInput: InputStream = BufferedInputStream(context.resources.openRawResource(R.raw.ca))
val clientInput = BufferedInputStream(context.resources.openRawResource(R.raw.client))
val ca: Certificate
val client: Certificate
try{
ca = cf.generateCertificate(caInput)
client = cf.generateCertificate(clientInput)
} finally {
caInput.close()
// clientInput.close()
}
val keyStoreType = KeyStore.getDefaultType()
val keyStore = KeyStore.getInstance(keyStoreType)
keyStore.load(null, null)
val ks = KeyStore.getInstance(KeyStore.getDefaultType())
val pwd = "".toCharArray()
ks.load(clientInput, pwd)
val kmf = KeyManagerFactory.getInstance("PKIX")
kmf.init(ks, pwd)
clientInput.close()
keyStore.setCertificateEntry("ca", ca)
val tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm()
val tmf = TrustManagerFactory.getInstance(tmfAlgorithm)
tmf.init(keyStore)
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(kmf.keyManagers, tmf.trustManagers, null)
return sslContext.socketFactory
}
服务器确实得到信任,但客户端不发送其证书,所以..是的..那里的客户端内容是我复制粘贴的随机内容,希望它们能工作。
请问有什么帮助吗? :/