GRP C Okhttp android клиентский канал с самоподписанным ssl-сертификатом - PullRequest
0 голосов
/ 03 августа 2020

У меня есть сервер grp c - js, использующий самоподписанные ssl-сертификаты.

var credentials = grpc.ServerCredentials.createSsl(
    fs.readFileSync('./node/grpc/ssl/ca.crt'), 
    [{
        cert_chain: fs.readFileSync('./node/grpc/ssl/server.crt'),
        private_key: fs.readFileSync('./node/grpc/ssl/server.key')
    }], 
    true
);

Затем я протестировал эту настройку с клиентом grp c - js со следующими учетными данными setup, и это работает.

var credentials = grpc.credentials.createSsl(
    fs.readFileSync('./node/grpc/ssl/ca.crt'),
    fs.readFileSync('./node/grpc/ssl/client.key'),
    fs.readFileSync('./node/grpc/ssl/client.crt')
);

Я хочу воспроизвести это в Android с помощью OkHttpChannelBuilder, но это немного сложнее. Это то, что у меня есть до сих пор.

private val mChannel : ManagedChannel
init {
    /**
     * Server certificate to make it trusted.
     */
    val serverCrtFile = applicationContext.resources.openRawResource(R.raw.server)
    val serverCertificate: X509Certificate =
        CertificateFactory.getInstance("X.509").generateCertificate(serverCrtFile) as X509Certificate

    val caKeyStore: KeyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
        load(null, null)
        setCertificateEntry("server", serverCertificate)
    }

    val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
        init(caKeyStore)
    }

    val sslContext = SSLContext.getInstance("TLS").apply {
        init(null, trustManagerFactory.trustManagers, null)
    }

    mChannel = OkHttpChannelBuilder
        .forAddress(BuildConfig.GRPC_HOST_ADDRESS, BuildConfig.GRPC_HOST_PORT)
        .sslSocketFactory(sslContext.socketFactory)
        .keepAliveTime(10, TimeUnit.SECONDS)
        .useTransportSecurity()
        .keepAliveWithoutCalls(true)
        .build()
}

Все работало до реализации ssl (поэтому я использовал plaintext() в построителе каналов).

Теперь я получаю ошибку io.grpc.StatusRuntimeException: UNAVAILABLE: End of stream or IOException. Может ли кто-нибудь сказать мне, делаю ли я что-то не так и как мне установить успешное соединение, например, между сервером js и клиентом.

1 Ответ

0 голосов
/ 10 августа 2020

Похоже, что квитирование SSL не удалось на стороне сервера, поэтому будет полезно получить подробные журналы на стороне сервера, чтобы увидеть, что пошло не так.

Одна из возможностей - использовать KeyStore.getInstance. Можете попробовать использовать "PKCS12"?

 KeyStore.getInstance("PKCS12")
...