Необходимо подключить 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;
}