Подключитесь к серверу, используя самоподписанный сертификат, используя Android - PullRequest
0 голосов
/ 06 августа 2020

Я готовлю библиотеку для приложения React Native для подключения к какому-либо внешнему серверу. Этот сервер должен использовать самозаверяющий сертификат и зашифрованный ключ для подготовки соединения. Я работал с исходным кодом, набранным на TypeScript, который использует выборку узлов. Однако React Native не поддерживает эту библиотеку и все альтернативы (response-native-fetch, react-native-pinch, reat-native-ssl-pinning, ax ios), что я обнаружил, не сработало для меня, поэтому я решил ввести собственный модуль для Android в Java.

При выборке узла мой код выглядит так:

    const options = {
    cert: "<My self signed certificate content from .crt file>",
    key: "<My encrypted key content from .key file>",
    passphrase: "<Password to this .key>",
    rejectUnauthorized: false,
    keepAlive: false,
    };
    const sslAgent = new https.Agent(options);
    const requestInit = {
        "GET",
        headers: {
            Accept: 'application/json',
        },
        agent: sslAgent
    };
    const response = await fetch("<Https request address>", requestInit);
    console.log(response);

И в моей реализации android:

CertificateFactory cf = CertificateFactory.getInstance("X.509");
        ByteArrayInputStream byteInput = new ByteArrayInputStream("<My self signed certificate content from .crt file>".getBytes());
        InputStream caInput = new BufferedInputStream(byteInput);

        Certificate ca = cf.generateCertificate(caInput);
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);

        ByteArrayInputStream byteKeyInput = new ByteArrayInputStream("<My encrypted key content from .key file>".getBytes());
        InputStream keyInput = new BufferedInputStream(byteKeyInput);
        keyStore.load(keyInput, "<Password to this .key>",.toCharArray());
        keyStore.setCertificateEntry("ca", ca);

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

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

        URL url = new URL("<Https request address>");
        HttpsURLConnection urlConnection =
                (HttpsURLConnection)url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setSSLSocketFactory(context.getSocketFactory());
        if (urlConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            // print result
            System.out.println(response.toString());
        }

Я получаю сообщение об ошибке "Неверная версия хранилища ключей". Мой зашифрованный ключ начинается с отметки:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7523FD34DC781ED5

Итак, я подозреваю, что это тип PKCS1. Я тупик и понятия не имею как должно быть реализовано. Можете ли вы помочь мне правильно реализовать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...