нужен пример кода для OkHttp3
аюсь закрепить самозаверяющий сертификат моего сервера. Мой OkHttpClient принимает два параметра, первый из них - ssl Socket Factory:
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
// Install the all-trusting trust manager
SSLContext sslContext;
try {
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
FirebaseCrash.report(e);
return null;
}
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
Во-вторых, это пиннер сертификатов:
new CertificatePinner.Builder()
.add("bogus.com", "sha1/BOGUS")
.build()
Примечание: если я не добавляю сертификат, то все работает нормально. Проблема в том, что когда запрос выполняется,CertificatePinner.check () вызывается:
if (pins.isEmpty()) return;
Очевидно, что если я установлю (непустой) certificatePinner, метод на этом не остановится и продолжит работу. Затем он продолжает проверять, что«по крайней мере один из сертификатов, прикрепленных к моему имени хоста, является доверенным сертификатом».
Проблема в том, что я передал пустой массив в getAcceptedIssuers для моего TrustManager - это означает, что самоподписанный сертификат вызовет исключение, так как ему явно не доверяют "getAcceptedIssues". Похоже, невозможно прикрепить сертификат, которому явно не доверяют, в «getAcceptedIssuers».
Есть ли способ обойти это? Это по дизайну?
Вот как я создаю свой OkHttpClient:
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
.certificatePinner(certPinner)
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.build();