Самоподписанный сертификат OkHttpClient

Необходимо подключить приложение для Android (модернизировать REST API) с сервером с самоподписанным сертификатом, поэтому я должен доверять этому сертификату.

Мне нужно использовать: file_certificate.crt, file_chain.chain и file_key.key

В Linux я запускаю эту команду:

openssl s_client -connect my.host.com:443 -state -tls1_2 -key file_key.key -cert file_certificate.crt -CAfile file_chain.chain

и подключение выполнено успешно ... Verify return code: 0 (ok)

Итак, как создать OkHttpClient для использования этих 3 файлов, потому что все, что я нашел, это использование одного файла CA, например:

 public static OkHttpClient createClient(Context context) {

    OkHttpClient client = null;

    CertificateFactory cf = null;
    InputStream cert = null;
    Certificate ca = null;
    SSLContext sslContext = null;
    try {
        cf = CertificateFactory.getInstance("X.509");
        cert = context.getResources().openRawResource(R.raw.file_certificate); // Place your 'my_cert.crt' file in `res/raw`

        ca = cf.generateCertificate(cert);
        cert.close();

        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);

        client = new OkHttpClient.Builder()
                .sslSocketFactory(sslContext.getSocketFactory())
                .build();

    } catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException | KeyManagementException e) {
        e.printStackTrace();
    }

    return client;
}

Аргументы -cert и -key для openssl s_client не имеют ничего общего с проверкой сертификата сервера, но используются для аутентификации с использованием сертификата клиента (взаимная аутентификация). Таким образом, вы должны спрашивать не, как использовать три файла для проверки сервера, а как использовать данный сертификат и ключ для аутентификации клиента. Этот поиск может привести вас к ответу и примерам.

Steffen Ullrich 27.10.2018 11:02

@SteffenUllrich, спасибо, что указали мне правильный путь. Как я вижу, нет простого способа сделать это в клиенте okhttp, поэтому мне интересно, возможно ли это вообще?

Choletski 27.10.2018 11:21

У меня нет опыта работы с okhttp, но одно из первых совпадений в поиске похоже на рабочий пример. Он должен иметь сертификат + ключ как pkcs12, но этот может быть создан из сертификата и ключа

Steffen Ullrich 27.10.2018 11:26

Вы решили свою проблему?

Mohamed-Ali Elakhrass 02.04.2019 04:05
0
4
124
0

Другие вопросы по теме