Я готовлю библиотеку для приложения 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. Я тупик и понятия не имею как должно быть реализовано. Можете ли вы помочь мне правильно реализовать это?