为我的 https 请求添加客户端证书

时间:2021-02-23 08:13:50

标签: rest http kotlin ssl ssl-certificate

我正在制作一个非常安全的应用程序,其中服务器有自己的自签名证书并且还签署了客户端证书。所以现在我必须让我的 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
    }

服务器确实得到信任,但客户端不发送其证书,所以..是的..那里的客户端内容是我复制粘贴的随机内容,希望它们能工作。

请问有什么帮助吗? :/

0 个答案:

没有答案