Thanks @Dan Getz, now it works.
1. Solution with SSL context and self-signed certificate:
public static SSLContext getSSLContext() throws Exception {
if (sslContext==null) {
InputStream is = AVApplication.getContext().getResources().openRawResource(R.raw.certificates);
String certificates = Converter.convertStreamToString(is);
String certificateArray[] = certificates.split("-----BEGIN CERTIFICATE-----");
KeyStore ks = KeyStore.getInstance("BKS");
ks.load(null, null);
for (int i = 1; i < certificateArray.length; i++) {
certificateArray[i] = "-----BEGIN CERTIFICATE-----" + certificateArray[i];
InputStream stream = IOUtils.toInputStream(certificateArray[i]);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate ca;
try {
ca = cf.generateCertificate(stream);
} finally {
is.close();
}
ks.setCertificateEntry("av-ca" + i, ca);
}
String algorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
tmf.init(ks);
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
}
return sslContext;
}
Then using the SSL context:
client = okHttpClient.newBuilder()
.sslSocketFactory(getSslContext(context).getSocketFactory())
.build();
2. Solution with fixing a non-root certificate using OkHttp for fingerprints:
CertificatePinner OkHttp (! - ):
CertificatePinner = new CertificatePinner.Builder()
.add(new URL(url).getHost(), "sha256/<certificate1 fingerprint [base64]>")
.add(new URL(url).getHost(), "sha256/<certificate2 fingerprint [base64]>")
.build();
OkHttpClient client;
client = okHttpClient.newBuilder()
.certificatePinner(certificatePinner)
.build();